Skip to content

Commit 3faa38c

Browse files
committed
add support for registering new repo remotely
1 parent 4d6f755 commit 3faa38c

File tree

9 files changed

+79
-66
lines changed

9 files changed

+79
-66
lines changed

src/adapters/controllers/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const {
1212
removeModels,
1313
hotReload,
1414
registerEvents,
15-
invokePorts
15+
invokePorts,
16+
deployModel
1617
} = UseCases
1718

1819
import postModelFactory from './post-model'
@@ -23,6 +24,7 @@ import deleteModelFactory from './delete-model'
2324
import getConfigFactory from './get-config'
2425
import anyInvokePortFactory from './post-invoke-port'
2526
import makeLiveUpdate from './live-update'
27+
import makeLiveRollout from './live-rollout'
2628

2729
function make (useCases, controllerFactory) {
2830
return useCases().map(uc => ({
@@ -42,6 +44,7 @@ export const anyInvokePorts = () => make(invokePorts, anyInvokePortFactory)
4244
export const liveUpdate = () => make(hotReload, makeLiveUpdate)
4345
export const getConfig = () => getConfigFactory(listConfigs())
4446
export const getRoutes = () => getUserRoutes()
47+
export const postEntry = () => makeLiveRollout(deployModel())
4548

4649
export const initCache = () => {
4750
const label = '\ntime to load cache'

src/adapters/controllers/live-rollout.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
* @param {function():string} hash
77
* @returns {import("./http-adapter").httpController}
88
*/
9-
export default function makeLiveRollout (hotDeploy) {
9+
export default function makeLiveRollout (deployModel) {
1010
return async function liveRollout (httpRequest) {
1111
try {
1212
httpRequest.log(liveRollout.name)
1313

14-
const result = await hotDeploy(httpRequest.query.remoteEntry)
14+
const result = await deployModel(httpRequest.body)
1515

1616
console.debug({ fn: liveRollout.name, result })
1717
return {

src/adapters/webassembly/wasm-wrap.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use strict'
22

3-
const exports = require('webpack')
43
const { WasmInterop } = require('./wasm-interop')
54

65
/**@typedef {import("../../domain").ModelSpecification} ModelSpecification */

src/aegis.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const {
2525
patchModels,
2626
postModels,
2727
liveUpdate,
28+
postEntry,
2829
anyInvokePorts
2930
} = adapters.controllers
3031

@@ -124,8 +125,8 @@ const router = {
124125
}
125126
},
126127

127-
adminRoute (controller, adapter) {
128-
const adminPath = `${apiRoot}/config`
128+
adminRoute (controller, adapter, path) {
129+
const adminPath = `${apiRoot}/${path}`
129130
routes.set(adminPath, { get: adapter(controller()) })
130131
}
131132
}
@@ -146,7 +147,8 @@ function makeRoutes () {
146147
router.autoRoutes(endpointPortId, 'patch', anyInvokePorts, http, true)
147148
router.autoRoutes(endpointPortId, 'delete', anyInvokePorts, http, true)
148149
router.autoRoutes(endpointPortId, 'get', anyInvokePorts, http, true)
149-
router.adminRoute(getConfig, http)
150+
router.adminRoute(getConfig, http, 'config')
151+
router.adminRoute(postEntry, http, 'deploy')
150152
router.userRoutes(getRoutes)
151153
console.log(routes)
152154
}
Lines changed: 44 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,51 @@
11
import { importRemoteCache } from '../index.js'
22
import path from 'path'
3+
import { cmd } from '../util/cmd.js'
34

4-
const config = '' // require(path.join(process.cwd(), 'wepack.config.js'))
5-
const webpack = require('webpack')
6-
const fs = require('fs')
7-
8-
//.const compiler = webpack(config)
9-
10-
// `compiler.run()` doesn't support promises yet, only callbacks
11-
async function compile () {
12-
// await new Promise((resolve, reject) => {
13-
// compiler.run((err, res) => {
14-
// if (err) {
15-
// return reject(err)
16-
// }
17-
// resolve(res)
18-
// })
19-
// })
5+
//
6+
async function compileAndReload () {
7+
cmd('yarn build && yarn reload')
208
}
219

22-
export function makeRegisterRemote () {
23-
/**
24-
* Process new remote entry.
25-
* @param {import('../../../webpack/remote-entries-type.js').remoteEntry} remoteEntry
26-
*/
27-
return async function registerRemote (remoteEntry) {
28-
if (!remoteEntry?.name) throw new Error('no remote entry provided')
10+
/**
11+
* Process new remote entry.
12+
* @param {import('../../../webpack/remote-entries-type.js').remoteEntry} remoteEntry
13+
*/
14+
async function registerRemote (remoteEntry) {
15+
if (!remoteEntry?.name) throw new Error('no remote entry provided')
16+
17+
const newFile = remoteEntry.name.concat('.js')
2918

30-
const newFile = remoteEntry.name.concat('.js')
19+
if (fs.existsSync(newFile))
20+
console.log('overritting remote entry file' + newFile)
3121

32-
if (fs.existsSync(newFile))
33-
throw new Error('remote entry file already exists' + newFile)
22+
try {
23+
const fileContents =
24+
`const {importWebAssembly} = require('@module-federation/aegis').adapters.webassembly\n` +
25+
`const ${remoteEntry.name} = [${JSON.stringify(remoteEntry, 2, null) +
26+
`\nimportRemote() { return importWebAssembly(this) }`}]`
3427

35-
try {
36-
fs.writeFileSync(
37-
path.resolve(process.cwd(), 'webpack/remote-entries', newFile),
38-
JSON.stringify(remoteEntry),
39-
{ encoding: 'utf-8' }
40-
)
28+
fs.writeFileSync(
29+
path.resolve(process.cwd(), 'webpack/remote-entries', newFile),
30+
fileContents
31+
)
4132

42-
const indexFile = path.resolve(
43-
process.cwd(),
44-
'webpack/remote-entries',
45-
'index.js'
46-
)
33+
const indexFile = path.resolve(
34+
process.cwd(),
35+
'webpack/remote-entries',
36+
'index.js'
37+
)
4738

48-
const remoteExports = fs.readFileSync(indexFile, { encoding: 'utf-8' })
39+
const remoteExports = fs.readFileSync(indexFile)
4940

50-
fs.writeFileSync(
51-
indexFile,
52-
remoteExports.concat(`export * from './${newFile}'\n`),
53-
{ encoding: 'utf-8' }
54-
)
41+
fs.writeFileSync(
42+
indexFile,
43+
remoteExports.concat(`\nexport from './${newFile}'`)
44+
)
5545

56-
await compile()
57-
} catch (error) {
58-
console.error({ fn: registerRemote.name, error })
59-
}
46+
await compileAndReload()
47+
} catch (error) {
48+
console.error({ fn: registerRemote.name, error })
6049
}
6150
}
6251

@@ -65,7 +54,7 @@ export function makeRegisterRemote () {
6554
* @param {{models:import('../model-factory.js').ModelFactory}} param0
6655
* @returns
6756
*/
68-
export default function makeDeployModel ({ models }) {
57+
export default function makeDeployModel () {
6958
/**
7059
* Handle deployment request.
7160
*
@@ -75,15 +64,15 @@ export default function makeDeployModel ({ models }) {
7564
*
7665
* @param {*} modelName
7766
*/
78-
return function deployModel (modelName) {
79-
if (!modelName) throw new Error('missing modelName')
80-
const modelNameUpper = modelName.toUpperCase()
67+
return async function deployModel (input) {
68+
console.log(input)
69+
await registerRemote(input)
8170

82-
if (models.getModelSpec(modelNameUpper)) return
71+
// if (models.getModelSpec(modelNameUpper)) return
8372

84-
importRemoteCache(modelNameUpper)
73+
// importRemoteCache(modelNameUpper)
8574

86-
if (!models.getModelSpec(modelNameUpper))
87-
throw new Error('model could not be loaded')
75+
// if (!models.getModelSpec(modelNameUpper))
76+
// throw new Error('model could not be loaded')
8877
}
8978
}

src/domain/use-cases/hot-reload.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export default function makeHotReload ({ models, broker } = {}) {
5252

5353
/**
5454
*/
55-
async function hotReload (modelName) {
55+
async function hotReload (remoteEntry) {
5656
if (inProgress) {
5757
return { status: 'reload already in progress' }
5858
}

src/domain/use-cases/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ const findModels = () => make(makeFindModel)
192192
const removeModels = () => make(makeRemoveModel)
193193
const loadModels = () => make(makeLoadModels)
194194
const emitEvents = () => make(makeEmitEvent)
195-
const deployModels = () => make(makeDeployModel)
196195
const invokePorts = () => make(makeInvokePort)
197196
const hotReload = () => [
198197
{
@@ -203,6 +202,8 @@ const hotReload = () => [
203202
})
204203
}
205204
]
205+
const deployModel = () => makeDeployModel()
206+
206207
const listConfigs = () =>
207208
makeListConfig({
208209
models: ModelFactory,
@@ -283,7 +284,7 @@ export const UseCases = {
283284
hotReload,
284285
registerEvents,
285286
emitEvents,
286-
deployModels,
287+
deployModel,
287288
invokePorts
288289
}
289290

@@ -306,7 +307,6 @@ export function UseCaseService (modelName) {
306307
removeModel: makeOne(modelNameUpper, makeRemoveModel),
307308
loadModels: makeOne(modelNameUpper, makeLoadModels),
308309
emitEvent: makeOne(modelNameUpper, makeEmitEvent),
309-
deployModel: makeOne(modelNameUpper, makeDeployModel),
310310
invokePort: makeOne(modelNameUpper, makeInvokePort),
311311
listConfigs: listConfigs()
312312
}

src/domain/util/cmd.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const { exec } = require('child_process')
2+
3+
exports.cmd = function (cmd) {
4+
exec(cmd, (error, stdout, stderr) => {
5+
if (error) {
6+
console.log(`error: ${error.message}`)
7+
return
8+
}
9+
if (stderr) {
10+
console.log(`stderr: ${stderr}`)
11+
return
12+
}
13+
console.log(`stdout: ${stdout}`)
14+
})
15+
}

start.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
# export FORKRUN_ARG=../aegis-app/repo.js
1616

1717
# ./forkrun
18+
cd ../aegis-app
19+
nohup node repo.js &
1820

21+
nohup node repo.js 8001 cache &
22+
23+
cp ../aegis/wasm/build/release.wasm ../aegis-app/dist/main.wasm
1924
yarn link
2025
cd ../aegis-host
2126
yarn link @module-federation/aegis

0 commit comments

Comments
 (0)