@toa.io/boot 1.0.0-alpha.273 → 1.0.0-alpha.277
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/package.json +10 -10
- package/src/atom.js +3 -7
- package/src/atomicity.js +2 -6
- package/src/bindings/broadcast.js +3 -6
- package/src/bindings/constants.js +1 -3
- package/src/bindings/consume.js +5 -8
- package/src/bindings/emit.js +3 -6
- package/src/bindings/factory.js +5 -9
- package/src/bindings/index.js +5 -13
- package/src/bindings/produce.js +12 -14
- package/src/bindings/receive.js +3 -6
- package/src/bridge.js +16 -22
- package/src/call.js +4 -8
- package/src/cascade.js +3 -7
- package/src/component.js +8 -12
- package/src/composition.js +8 -12
- package/src/context.js +3 -7
- package/src/contract.js +5 -8
- package/src/discovery.js +6 -11
- package/src/emission.js +8 -12
- package/src/env.js +4 -5
- package/src/events.js +1 -5
- package/src/exposition.js +3 -7
- package/src/extensions/aspects.js +3 -7
- package/src/extensions/component.js +2 -6
- package/src/extensions/context.js +2 -6
- package/src/extensions/emitter.js +2 -6
- package/src/extensions/index.js +9 -21
- package/src/extensions/instances.js +1 -3
- package/src/extensions/load.js +4 -8
- package/src/extensions/manage.js +2 -6
- package/src/extensions/receiver.js +2 -6
- package/src/extensions/resolve.js +36 -11
- package/src/extensions/storage.js +2 -6
- package/src/extensions/tenants.js +4 -8
- package/src/guards.js +3 -7
- package/src/index.js +27 -44
- package/src/manifest.js +17 -13
- package/src/manifest.test.js +7 -7
- package/src/operation.js +3 -15
- package/src/outbox.js +3 -7
- package/src/rc.js +2 -6
- package/src/receivers.js +10 -13
- package/src/remote.js +15 -10
- package/src/span.js +2 -6
- package/src/storage.js +11 -10
- package/types/index.d.ts +2 -2
- package/types/manifest.d.ts +1 -1
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { instances } = require('./instances')
|
|
1
|
+
import { instances } from './instances.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.core.Context} component
|
|
7
5
|
* @returns {toa.core.Context}
|
|
8
6
|
*/
|
|
9
|
-
const context = (component) => {
|
|
7
|
+
export const context = (component) => {
|
|
10
8
|
let decorated = component
|
|
11
9
|
|
|
12
10
|
for (const factory of Object.values(instances)) {
|
|
@@ -15,5 +13,3 @@ const context = (component) => {
|
|
|
15
13
|
|
|
16
14
|
return decorated
|
|
17
15
|
}
|
|
18
|
-
|
|
19
|
-
exports.context = context
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { instances } = require('./instances')
|
|
1
|
+
import { instances } from './instances.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.core.bindings.Emitter} emitter
|
|
@@ -8,7 +6,7 @@ const { instances } = require('./instances')
|
|
|
8
6
|
* @param {toa.core.Locator} locator
|
|
9
7
|
* @returns {toa.core.bindings.Emitter}
|
|
10
8
|
*/
|
|
11
|
-
const emitter = (emitter, label, locator) => {
|
|
9
|
+
export const emitter = (emitter, label, locator) => {
|
|
12
10
|
let decorated = emitter
|
|
13
11
|
|
|
14
12
|
for (const factory of Object.values(instances)) {
|
|
@@ -17,5 +15,3 @@ const emitter = (emitter, label, locator) => {
|
|
|
17
15
|
|
|
18
16
|
return decorated
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
exports.emitter = emitter
|
package/src/extensions/index.js
CHANGED
|
@@ -1,21 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const { storage } = require('./storage')
|
|
11
|
-
const { tenants } = require('./tenants')
|
|
12
|
-
|
|
13
|
-
exports.aspects = aspects
|
|
14
|
-
exports.component = component
|
|
15
|
-
exports.context = context
|
|
16
|
-
exports.emitter = emitter
|
|
17
|
-
exports.load = load
|
|
18
|
-
exports.manage = manage
|
|
19
|
-
exports.receiver = receiver
|
|
20
|
-
exports.storage = storage
|
|
21
|
-
exports.tenants = tenants
|
|
1
|
+
export { aspects } from './aspects.js'
|
|
2
|
+
export { component } from './component.js'
|
|
3
|
+
export { context } from './context.js'
|
|
4
|
+
export { emitter } from './emitter.js'
|
|
5
|
+
export { load } from './load.js'
|
|
6
|
+
export { manage } from './manage.js'
|
|
7
|
+
export { receiver } from './receiver.js'
|
|
8
|
+
export { storage } from './storage.js'
|
|
9
|
+
export { tenants } from './tenants.js'
|
package/src/extensions/load.js
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { resolve } = require('./resolve')
|
|
1
|
+
import { resolve } from './resolve.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.norm.Component} manifest
|
|
7
5
|
*/
|
|
8
|
-
const load = (manifest) => {
|
|
6
|
+
export const load = async (manifest) => {
|
|
9
7
|
if (manifest.extensions === undefined)
|
|
10
8
|
return
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
resolve(name, manifest.path)
|
|
10
|
+
await Promise.all(Object.keys(manifest.extensions)
|
|
11
|
+
.map(async (name) => await resolve(name, manifest.path)))
|
|
14
12
|
}
|
|
15
|
-
|
|
16
|
-
exports.load = load
|
package/src/extensions/manage.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { instances } = require('./instances')
|
|
1
|
+
import { instances } from './instances.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.core.Connector} composition
|
|
7
5
|
* @returns {toa.core.Connector}
|
|
8
6
|
*/
|
|
9
|
-
const manage = (composition) => {
|
|
7
|
+
export const manage = (composition) => {
|
|
10
8
|
let managed = composition
|
|
11
9
|
|
|
12
10
|
for (const factory of Object.values(instances)) {
|
|
@@ -16,5 +14,3 @@ const manage = (composition) => {
|
|
|
16
14
|
|
|
17
15
|
return managed
|
|
18
16
|
}
|
|
19
|
-
|
|
20
|
-
exports.manage = manage
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { instances } = require('./instances')
|
|
1
|
+
import { instances } from './instances.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.core.Receiver} receiver
|
|
7
5
|
* @param {toa.core.Locator} locator
|
|
8
6
|
* @returns {toa.core.Receiver}
|
|
9
7
|
*/
|
|
10
|
-
const receiver = (receiver, locator) => {
|
|
8
|
+
export const receiver = (receiver, locator) => {
|
|
11
9
|
let decorated = receiver
|
|
12
10
|
|
|
13
11
|
for (const factory of Object.values(instances)) {
|
|
@@ -17,5 +15,3 @@ const receiver = (receiver, locator) => {
|
|
|
17
15
|
|
|
18
16
|
return decorated
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
exports.receiver = receiver
|
|
@@ -1,27 +1,52 @@
|
|
|
1
|
-
|
|
1
|
+
import { createRequire } from 'node:module'
|
|
2
|
+
import { pathToFileURL } from 'node:url'
|
|
3
|
+
import { find } from '@toa.io/generic'
|
|
4
|
+
import * as boot from '../../src/index.js'
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
const boot = require('../..')
|
|
6
|
+
import { instances } from './instances.js'
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
// what `find` returns is a package directory, and a module is loaded by file
|
|
9
|
+
const require = createRequire(import.meta.url)
|
|
10
|
+
|
|
11
|
+
// an extension is loaded once, and what is remembered while it loads is the
|
|
12
|
+
// promise, so two components cannot each make a factory
|
|
13
|
+
const loading = {}
|
|
7
14
|
|
|
8
15
|
/**
|
|
16
|
+
* Loads an extension and remembers its factory.
|
|
17
|
+
*
|
|
9
18
|
* @param {string} reference
|
|
10
19
|
* @param {string} base
|
|
11
|
-
* @returns {toa.core.extensions.Factory}
|
|
20
|
+
* @returns {Promise<toa.core.extensions.Factory>}
|
|
12
21
|
*/
|
|
13
|
-
const resolve = (reference, base = process.cwd()) => {
|
|
22
|
+
export const resolve = async (reference, base = process.cwd()) => {
|
|
14
23
|
const path = find(reference, base)
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
loading[path] ??= create(path)
|
|
26
|
+
instances[path] = await loading[path]
|
|
17
27
|
|
|
18
28
|
return instances[path]
|
|
19
29
|
}
|
|
20
30
|
|
|
21
|
-
|
|
22
|
-
|
|
31
|
+
/**
|
|
32
|
+
* The factory of an extension already loaded. Everything that decorates what a
|
|
33
|
+
* component is made of runs after its extensions are loaded, and stays
|
|
34
|
+
* synchronous.
|
|
35
|
+
*
|
|
36
|
+
* @param {string} reference
|
|
37
|
+
* @param {string} base
|
|
38
|
+
* @returns {toa.core.extensions.Factory}
|
|
39
|
+
*/
|
|
40
|
+
export const instance = (reference, base = process.cwd()) => {
|
|
41
|
+
const factory = instances[find(reference, base)]
|
|
42
|
+
|
|
43
|
+
if (factory === undefined) throw new Error(`Extension '${reference}' is not loaded`)
|
|
44
|
+
|
|
45
|
+
return factory
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const create = async (path) => {
|
|
49
|
+
const { Factory } = await import(pathToFileURL(require.resolve(path)).href)
|
|
23
50
|
|
|
24
51
|
return new Factory(boot)
|
|
25
52
|
}
|
|
26
|
-
|
|
27
|
-
exports.resolve = resolve
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { instances } = require('./instances')
|
|
1
|
+
import { instances } from './instances.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.core.Storage} storage
|
|
7
5
|
* @returns {toa.core.Storage}
|
|
8
6
|
*/
|
|
9
|
-
const storage = (storage) => {
|
|
7
|
+
export const storage = (storage) => {
|
|
10
8
|
let decorated = storage
|
|
11
9
|
|
|
12
10
|
for (const factory of Object.values(instances)) {
|
|
@@ -15,5 +13,3 @@ const storage = (storage) => {
|
|
|
15
13
|
|
|
16
14
|
return decorated
|
|
17
15
|
}
|
|
18
|
-
|
|
19
|
-
exports.storage = storage
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { resolve } = require('./resolve')
|
|
1
|
+
import { resolve } from './resolve.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @param {toa.norm.Component} manifest
|
|
7
5
|
* @returns {toa.core.Connector[]}
|
|
8
6
|
*/
|
|
9
|
-
const tenants = (manifest) => {
|
|
7
|
+
export const tenants = async (manifest) => {
|
|
10
8
|
const tenants = []
|
|
11
9
|
|
|
12
10
|
if (manifest.extensions === undefined) return tenants
|
|
13
11
|
|
|
14
12
|
for (const [name, declaration] of Object.entries(manifest.extensions)) {
|
|
15
|
-
const factory = resolve(name, manifest.path)
|
|
13
|
+
const factory = await resolve(name, manifest.path)
|
|
16
14
|
|
|
17
15
|
if (factory.tenant === undefined) continue
|
|
18
16
|
|
|
19
|
-
const tenant = factory.tenant(manifest.locator, declaration, manifest)
|
|
17
|
+
const tenant = await factory.tenant(manifest.locator, declaration, manifest)
|
|
20
18
|
|
|
21
19
|
tenants.push(tenant)
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
return tenants
|
|
25
23
|
}
|
|
26
|
-
|
|
27
|
-
exports.tenants = tenants
|
package/src/guards.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { Guard } from '@toa.io/core'
|
|
2
|
+
import * as boot from './index.js'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
const boot = require('./index')
|
|
5
|
-
|
|
6
|
-
async function guards(manifest, context) {
|
|
4
|
+
export async function guards(manifest, context) {
|
|
7
5
|
if (manifest.guards === undefined)
|
|
8
6
|
return
|
|
9
7
|
|
|
@@ -19,5 +17,3 @@ async function guards(manifest, context) {
|
|
|
19
17
|
async function load(guard, name, context) {
|
|
20
18
|
return await boot.bridge.guard(guard.bridge, guard.path, name, context)
|
|
21
19
|
}
|
|
22
|
-
|
|
23
|
-
exports.guards = guards
|
package/src/index.js
CHANGED
|
@@ -1,48 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
// the environment is read at module scope elsewhere, so it is loaded first
|
|
2
|
+
import './env.js'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
import * as bindings from './bindings/index.js'
|
|
5
|
+
import * as bridge from './bridge.js'
|
|
6
|
+
import * as contract from './contract.js'
|
|
7
|
+
import * as discovery from './discovery.js'
|
|
8
|
+
import * as extensions from './extensions/index.js'
|
|
4
9
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
import { call } from './call.js'
|
|
11
|
+
import { cascade } from './cascade.js'
|
|
12
|
+
import { component } from './component.js'
|
|
13
|
+
import { composition } from './composition.js'
|
|
14
|
+
import { context } from './context.js'
|
|
15
|
+
import { emission } from './emission.js'
|
|
16
|
+
import { events } from './events.js'
|
|
17
|
+
import { outbox } from './outbox.js'
|
|
18
|
+
import { atomicity } from './atomicity.js'
|
|
19
|
+
import { atom } from './atom.js'
|
|
20
|
+
import { exposition } from './exposition.js'
|
|
21
|
+
import { manifest } from './manifest.js'
|
|
22
|
+
import { operation } from './operation.js'
|
|
23
|
+
import { receivers, receive } from './receivers.js'
|
|
24
|
+
import { remote } from './remote.js'
|
|
25
|
+
import { storage } from './storage.js'
|
|
26
|
+
import { guards } from './guards.js'
|
|
27
|
+
import { rc } from './rc.js'
|
|
23
28
|
|
|
24
|
-
|
|
25
|
-
exports.bridge = require('./bridge')
|
|
26
|
-
exports.contract = require('./contract')
|
|
27
|
-
exports.discovery = require('./discovery')
|
|
28
|
-
exports.extensions = require('./extensions')
|
|
29
|
+
export { call, cascade, component, composition, context, emission, events, outbox, atomicity, atom, exposition, manifest, operation, receivers, receive, remote, storage, guards, rc }
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
exports.cascade = cascade
|
|
32
|
-
exports.component = component
|
|
33
|
-
exports.composition = composition
|
|
34
|
-
exports.context = context
|
|
35
|
-
exports.emission = emission
|
|
36
|
-
exports.events = events
|
|
37
|
-
exports.outbox = outbox
|
|
38
|
-
exports.atomicity = atomicity
|
|
39
|
-
exports.atom = atom
|
|
40
|
-
exports.exposition = exposition
|
|
41
|
-
exports.manifest = manifest
|
|
42
|
-
exports.operation = operation
|
|
43
|
-
exports.receivers = receivers
|
|
44
|
-
exports.receive = receive
|
|
45
|
-
exports.remote = remote
|
|
46
|
-
exports.storage = storage
|
|
47
|
-
exports.guards = guards
|
|
48
|
-
exports.rc = rc
|
|
31
|
+
export { bindings, bridge, contract, discovery, extensions }
|
package/src/manifest.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import clone from 'clone-deep'
|
|
2
|
+
import { basename } from 'node:path'
|
|
3
|
+
import { merge } from '@toa.io/generic'
|
|
4
|
+
import { component as load } from '@toa.io/norm'
|
|
5
|
+
import { Locator } from '@toa.io/core'
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
const { basename } = require('node:path')
|
|
5
|
-
const { merge } = require('@toa.io/generic')
|
|
6
|
-
const { component: load } = require('@toa.io/norm')
|
|
7
|
-
const { Locator } = require('@toa.io/core')
|
|
7
|
+
import { span } from './span.js'
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const manifest = async (path, options = {}) => {
|
|
9
|
+
export const manifest = async (path, options = {}) => {
|
|
12
10
|
options = merge(clone(options), DEFAULTS)
|
|
13
11
|
|
|
14
12
|
const manifest = await span({ name: `manifest ${basename(path)}`, attributes: { path } },
|
|
@@ -21,8 +19,16 @@ const manifest = async (path, options = {}) => {
|
|
|
21
19
|
}
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
let asyncBinding
|
|
23
|
+
|
|
24
|
+
for (const binding of options.bindings) {
|
|
25
|
+
const { properties } = await import(binding)
|
|
26
|
+
|
|
27
|
+
if (properties?.async === true) {
|
|
28
|
+
asyncBinding = binding
|
|
29
|
+
break
|
|
30
|
+
}
|
|
31
|
+
}
|
|
26
32
|
|
|
27
33
|
if (asyncBinding === undefined) throw new Error('Bindings override must contain at least one async binding')
|
|
28
34
|
|
|
@@ -53,5 +59,3 @@ const manifest = async (path, options = {}) => {
|
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
const DEFAULTS = {}
|
|
56
|
-
|
|
57
|
-
exports.manifest = manifest
|
package/src/manifest.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { it, mock } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
import { generate } from 'randomstring'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
})
|
|
6
|
+
mock.module('@toa.io/norm', { namedExports: { component: () => mockComponent() } })
|
|
7
|
+
|
|
8
|
+
const { manifest } = await import('./manifest.js')
|
|
8
9
|
|
|
9
|
-
const { manifest } = require('./manifest')
|
|
10
10
|
|
|
11
11
|
const path = generate()
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ it('should not modify options', async () => {
|
|
|
15
15
|
|
|
16
16
|
await manifest(path, options)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
assert.deepStrictEqual(options.extensions.length, 2)
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
function mockComponent () {
|
package/src/operation.js
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { Transition, Observation, Assignment, Operation, Query, Effect, Unmanaged } from '@toa.io/core'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Transition,
|
|
5
|
-
Observation,
|
|
6
|
-
Assignment,
|
|
7
|
-
Operation,
|
|
8
|
-
Query,
|
|
9
|
-
Effect,
|
|
10
|
-
Unmanaged
|
|
11
|
-
} = require('@toa.io/core')
|
|
3
|
+
import * as boot from './index.js'
|
|
12
4
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async function operation (manifest, endpoint, definition, context, scope, preflight) {
|
|
5
|
+
export async function operation (manifest, endpoint, definition, context, scope, preflight) {
|
|
16
6
|
const cascade = await boot.cascade(manifest, endpoint, definition, context, preflight)
|
|
17
7
|
const reply = boot.contract.reply(definition.output, definition.error)
|
|
18
8
|
const input = definition.input
|
|
@@ -36,5 +26,3 @@ const TYPES = {
|
|
|
36
26
|
effect: Effect,
|
|
37
27
|
unmanaged: Unmanaged
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
exports.operation = operation
|
package/src/outbox.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { Outbox } from '@toa.io/core'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const boot = require('./index')
|
|
3
|
+
import * as boot from './index.js'
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* A component with no declared events has nothing to publish and therefore no outbox — the
|
|
@@ -12,10 +10,8 @@ const boot = require('./index')
|
|
|
12
10
|
* @param {toa.core.Storage} [storage]
|
|
13
11
|
* @param {toa.core.Emission} [emission]
|
|
14
12
|
*/
|
|
15
|
-
const outbox = (manifest, storage, emission) => {
|
|
13
|
+
export const outbox = (manifest, storage, emission) => {
|
|
16
14
|
if (emission === undefined) return
|
|
17
15
|
|
|
18
16
|
return new Outbox(emission, storage, boot.atomicity(manifest.locator.id), {})
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
exports.outbox = outbox
|
package/src/rc.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import * as boot from './index.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
async function rc (manifest, context) {
|
|
3
|
+
export async function rc (manifest, context) {
|
|
6
4
|
return boot.bridge.rc(manifest.bridge, manifest.path, context)
|
|
7
5
|
}
|
|
8
|
-
|
|
9
|
-
exports.rc = rc
|
package/src/receivers.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { Receiver, Locator } from '@toa.io/core'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import * as boot from './index.js'
|
|
4
|
+
import * as extensions from './extensions/index.js'
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
-
const extensions = require('./extensions')
|
|
7
|
-
|
|
8
|
-
const receivers = async (manifest, component) => {
|
|
6
|
+
export const receivers = async (manifest, component) => {
|
|
9
7
|
if (manifest.receivers === undefined) return []
|
|
10
8
|
|
|
11
9
|
const receivers = []
|
|
@@ -20,12 +18,14 @@ const receivers = async (manifest, component) => {
|
|
|
20
18
|
// the origin of the calls this receiver makes to its local operation
|
|
21
19
|
const origin = { namespace: source.namespace, component: source.name, event }
|
|
22
20
|
|
|
23
|
-
const bridge = definition.bridge !== undefined
|
|
21
|
+
const bridge = definition.bridge !== undefined
|
|
22
|
+
? await boot.bridge.receiver(definition.bridge, manifest.path, label)
|
|
23
|
+
: undefined
|
|
24
24
|
const receiver = new Receiver({ ...definition, label, destination, origin }, local, bridge)
|
|
25
25
|
const decorator = extensions.receiver(receiver, manifest.locator)
|
|
26
26
|
|
|
27
27
|
const transport = definition.binding ?? await resolveBinding(locator, label)
|
|
28
|
-
const binding = boot.bindings.receive(transport, source, label, manifest.locator.id, decorator)
|
|
28
|
+
const binding = await boot.bindings.receive(transport, source, label, manifest.locator.id, decorator)
|
|
29
29
|
|
|
30
30
|
binding.depends(component)
|
|
31
31
|
receivers.push(binding)
|
|
@@ -34,7 +34,7 @@ const receivers = async (manifest, component) => {
|
|
|
34
34
|
return receivers
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
async function receive (label, group, callback) {
|
|
37
|
+
export async function receive (label, group, callback) {
|
|
38
38
|
if (callback === undefined) {
|
|
39
39
|
callback = group
|
|
40
40
|
group = undefined
|
|
@@ -43,7 +43,7 @@ async function receive (label, group, callback) {
|
|
|
43
43
|
const locator = Locator.parse(label)
|
|
44
44
|
const transport = await resolveBinding(locator, label)
|
|
45
45
|
|
|
46
|
-
return boot.bindings.receive(transport, locator, label, group, callback)
|
|
46
|
+
return await boot.bindings.receive(transport, locator, label, group, callback)
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -58,6 +58,3 @@ async function resolveBinding (locator, label) {
|
|
|
58
58
|
|
|
59
59
|
return events[event].binding
|
|
60
60
|
}
|
|
61
|
-
|
|
62
|
-
exports.receivers = receivers
|
|
63
|
-
exports.receive = receive
|
package/src/remote.js
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import { console } from 'openspan'
|
|
2
|
+
import { Remote } from '@toa.io/core'
|
|
3
|
+
import { remap } from '@toa.io/generic'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
const { Remote } = require('@toa.io/core')
|
|
5
|
-
const { remap } = require('@toa.io/generic')
|
|
6
|
-
|
|
7
|
-
const boot = require('./index')
|
|
5
|
+
import * as boot from './index.js'
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* @param {toa.core.Locator} locator
|
|
11
9
|
* @param {toa.core.Source} [source] the origin stamped on every call made through this remote
|
|
12
10
|
* @param {toa.norm.Component} [manifest] skips discovery when the manifest is already known
|
|
13
11
|
*/
|
|
14
|
-
const remote = async (locator, source, manifest) => {
|
|
12
|
+
export const remote = async (locator, source, manifest) => {
|
|
15
13
|
let discovery
|
|
16
14
|
|
|
17
15
|
if (manifest === undefined) {
|
|
@@ -21,10 +19,11 @@ const remote = async (locator, source, manifest) => {
|
|
|
21
19
|
manifest = await discovery.lookup(locator)
|
|
22
20
|
}
|
|
23
21
|
|
|
22
|
+
// a call binds its consumers, which are loaded rather than required
|
|
24
23
|
const calls = manifest.operations === undefined
|
|
25
24
|
? {}
|
|
26
|
-
: remap(manifest.operations,
|
|
27
|
-
(definition, endpoint) => boot.call(locator, endpoint, definition, manifest.entity, source))
|
|
25
|
+
: await settle(remap(manifest.operations,
|
|
26
|
+
(definition, endpoint) => boot.call(locator, endpoint, definition, manifest.entity, source)))
|
|
28
27
|
|
|
29
28
|
const remote = new Remote(locator, calls)
|
|
30
29
|
|
|
@@ -35,4 +34,10 @@ const remote = async (locator, source, manifest) => {
|
|
|
35
34
|
return remote
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
/** An object whose values are promises, as an object of what they resolve to. */
|
|
38
|
+
async function settle (object) {
|
|
39
|
+
const entries = Object.entries(object)
|
|
40
|
+
const values = await Promise.all(entries.map(([, promise]) => promise))
|
|
41
|
+
|
|
42
|
+
return Object.fromEntries(entries.map(([key], index) => [key, values[index]]))
|
|
43
|
+
}
|
package/src/span.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { console, traces } = require('openspan')
|
|
1
|
+
import { console, traces } from 'openspan'
|
|
4
2
|
|
|
5
3
|
const enabled = process.env.TOA_BOOT_TRACE === '1'
|
|
6
4
|
|
|
@@ -16,6 +14,4 @@ if (enabled) traces({ exporters: { console: {} } })
|
|
|
16
14
|
* @param {() => Promise<any>} task
|
|
17
15
|
* @returns {Promise<any>}
|
|
18
16
|
*/
|
|
19
|
-
const span = async (options, task) => enabled ? console.span(options, task) : task()
|
|
20
|
-
|
|
21
|
-
exports.span = span
|
|
17
|
+
export const span = async (options, task) => enabled ? console.span(options, task) : task()
|