@toa.io/extensions.exposition 0.22.1 → 0.24.0-alpha.0
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/components/identity.basic/source/authenticate.ts +3 -2
- package/components/identity.basic/source/transit.ts +4 -3
- package/components/octets.storage/manifest.toa.yaml +26 -0
- package/components/octets.storage/operations/delete.js +7 -0
- package/components/octets.storage/operations/fetch.js +46 -0
- package/components/octets.storage/operations/get.js +7 -0
- package/components/octets.storage/operations/list.js +7 -0
- package/components/octets.storage/operations/permute.js +7 -0
- package/components/octets.storage/operations/store.js +11 -0
- package/cucumber.js +0 -1
- package/documentation/access.md +2 -3
- package/documentation/cache.md +42 -0
- package/documentation/octets.md +196 -0
- package/documentation/protocol.md +49 -5
- package/documentation/tree.md +1 -5
- package/features/access.feature +1 -0
- package/features/cache.feature +160 -0
- package/features/errors.feature +18 -0
- package/features/identity.basic.feature +2 -0
- package/features/octets.feature +295 -0
- package/features/octets.workflows.feature +114 -0
- package/features/routes.feature +40 -0
- package/features/steps/HTTP.ts +54 -6
- package/features/steps/Parameters.ts +5 -2
- package/features/steps/Workspace.ts +8 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +15 -0
- package/features/steps/components/octets.tester/operations/bar.js +12 -0
- package/features/steps/components/octets.tester/operations/baz.js +11 -0
- package/features/steps/components/octets.tester/operations/diversify.js +14 -0
- package/features/steps/components/octets.tester/operations/err.js +16 -0
- package/features/steps/components/octets.tester/operations/foo.js +7 -0
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/pots/manifest.toa.yaml +1 -1
- package/features/streams.feature +5 -1
- package/package.json +16 -9
- package/readme.md +8 -5
- package/schemas/octets/context.cos.yaml +1 -0
- package/schemas/octets/delete.cos.yaml +1 -0
- package/schemas/octets/fetch.cos.yaml +3 -0
- package/schemas/octets/list.cos.yaml +1 -0
- package/schemas/octets/permute.cos.yaml +1 -0
- package/schemas/octets/store.cos.yaml +3 -0
- package/source/Gateway.ts +9 -4
- package/source/HTTP/Server.fixtures.ts +2 -6
- package/source/HTTP/Server.test.ts +9 -31
- package/source/HTTP/Server.ts +55 -28
- package/source/HTTP/exceptions.ts +2 -12
- package/source/HTTP/formats/index.ts +7 -4
- package/source/HTTP/formats/json.ts +3 -0
- package/source/HTTP/formats/msgpack.ts +3 -0
- package/source/HTTP/formats/text.ts +3 -0
- package/source/HTTP/formats/yaml.ts +3 -0
- package/source/HTTP/messages.test.ts +3 -49
- package/source/HTTP/messages.ts +60 -35
- package/source/RTD/Route.ts +1 -1
- package/source/RTD/segment.ts +2 -1
- package/source/RTD/syntax/parse.ts +2 -1
- package/source/Remotes.ts +8 -0
- package/source/Tenant.ts +5 -0
- package/source/directives/auth/Family.ts +26 -22
- package/source/directives/auth/Rule.ts +1 -1
- package/source/directives/cache/Control.ts +59 -0
- package/source/directives/cache/Exact.ts +7 -0
- package/source/directives/cache/Family.ts +36 -0
- package/source/directives/cache/index.ts +3 -0
- package/source/directives/cache/types.ts +9 -0
- package/source/directives/index.ts +3 -1
- package/source/directives/octets/Context.ts +18 -0
- package/source/directives/octets/Delete.ts +32 -0
- package/source/directives/octets/Family.ts +68 -0
- package/source/directives/octets/Fetch.ts +85 -0
- package/source/directives/octets/List.ts +32 -0
- package/source/directives/octets/Permute.ts +37 -0
- package/source/directives/octets/Store.ts +158 -0
- package/source/directives/octets/index.ts +3 -0
- package/source/directives/octets/schemas.ts +12 -0
- package/source/directives/octets/types.ts +13 -0
- package/transpiled/Annotation.d.ts +7 -0
- package/transpiled/Annotation.js +3 -0
- package/transpiled/Annotation.js.map +1 -0
- package/transpiled/Branch.d.ts +7 -0
- package/transpiled/Branch.js +3 -0
- package/transpiled/Branch.js.map +1 -0
- package/transpiled/Composition.d.ts +14 -0
- package/transpiled/Composition.js +43 -0
- package/transpiled/Composition.js.map +1 -0
- package/transpiled/Context.d.ts +5 -0
- package/transpiled/Context.js +3 -0
- package/transpiled/Context.js.map +1 -0
- package/transpiled/Directive.d.ts +32 -0
- package/transpiled/Directive.js +76 -0
- package/transpiled/Directive.js.map +1 -0
- package/transpiled/Endpoint.d.ts +20 -0
- package/transpiled/Endpoint.js +45 -0
- package/transpiled/Endpoint.js.map +1 -0
- package/transpiled/Factory.d.ts +10 -0
- package/transpiled/Factory.js +66 -0
- package/transpiled/Factory.js.map +1 -0
- package/transpiled/Gateway.d.ts +19 -0
- package/transpiled/Gateway.js +92 -0
- package/transpiled/Gateway.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +22 -0
- package/transpiled/HTTP/Server.fixtures.d.ts +11 -0
- package/transpiled/HTTP/Server.fixtures.js +32 -0
- package/transpiled/HTTP/Server.fixtures.js.map +1 -0
- package/transpiled/HTTP/Server.js +131 -0
- package/transpiled/HTTP/Server.js.map +1 -0
- package/transpiled/HTTP/exceptions.d.ts +34 -0
- package/transpiled/HTTP/exceptions.js +71 -0
- package/transpiled/HTTP/exceptions.js.map +1 -0
- package/transpiled/HTTP/formats/index.d.ts +10 -0
- package/transpiled/HTTP/formats/index.js +38 -0
- package/transpiled/HTTP/formats/index.js.map +1 -0
- package/transpiled/HTTP/formats/json.d.ts +6 -0
- package/transpiled/HTTP/formats/json.js +17 -0
- package/transpiled/HTTP/formats/json.js.map +1 -0
- package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
- package/transpiled/HTTP/formats/msgpack.js +38 -0
- package/transpiled/HTTP/formats/msgpack.js.map +1 -0
- package/transpiled/HTTP/formats/text.d.ts +6 -0
- package/transpiled/HTTP/formats/text.js +15 -0
- package/transpiled/HTTP/formats/text.js.map +1 -0
- package/transpiled/HTTP/formats/yaml.d.ts +6 -0
- package/transpiled/HTTP/formats/yaml.js +41 -0
- package/transpiled/HTTP/formats/yaml.js.map +1 -0
- package/transpiled/HTTP/index.d.ts +3 -0
- package/transpiled/HTTP/index.js +20 -0
- package/transpiled/HTTP/index.js.map +1 -0
- package/transpiled/HTTP/messages.d.ts +28 -0
- package/transpiled/HTTP/messages.js +70 -0
- package/transpiled/HTTP/messages.js.map +1 -0
- package/transpiled/Mapping.d.ts +8 -0
- package/transpiled/Mapping.js +38 -0
- package/transpiled/Mapping.js.map +1 -0
- package/transpiled/Query.d.ts +13 -0
- package/transpiled/Query.js +107 -0
- package/transpiled/Query.js.map +1 -0
- package/transpiled/RTD/Context.d.ts +11 -0
- package/transpiled/RTD/Context.js +3 -0
- package/transpiled/RTD/Context.js.map +1 -0
- package/transpiled/RTD/Directives.d.ts +7 -0
- package/transpiled/RTD/Directives.js +3 -0
- package/transpiled/RTD/Directives.js.map +1 -0
- package/transpiled/RTD/Endpoint.d.ts +9 -0
- package/transpiled/RTD/Endpoint.js +3 -0
- package/transpiled/RTD/Endpoint.js.map +1 -0
- package/transpiled/RTD/Match.d.ts +11 -0
- package/transpiled/RTD/Match.js +3 -0
- package/transpiled/RTD/Match.js.map +1 -0
- package/transpiled/RTD/Method.d.ts +9 -0
- package/transpiled/RTD/Method.js +16 -0
- package/transpiled/RTD/Method.js.map +1 -0
- package/transpiled/RTD/Node.d.ts +21 -0
- package/transpiled/RTD/Node.js +61 -0
- package/transpiled/RTD/Node.js.map +1 -0
- package/transpiled/RTD/Route.d.ts +14 -0
- package/transpiled/RTD/Route.js +49 -0
- package/transpiled/RTD/Route.js.map +1 -0
- package/transpiled/RTD/Tree.d.ts +14 -0
- package/transpiled/RTD/Tree.js +40 -0
- package/transpiled/RTD/Tree.js.map +1 -0
- package/transpiled/RTD/factory.d.ts +6 -0
- package/transpiled/RTD/factory.js +36 -0
- package/transpiled/RTD/factory.js.map +1 -0
- package/transpiled/RTD/index.d.ts +8 -0
- package/transpiled/RTD/index.js +38 -0
- package/transpiled/RTD/index.js.map +1 -0
- package/transpiled/RTD/segment.d.ts +8 -0
- package/transpiled/RTD/segment.js +25 -0
- package/transpiled/RTD/segment.js.map +1 -0
- package/transpiled/RTD/syntax/index.d.ts +2 -0
- package/transpiled/RTD/syntax/index.js +19 -0
- package/transpiled/RTD/syntax/index.js.map +1 -0
- package/transpiled/RTD/syntax/parse.d.ts +4 -0
- package/transpiled/RTD/syntax/parse.js +128 -0
- package/transpiled/RTD/syntax/parse.js.map +1 -0
- package/transpiled/RTD/syntax/types.d.ts +41 -0
- package/transpiled/RTD/syntax/types.js +5 -0
- package/transpiled/RTD/syntax/types.js.map +1 -0
- package/transpiled/Remotes.d.ts +9 -0
- package/transpiled/Remotes.js +25 -0
- package/transpiled/Remotes.js.map +1 -0
- package/transpiled/Tenant.d.ts +13 -0
- package/transpiled/Tenant.js +34 -0
- package/transpiled/Tenant.js.map +1 -0
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +67 -0
- package/transpiled/deployment.js.map +1 -0
- package/transpiled/directives/auth/Anonymous.d.ts +6 -0
- package/transpiled/directives/auth/Anonymous.js +17 -0
- package/transpiled/directives/auth/Anonymous.js.map +1 -0
- package/transpiled/directives/auth/Echo.d.ts +6 -0
- package/transpiled/directives/auth/Echo.js +13 -0
- package/transpiled/directives/auth/Echo.js.map +1 -0
- package/transpiled/directives/auth/Family.d.ts +20 -0
- package/transpiled/directives/auth/Family.js +118 -0
- package/transpiled/directives/auth/Family.js.map +1 -0
- package/transpiled/directives/auth/Id.d.ts +7 -0
- package/transpiled/directives/auth/Id.js +17 -0
- package/transpiled/directives/auth/Id.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +10 -0
- package/transpiled/directives/auth/Incept.js +58 -0
- package/transpiled/directives/auth/Incept.js.map +1 -0
- package/transpiled/directives/auth/Role.d.ts +11 -0
- package/transpiled/directives/auth/Role.js +44 -0
- package/transpiled/directives/auth/Role.js.map +1 -0
- package/transpiled/directives/auth/Rule.d.ts +9 -0
- package/transpiled/directives/auth/Rule.js +22 -0
- package/transpiled/directives/auth/Rule.js.map +1 -0
- package/transpiled/directives/auth/Scheme.d.ts +7 -0
- package/transpiled/directives/auth/Scheme.js +47 -0
- package/transpiled/directives/auth/Scheme.js.map +1 -0
- package/transpiled/directives/auth/index.d.ts +2 -0
- package/transpiled/directives/auth/index.js +7 -0
- package/transpiled/directives/auth/index.js.map +1 -0
- package/transpiled/directives/auth/schemes.d.ts +3 -0
- package/transpiled/directives/auth/schemes.js +9 -0
- package/transpiled/directives/auth/schemes.js.map +1 -0
- package/transpiled/directives/auth/split.d.ts +2 -0
- package/transpiled/directives/auth/split.js +38 -0
- package/transpiled/directives/auth/split.js.map +1 -0
- package/transpiled/directives/auth/types.d.ts +31 -0
- package/transpiled/directives/auth/types.js +3 -0
- package/transpiled/directives/auth/types.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +9 -0
- package/transpiled/directives/cache/Control.js +42 -0
- package/transpiled/directives/cache/Control.js.map +1 -0
- package/transpiled/directives/cache/Exact.d.ts +4 -0
- package/transpiled/directives/cache/Exact.js +11 -0
- package/transpiled/directives/cache/Exact.js.map +1 -0
- package/transpiled/directives/cache/Family.d.ts +12 -0
- package/transpiled/directives/cache/Family.js +26 -0
- package/transpiled/directives/cache/Family.js.map +1 -0
- package/transpiled/directives/cache/index.d.ts +2 -0
- package/transpiled/directives/cache/index.js +7 -0
- package/transpiled/directives/cache/index.js.map +1 -0
- package/transpiled/directives/cache/types.d.ts +7 -0
- package/transpiled/directives/cache/types.js +3 -0
- package/transpiled/directives/cache/types.js.map +1 -0
- package/transpiled/directives/dev/Family.d.ts +10 -0
- package/transpiled/directives/dev/Family.js +27 -0
- package/transpiled/directives/dev/Family.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +7 -0
- package/transpiled/directives/dev/Stub.js +14 -0
- package/transpiled/directives/dev/Stub.js.map +1 -0
- package/transpiled/directives/dev/Throw.d.ts +7 -0
- package/transpiled/directives/dev/Throw.js +14 -0
- package/transpiled/directives/dev/Throw.js.map +1 -0
- package/transpiled/directives/dev/index.d.ts +2 -0
- package/transpiled/directives/dev/index.js +7 -0
- package/transpiled/directives/dev/index.js.map +1 -0
- package/transpiled/directives/dev/types.d.ts +4 -0
- package/transpiled/directives/dev/types.js +3 -0
- package/transpiled/directives/dev/types.js.map +1 -0
- package/transpiled/directives/index.d.ts +2 -0
- package/transpiled/directives/index.js +12 -0
- package/transpiled/directives/index.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +8 -0
- package/transpiled/directives/octets/Context.js +40 -0
- package/transpiled/directives/octets/Context.js.map +1 -0
- package/transpiled/directives/octets/Delete.d.ts +10 -0
- package/transpiled/directives/octets/Delete.js +47 -0
- package/transpiled/directives/octets/Delete.js.map +1 -0
- package/transpiled/directives/octets/Family.d.ts +12 -0
- package/transpiled/directives/octets/Family.js +49 -0
- package/transpiled/directives/octets/Family.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +18 -0
- package/transpiled/directives/octets/Fetch.js +77 -0
- package/transpiled/directives/octets/Fetch.js.map +1 -0
- package/transpiled/directives/octets/List.d.ts +10 -0
- package/transpiled/directives/octets/List.js +47 -0
- package/transpiled/directives/octets/List.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +10 -0
- package/transpiled/directives/octets/Permute.js +51 -0
- package/transpiled/directives/octets/Permute.js.map +1 -0
- package/transpiled/directives/octets/Store.d.ts +33 -0
- package/transpiled/directives/octets/Store.js +124 -0
- package/transpiled/directives/octets/Store.js.map +1 -0
- package/transpiled/directives/octets/index.d.ts +2 -0
- package/transpiled/directives/octets/index.js +7 -0
- package/transpiled/directives/octets/index.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +6 -0
- package/transpiled/directives/octets/schemas.js +17 -0
- package/transpiled/directives/octets/schemas.js.map +1 -0
- package/transpiled/directives/octets/types.d.ts +9 -0
- package/transpiled/directives/octets/types.js +3 -0
- package/transpiled/directives/octets/types.js.map +1 -0
- package/transpiled/discovery.d.ts +1 -0
- package/transpiled/discovery.js +3 -0
- package/transpiled/discovery.js.map +1 -0
- package/transpiled/exceptions.d.ts +2 -0
- package/transpiled/exceptions.js +39 -0
- package/transpiled/exceptions.js.map +1 -0
- package/transpiled/index.d.ts +5 -0
- package/transpiled/index.js +12 -0
- package/transpiled/index.js.map +1 -0
- package/transpiled/manifest.d.ts +3 -0
- package/transpiled/manifest.js +61 -0
- package/transpiled/manifest.js.map +1 -0
- package/transpiled/root.d.ts +2 -0
- package/transpiled/root.js +39 -0
- package/transpiled/root.js.map +1 -0
- package/transpiled/schemas.d.ts +3 -0
- package/transpiled/schemas.js +14 -0
- package/transpiled/schemas.js.map +1 -0
- package/transpiled/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { NotAcceptable, NotFound } from '../../HTTP'
|
|
2
|
+
import * as schemas from './schemas'
|
|
3
|
+
import type { Maybe } from '@toa.io/types'
|
|
4
|
+
import type { Component } from '@toa.io/core'
|
|
5
|
+
import type { Output } from '../../Directive'
|
|
6
|
+
|
|
7
|
+
import type { Directive, Input } from './types'
|
|
8
|
+
|
|
9
|
+
export class Permute implements Directive {
|
|
10
|
+
public readonly targeted = false
|
|
11
|
+
|
|
12
|
+
private readonly discovery: Promise<Component>
|
|
13
|
+
private storage: Component | null = null
|
|
14
|
+
|
|
15
|
+
public constructor (value: null, discovery: Promise<Component>) {
|
|
16
|
+
schemas.remove.validate(value)
|
|
17
|
+
|
|
18
|
+
this.discovery = discovery
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public async apply (storage: string, request: Input): Promise<Output> {
|
|
22
|
+
this.storage ??= await this.discovery
|
|
23
|
+
|
|
24
|
+
if (request.encoder === null)
|
|
25
|
+
throw new NotAcceptable()
|
|
26
|
+
|
|
27
|
+
const path = request.path
|
|
28
|
+
const list = await request.parse()
|
|
29
|
+
const input = { storage, path, list }
|
|
30
|
+
const error = await this.storage.invoke<Maybe<unknown>>('permute', { input })
|
|
31
|
+
|
|
32
|
+
if (error instanceof Error)
|
|
33
|
+
throw new NotFound()
|
|
34
|
+
|
|
35
|
+
return {}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Readable } from 'node:stream'
|
|
2
|
+
import { posix } from 'node:path'
|
|
3
|
+
import { match } from 'matchacho'
|
|
4
|
+
import { promex } from '@toa.io/generic'
|
|
5
|
+
import { BadRequest, UnsupportedMediaType } from '../../HTTP'
|
|
6
|
+
import * as schemas from './schemas'
|
|
7
|
+
import type { Maybe } from '@toa.io/types'
|
|
8
|
+
import type { Entry } from '@toa.io/extensions.storages'
|
|
9
|
+
import type { Remotes } from '../../Remotes'
|
|
10
|
+
import type { ErrorType } from 'error-value'
|
|
11
|
+
import type { Component } from '@toa.io/core'
|
|
12
|
+
import type { Output } from '../../Directive'
|
|
13
|
+
import type { Directive, Input } from './types'
|
|
14
|
+
|
|
15
|
+
export class Store implements Directive {
|
|
16
|
+
public readonly targeted = false
|
|
17
|
+
|
|
18
|
+
private readonly accept: string | undefined
|
|
19
|
+
private readonly workflow: Workflow | undefined
|
|
20
|
+
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
21
|
+
private readonly remotes: Remotes
|
|
22
|
+
private readonly components: Record<string, Component> = {}
|
|
23
|
+
private storage: Component | null = null
|
|
24
|
+
|
|
25
|
+
public constructor
|
|
26
|
+
(options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
27
|
+
schemas.store.validate(options)
|
|
28
|
+
|
|
29
|
+
this.accept = match(options?.accept,
|
|
30
|
+
String, (value: string) => value,
|
|
31
|
+
Array, (types: string[]) => types.join(','),
|
|
32
|
+
undefined)
|
|
33
|
+
|
|
34
|
+
this.workflow = match(options?.workflow,
|
|
35
|
+
Array, (units: Unit[]) => units,
|
|
36
|
+
Object, (unit: Unit) => [unit],
|
|
37
|
+
undefined)
|
|
38
|
+
|
|
39
|
+
this.discovery.storage = discovery
|
|
40
|
+
this.remotes = remotes
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public async apply (storage: string, request: Input): Promise<Output> {
|
|
44
|
+
this.storage ??= await this.discovery.storage
|
|
45
|
+
|
|
46
|
+
const input = { storage, request, accept: this.accept }
|
|
47
|
+
const entry = await this.storage.invoke('store', { input })
|
|
48
|
+
|
|
49
|
+
return match<Output>(entry,
|
|
50
|
+
Error, (error: ErrorType) => this.throw(error),
|
|
51
|
+
() => this.reply(request, storage, entry))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private reply (request: Input, storage: string, entry: Entry): Output {
|
|
55
|
+
const body = this.workflow === undefined
|
|
56
|
+
? entry
|
|
57
|
+
: Readable.from(this.execute(request, storage, entry))
|
|
58
|
+
|
|
59
|
+
return { body }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private throw (error: ErrorType): never {
|
|
63
|
+
throw match(error.code,
|
|
64
|
+
'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
|
|
65
|
+
'TYPE_MISMATCH', () => new BadRequest(),
|
|
66
|
+
error)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* eslint-disable no-useless-return, max-depth */
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Execute workflow units sequentially, steps within a unit in parallel.
|
|
73
|
+
* Yield results as soon as they come.
|
|
74
|
+
*
|
|
75
|
+
* If you need to change this, it may take a while.
|
|
76
|
+
*/
|
|
77
|
+
private async * execute (request: Input, storage: string, entry: Entry): AsyncGenerator {
|
|
78
|
+
yield entry
|
|
79
|
+
|
|
80
|
+
const path = posix.join(request.path, entry.id)
|
|
81
|
+
let interrupted = false
|
|
82
|
+
|
|
83
|
+
for (const unit of this.workflow as Workflow) {
|
|
84
|
+
if (interrupted)
|
|
85
|
+
break
|
|
86
|
+
|
|
87
|
+
const steps = Object.keys(unit)
|
|
88
|
+
|
|
89
|
+
// unit result promises queue
|
|
90
|
+
const results = Array.from(steps, promex<unknown>)
|
|
91
|
+
let next = 0
|
|
92
|
+
|
|
93
|
+
// execute steps in parallel
|
|
94
|
+
for (const step of steps)
|
|
95
|
+
// these promises are indirectly awaited in the yield loop
|
|
96
|
+
void (async () => {
|
|
97
|
+
const endpoint = unit[step]
|
|
98
|
+
const context: Context = { storage, path, entry }
|
|
99
|
+
const result = await this.call(endpoint, context)
|
|
100
|
+
|
|
101
|
+
if (interrupted)
|
|
102
|
+
return
|
|
103
|
+
|
|
104
|
+
// as a result is received, resolve the next promise from the queue
|
|
105
|
+
const promise = results[next++]
|
|
106
|
+
|
|
107
|
+
if (result instanceof Error) {
|
|
108
|
+
interrupted = true
|
|
109
|
+
promise.resolve({ error: { step, ...result } })
|
|
110
|
+
|
|
111
|
+
// cancel pending promises
|
|
112
|
+
results[next].resolve(null)
|
|
113
|
+
} else
|
|
114
|
+
promise.resolve({ [step]: result ?? null })
|
|
115
|
+
})().catch((e) => results[next].reject(e))
|
|
116
|
+
|
|
117
|
+
// yield results from the queue as they come
|
|
118
|
+
for (const promise of results) {
|
|
119
|
+
const result = await promise
|
|
120
|
+
|
|
121
|
+
if (result === null) // canceled promise
|
|
122
|
+
break
|
|
123
|
+
else
|
|
124
|
+
yield result
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private async call (endpoint: string, context: Context): Promise<Maybe<unknown>> {
|
|
130
|
+
const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
|
|
131
|
+
const key = `${namespace}.${component}`
|
|
132
|
+
|
|
133
|
+
this.components[key] ??= await this.discover(key, namespace, component)
|
|
134
|
+
|
|
135
|
+
return await this.components[key].invoke(operation, { input: context })
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
private async discover (key: string, namespace: string, component: string): Promise<Component> {
|
|
139
|
+
if (this.discovery[key] === undefined)
|
|
140
|
+
this.discovery[key] = this.remotes.discover(namespace, component)
|
|
141
|
+
|
|
142
|
+
return await this.discovery[key]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
type Unit = Record<string, string>
|
|
147
|
+
type Workflow = Unit[]
|
|
148
|
+
|
|
149
|
+
interface Options {
|
|
150
|
+
accept: string | string[]
|
|
151
|
+
workflow: Workflow | Unit
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface Context {
|
|
155
|
+
storage: string
|
|
156
|
+
path: string
|
|
157
|
+
entry: Entry
|
|
158
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import schemas from '@toa.io/schemas'
|
|
3
|
+
|
|
4
|
+
const path = resolve(__dirname, '../../../schemas/octets')
|
|
5
|
+
const namespace = schemas.namespace(path)
|
|
6
|
+
|
|
7
|
+
export const context = namespace.schema('context')
|
|
8
|
+
export const store = namespace.schema('store')
|
|
9
|
+
export const fetch = namespace.schema('fetch')
|
|
10
|
+
export const remove = namespace.schema('delete')
|
|
11
|
+
export const list = namespace.schema('list')
|
|
12
|
+
export const permute = namespace.schema('permute')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as directive from '../../Directive'
|
|
2
|
+
|
|
3
|
+
export interface Directive {
|
|
4
|
+
readonly targeted: boolean
|
|
5
|
+
|
|
6
|
+
apply: (storage: string, input: Input) => directive.Output | Promise<directive.Output>
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface Extension {
|
|
10
|
+
octets?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type Input = directive.Input & Extension
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Annotation.js","sourceRoot":"","sources":["../source/Annotation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Branch.js","sourceRoot":"","sources":["../source/Branch.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Connector } from '@toa.io/core';
|
|
2
|
+
import { type Bootloader } from './Factory';
|
|
3
|
+
export declare class Composition extends Connector {
|
|
4
|
+
private readonly boot;
|
|
5
|
+
constructor(boot: Bootloader);
|
|
6
|
+
protected open(): Promise<void>;
|
|
7
|
+
protected dispose(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function components(): Components;
|
|
10
|
+
interface Components {
|
|
11
|
+
labels: string[];
|
|
12
|
+
paths: string[];
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.components = exports.Composition = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const core_1 = require("@toa.io/core");
|
|
7
|
+
class Composition extends core_1.Connector {
|
|
8
|
+
boot;
|
|
9
|
+
constructor(boot) {
|
|
10
|
+
super();
|
|
11
|
+
this.boot = boot;
|
|
12
|
+
}
|
|
13
|
+
async open() {
|
|
14
|
+
const paths = find();
|
|
15
|
+
const composition = await this.boot.composition(paths);
|
|
16
|
+
await composition.connect();
|
|
17
|
+
this.depends(composition);
|
|
18
|
+
console.info('Composition complete.');
|
|
19
|
+
}
|
|
20
|
+
dispose() {
|
|
21
|
+
console.info('Composition shutdown complete.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.Composition = Composition;
|
|
25
|
+
function find() {
|
|
26
|
+
return entries().map((entry) => (0, node_path_1.resolve)(ROOT, entry.name));
|
|
27
|
+
}
|
|
28
|
+
function entries() {
|
|
29
|
+
const entries = (0, node_fs_1.readdirSync)(ROOT, { withFileTypes: true });
|
|
30
|
+
return entries.filter((entry) => entry.isDirectory());
|
|
31
|
+
}
|
|
32
|
+
function components() {
|
|
33
|
+
const labels = [];
|
|
34
|
+
const paths = [];
|
|
35
|
+
for (const entry of entries()) {
|
|
36
|
+
labels.push(entry.name.replace('.', '-'));
|
|
37
|
+
paths.push((0, node_path_1.resolve)(ROOT, entry.name));
|
|
38
|
+
}
|
|
39
|
+
return { labels, paths };
|
|
40
|
+
}
|
|
41
|
+
exports.components = components;
|
|
42
|
+
const ROOT = (0, node_path_1.resolve)(__dirname, '../components/');
|
|
43
|
+
//# sourceMappingURL=Composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composition.js","sourceRoot":"","sources":["../source/Composition.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,yCAAmC;AACnC,uCAAwC;AAGxC,MAAa,WAAY,SAAQ,gBAAS;IACvB,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAEzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACvC,CAAC;IAEkB,OAAO;QACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAChD,CAAC;CACF;AAtBD,kCAsBC;AAED,SAAS,IAAI;IACX,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;KACtC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAVD,gCAUC;AAOD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Context.js","sourceRoot":"","sources":["../source/Context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type IncomingMessage, type OutgoingMessage } from './HTTP';
|
|
2
|
+
import { type Remotes } from './Remotes';
|
|
3
|
+
import type * as RTD from './RTD';
|
|
4
|
+
export declare class Directives implements RTD.Directives<Directives> {
|
|
5
|
+
private readonly directives;
|
|
6
|
+
constructor(directives: DirectiveSet[]);
|
|
7
|
+
preflight(request: IncomingMessage, parameters: RTD.Parameter[]): Promise<Output>;
|
|
8
|
+
settle(request: IncomingMessage, response: OutgoingMessage): Promise<void>;
|
|
9
|
+
merge(directives: Directives): void;
|
|
10
|
+
}
|
|
11
|
+
export declare class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
|
|
12
|
+
private readonly remtoes;
|
|
13
|
+
private readonly families;
|
|
14
|
+
private readonly mandatory;
|
|
15
|
+
constructor(families: Family[], remotes: Remotes);
|
|
16
|
+
create(declarations: RTD.syntax.Directive[]): Directives;
|
|
17
|
+
}
|
|
18
|
+
export declare const shortcuts: RTD.syntax.Shortcuts;
|
|
19
|
+
export interface Family<TDirective = any, TExtension = any> {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly mandatory: boolean;
|
|
22
|
+
create: (name: string, value: any, remotes: Remotes) => TDirective;
|
|
23
|
+
preflight: (directives: TDirective[], request: IncomingMessage & TExtension, parameters: RTD.Parameter[]) => Output | Promise<Output>;
|
|
24
|
+
settle?: (directives: TDirective[], request: IncomingMessage & TExtension, response: OutgoingMessage) => void | Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
interface DirectiveSet {
|
|
27
|
+
family: Family;
|
|
28
|
+
directives: any[];
|
|
29
|
+
}
|
|
30
|
+
export type Input = IncomingMessage;
|
|
31
|
+
export type Output = OutgoingMessage | null;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shortcuts = exports.DirectivesFactory = exports.Directives = void 0;
|
|
4
|
+
class Directives {
|
|
5
|
+
directives;
|
|
6
|
+
constructor(directives) {
|
|
7
|
+
this.directives = directives;
|
|
8
|
+
}
|
|
9
|
+
async preflight(request, parameters) {
|
|
10
|
+
for (const directive of this.directives) {
|
|
11
|
+
const output = await directive.family.preflight(directive.directives, request, parameters);
|
|
12
|
+
if (output !== null) {
|
|
13
|
+
await this.settle(request, output);
|
|
14
|
+
return output;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
async settle(request, response) {
|
|
20
|
+
for (const directive of this.directives)
|
|
21
|
+
if (directive.family.settle !== undefined)
|
|
22
|
+
await directive.family.settle(directive.directives, request, response);
|
|
23
|
+
}
|
|
24
|
+
merge(directives) {
|
|
25
|
+
this.directives.push(...directives.directives);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.Directives = Directives;
|
|
29
|
+
class DirectivesFactory {
|
|
30
|
+
remtoes;
|
|
31
|
+
families = {};
|
|
32
|
+
mandatory = [];
|
|
33
|
+
constructor(families, remotes) {
|
|
34
|
+
for (const family of families) {
|
|
35
|
+
this.families[family.name] = family;
|
|
36
|
+
if (family.mandatory)
|
|
37
|
+
this.mandatory.push(family.name);
|
|
38
|
+
}
|
|
39
|
+
this.remtoes = remotes;
|
|
40
|
+
}
|
|
41
|
+
create(declarations) {
|
|
42
|
+
const groups = {};
|
|
43
|
+
const mandatory = new Set(this.mandatory);
|
|
44
|
+
declarations.sort((a, b) => (mandatory.has(b.family) ? 1 : 0) - (mandatory.has(a.family) ? 1 : 0));
|
|
45
|
+
for (const declaration of declarations) {
|
|
46
|
+
const family = this.families[declaration.family];
|
|
47
|
+
if (family === undefined)
|
|
48
|
+
throw new Error(`Directive family '${declaration.family}' not found.`);
|
|
49
|
+
const directive = family.create(declaration.name, declaration.value, this.remtoes);
|
|
50
|
+
groups[family.name] ??= [];
|
|
51
|
+
groups[family.name].push(directive);
|
|
52
|
+
mandatory.delete(family.name);
|
|
53
|
+
}
|
|
54
|
+
const sets = [];
|
|
55
|
+
for (const family of mandatory)
|
|
56
|
+
sets.push({
|
|
57
|
+
family: this.families[family],
|
|
58
|
+
directives: []
|
|
59
|
+
});
|
|
60
|
+
for (const [family, directives] of Object.entries(groups))
|
|
61
|
+
sets.push({
|
|
62
|
+
family: this.families[family],
|
|
63
|
+
directives
|
|
64
|
+
});
|
|
65
|
+
return new Directives(sets);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.DirectivesFactory = DirectivesFactory;
|
|
69
|
+
exports.shortcuts = new Map([
|
|
70
|
+
['anonymous', 'auth:anonymous'],
|
|
71
|
+
['id', 'auth:id'],
|
|
72
|
+
['role', 'auth:role'],
|
|
73
|
+
['rule', 'auth:rule'],
|
|
74
|
+
['incept', 'auth:incept']
|
|
75
|
+
]);
|
|
76
|
+
//# sourceMappingURL=Directive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Directive.js","sourceRoot":"","sources":["../source/Directive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Component, type Reply } from '@toa.io/core';
|
|
2
|
+
import { type Remotes } from './Remotes';
|
|
3
|
+
import { Mapping } from './Mapping';
|
|
4
|
+
import { type Context } from './Context';
|
|
5
|
+
import type * as RTD from './RTD';
|
|
6
|
+
import type * as http from './HTTP';
|
|
7
|
+
export declare class Endpoint implements RTD.Endpoint<Endpoint> {
|
|
8
|
+
private readonly endpoint;
|
|
9
|
+
private readonly mapping;
|
|
10
|
+
private readonly discovery;
|
|
11
|
+
private remote;
|
|
12
|
+
constructor(endpoint: string, mapping: Mapping, discovery: Promise<Component>);
|
|
13
|
+
call(body: any, query: http.Query, parameters: RTD.Parameter[]): Promise<Reply>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare class EndpointsFactory implements RTD.EndpointsFactory<Endpoint> {
|
|
17
|
+
private readonly remotes;
|
|
18
|
+
constructor(remotes: Remotes);
|
|
19
|
+
create(method: RTD.syntax.Method, context: Context): Endpoint;
|
|
20
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EndpointsFactory = exports.Endpoint = void 0;
|
|
4
|
+
const Mapping_1 = require("./Mapping");
|
|
5
|
+
class Endpoint {
|
|
6
|
+
endpoint;
|
|
7
|
+
mapping;
|
|
8
|
+
discovery;
|
|
9
|
+
remote = null;
|
|
10
|
+
constructor(endpoint, mapping, discovery) {
|
|
11
|
+
this.endpoint = endpoint;
|
|
12
|
+
this.mapping = mapping;
|
|
13
|
+
this.discovery = discovery;
|
|
14
|
+
}
|
|
15
|
+
async call(body, query, parameters) {
|
|
16
|
+
const request = this.mapping.fit(body, query, parameters);
|
|
17
|
+
this.remote ??= await this.discovery;
|
|
18
|
+
return await this.remote.invoke(this.endpoint, request);
|
|
19
|
+
}
|
|
20
|
+
async close() {
|
|
21
|
+
this.remote ??= await this.discovery;
|
|
22
|
+
await this.remote.disconnect(INTERRUPT);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.Endpoint = Endpoint;
|
|
26
|
+
class EndpointsFactory {
|
|
27
|
+
remotes;
|
|
28
|
+
constructor(remotes) {
|
|
29
|
+
this.remotes = remotes;
|
|
30
|
+
}
|
|
31
|
+
create(method, context) {
|
|
32
|
+
if (method.mapping === undefined)
|
|
33
|
+
throw new Error('Cannot create Endpoint without mapping.');
|
|
34
|
+
const mapping = Mapping_1.Mapping.create(method.mapping.query);
|
|
35
|
+
const namespace = method.mapping.namespace ?? context.extension?.namespace;
|
|
36
|
+
const component = method.mapping.component ?? context.extension?.component;
|
|
37
|
+
if (namespace === undefined || component === undefined)
|
|
38
|
+
throw new Error('Annotation endpoints must be fully qualified.');
|
|
39
|
+
const discovery = this.remotes.discover(namespace, component);
|
|
40
|
+
return new Endpoint(method.mapping.endpoint, mapping, discovery);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.EndpointsFactory = EndpointsFactory;
|
|
44
|
+
const INTERRUPT = true;
|
|
45
|
+
//# sourceMappingURL=Endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../source/Endpoint.ts"],"names":[],"mappings":";;;AAEA,uCAAmC;AAKnC,MAAa,QAAQ;IACF,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,SAAS,CAAoB;IACtC,MAAM,GAAqB,IAAI,CAAA;IAEvC,YAAoB,QAAgB,EAAE,OAAgB,EAAE,SAA6B;QACnF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAE,IAAS,EAAE,KAAiB,EAAE,UAA2B;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;CACF;AAzBD,4BAyBC;AAED,MAAa,gBAAgB;IACV,OAAO,CAAS;IAEjC,YAAoB,OAAgB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEM,MAAM,CAAE,MAAyB,EAAE,OAAgB;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAE5D,MAAM,OAAO,GAAG,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAE1E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YACpD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAElE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAE7D,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IAClE,CAAC;CACF;AAtBD,4CAsBC;AAED,MAAM,SAAS,GAAG,IAAI,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { syntax } from './RTD';
|
|
2
|
+
import type { Connector, Locator, extensions } from '@toa.io/core';
|
|
3
|
+
export declare class Factory implements extensions.Factory {
|
|
4
|
+
private readonly boot;
|
|
5
|
+
private readonly families;
|
|
6
|
+
constructor(boot: Bootloader);
|
|
7
|
+
tenant(locator: Locator, node: syntax.Node): Connector;
|
|
8
|
+
service(): Connector | null;
|
|
9
|
+
}
|
|
10
|
+
export type Bootloader = typeof import('@toa.io/boot');
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.Factory = void 0;
|
|
27
|
+
const Tenant_1 = require("./Tenant");
|
|
28
|
+
const Gateway_1 = require("./Gateway");
|
|
29
|
+
const Remotes_1 = require("./Remotes");
|
|
30
|
+
const RTD_1 = require("./RTD");
|
|
31
|
+
const HTTP_1 = require("./HTTP");
|
|
32
|
+
const Endpoint_1 = require("./Endpoint");
|
|
33
|
+
const directives = __importStar(require("./directives"));
|
|
34
|
+
const Directive_1 = require("./Directive");
|
|
35
|
+
const Composition_1 = require("./Composition");
|
|
36
|
+
const root = __importStar(require("./root"));
|
|
37
|
+
class Factory {
|
|
38
|
+
boot;
|
|
39
|
+
families;
|
|
40
|
+
constructor(boot) {
|
|
41
|
+
this.boot = boot;
|
|
42
|
+
this.families = directives.families;
|
|
43
|
+
}
|
|
44
|
+
tenant(locator, node) {
|
|
45
|
+
const broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id);
|
|
46
|
+
return new Tenant_1.Tenant(broadcast, locator, node);
|
|
47
|
+
}
|
|
48
|
+
service() {
|
|
49
|
+
const debug = process.env.TOA_EXPOSITION_DEBUG === '1';
|
|
50
|
+
const broadcast = this.boot.bindings.broadcast(CHANNEL);
|
|
51
|
+
const server = HTTP_1.Server.create({ methods: RTD_1.syntax.verbs, debug });
|
|
52
|
+
const remotes = new Remotes_1.Remotes(this.boot);
|
|
53
|
+
const node = root.resolve();
|
|
54
|
+
const methods = new Endpoint_1.EndpointsFactory(remotes);
|
|
55
|
+
const directives = new Directive_1.DirectivesFactory(this.families, remotes);
|
|
56
|
+
const tree = new RTD_1.Tree(node, methods, directives);
|
|
57
|
+
const composition = new Composition_1.Composition(this.boot);
|
|
58
|
+
const gateway = new Gateway_1.Gateway(broadcast, server, tree);
|
|
59
|
+
gateway.depends(remotes);
|
|
60
|
+
gateway.depends(composition);
|
|
61
|
+
return gateway;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.Factory = Factory;
|
|
65
|
+
const CHANNEL = 'exposition';
|
|
66
|
+
//# sourceMappingURL=Factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,uCAAmC;AACnC,uCAAmC;AACnC,+BAAoC;AACpC,iCAA+B;AAC/B,yCAA4D;AAC5D,yDAA0C;AAC1C,2CAA6E;AAC7E,+CAA2C;AAC3C,6CAA8B;AAG9B,MAAa,OAAO;IACD,IAAI,CAAY;IAChB,QAAQ,CAAU;IAEnC,YAAoB,IAAgB;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAA;IACrC,CAAC;IAEM,MAAM,CAAE,OAAgB,EAAE,IAAiB;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;QAEnE,OAAO,IAAI,eAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAA;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,aAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,2BAAgB,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,6BAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,IAAI,UAAI,CAAuB,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QAEtE,MAAM,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAEpD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAE5B,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAjCD,0BAiCC;AAED,MAAM,OAAO,GAAG,YAAY,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type bindings, Connector } from '@toa.io/core';
|
|
2
|
+
import * as http from './HTTP';
|
|
3
|
+
import { type Tree } from './RTD';
|
|
4
|
+
import { type Label } from './discovery';
|
|
5
|
+
import { type Endpoint } from './Endpoint';
|
|
6
|
+
import { type Directives } from './Directive';
|
|
7
|
+
export declare class Gateway extends Connector {
|
|
8
|
+
private readonly broadcast;
|
|
9
|
+
private readonly tree;
|
|
10
|
+
constructor(broadcast: Broadcast, server: http.Server, tree: Tree<Endpoint, Directives>);
|
|
11
|
+
protected open(): Promise<void>;
|
|
12
|
+
protected dispose(): void;
|
|
13
|
+
private process;
|
|
14
|
+
private call;
|
|
15
|
+
private discover;
|
|
16
|
+
private merge;
|
|
17
|
+
}
|
|
18
|
+
type Broadcast = bindings.Broadcast<Label>;
|
|
19
|
+
export {};
|