@toa.io/extensions.exposition 1.0.0-alpha.231 → 1.0.0-alpha.238
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/features/dynamic.feature +38 -1
- package/features/probes.feature +1 -1
- package/features/steps/Gateway.ts +11 -0
- package/package.json +2 -2
- package/source/Gateway.ts +43 -11
- package/source/RTD/Node.ts +5 -0
- package/source/RTD/Route.ts +3 -0
- package/source/RTD/Tree.ts +2 -2
- package/source/RTD/expiration.test.ts +54 -0
- package/source/RTD/factory.ts +17 -2
- package/source/Tenant.ts +33 -0
- package/source/const.ts +1 -0
- package/transpiled/Gateway.d.ts +3 -0
- package/transpiled/Gateway.js +33 -10
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +2 -0
- package/transpiled/RTD/Node.js +4 -0
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +2 -0
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +2 -2
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +12 -2
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/Tenant.d.ts +4 -0
- package/transpiled/Tenant.js +24 -0
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/const.d.ts +1 -0
- package/transpiled/const.js +5 -0
- package/transpiled/const.js.map +1 -0
- package/transpiled/tsconfig.tsbuildinfo +1 -1
package/features/dynamic.feature
CHANGED
|
@@ -83,7 +83,43 @@ Feature: Dynamic tree updates
|
|
|
83
83
|
200 OK
|
|
84
84
|
"""
|
|
85
85
|
|
|
86
|
+
Scenario: Stale branch expires
|
|
87
|
+
Given the branch TTL is 0.5 seconds
|
|
88
|
+
And the Gateway is running
|
|
89
|
+
And the `pots` is running with the following manifest:
|
|
90
|
+
"""yaml
|
|
91
|
+
exposition:
|
|
92
|
+
/:
|
|
93
|
+
io:output: true
|
|
94
|
+
GET: enumerate
|
|
95
|
+
"""
|
|
96
|
+
When the following request is received:
|
|
97
|
+
"""
|
|
98
|
+
GET /pots/ HTTP/1.1
|
|
99
|
+
host: nex.toa.io
|
|
100
|
+
accept: application/yaml
|
|
101
|
+
"""
|
|
102
|
+
Then the following reply is sent:
|
|
103
|
+
"""
|
|
104
|
+
200 OK
|
|
105
|
+
"""
|
|
106
|
+
Then the `pots` is stopped
|
|
107
|
+
And after 0.8 seconds
|
|
108
|
+
When the following request is received:
|
|
109
|
+
"""
|
|
110
|
+
GET /pots/ HTTP/1.1
|
|
111
|
+
host: nex.toa.io
|
|
112
|
+
accept: text/plain
|
|
113
|
+
"""
|
|
114
|
+
Then the following reply is sent:
|
|
115
|
+
"""
|
|
116
|
+
404 Not Found
|
|
117
|
+
|
|
118
|
+
Route not found
|
|
119
|
+
"""
|
|
120
|
+
|
|
86
121
|
Scenario: Updating routes with conflict
|
|
122
|
+
Given the Gateway is running
|
|
87
123
|
And the `pots` is running with the following manifest:
|
|
88
124
|
"""yaml
|
|
89
125
|
version: 1.0.0
|
|
@@ -119,7 +155,8 @@ Feature: Dynamic tree updates
|
|
|
119
155
|
"""
|
|
120
156
|
|
|
121
157
|
Scenario: Updating method mapping
|
|
122
|
-
Given the
|
|
158
|
+
Given the Gateway is running
|
|
159
|
+
And the `pots` is running with the following manifest:
|
|
123
160
|
"""yaml
|
|
124
161
|
version: a
|
|
125
162
|
exposition:
|
package/features/probes.feature
CHANGED
|
@@ -58,6 +58,15 @@ export class Gateway {
|
|
|
58
58
|
this.default = false
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
@given('the branch TTL is {float} second(s)')
|
|
62
|
+
public async setBranchTTL (seconds: number): Promise<void> {
|
|
63
|
+
process.env.__TESTING_EXPOSITION_BRANCH_TTL = String(seconds * 1000)
|
|
64
|
+
|
|
65
|
+
await Gateway.stop()
|
|
66
|
+
|
|
67
|
+
this.default = false
|
|
68
|
+
}
|
|
69
|
+
|
|
61
70
|
@given('the Gateway is running')
|
|
62
71
|
public async start (): Promise<void> {
|
|
63
72
|
if (instance !== null)
|
|
@@ -82,6 +91,8 @@ export class Gateway {
|
|
|
82
91
|
|
|
83
92
|
@after()
|
|
84
93
|
public async cleanup (): Promise<void> {
|
|
94
|
+
delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
95
|
+
|
|
85
96
|
if (this.default)
|
|
86
97
|
return
|
|
87
98
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toa.io/extensions.exposition",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.238",
|
|
4
4
|
"description": "Toa Exposition",
|
|
5
5
|
"author": "temich <tema.gurtovoy@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/toa-io/toa#readme",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
},
|
|
65
65
|
"testEnvironment": "node"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "6d19b45f754b603ce201f52fcfa6e8ef4e9e854b"
|
|
68
68
|
}
|
package/source/Gateway.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
+
import { setTimeout } from 'node:timers/promises'
|
|
2
3
|
import { console } from 'openspan'
|
|
3
4
|
import { type bindings, Connector } from '@toa.io/core'
|
|
4
5
|
import * as http from './HTTP'
|
|
@@ -13,6 +14,8 @@ export class Gateway extends Connector {
|
|
|
13
14
|
private readonly tree: Tree
|
|
14
15
|
private readonly interceptor: Interception
|
|
15
16
|
private readonly merged = new Set<string>()
|
|
17
|
+
private lastMerge = 0
|
|
18
|
+
private resolveFirstMerge: (() => void) | null = null
|
|
16
19
|
|
|
17
20
|
public constructor (broadcast: Broadcast, tree: Tree, interception: Interception) {
|
|
18
21
|
super()
|
|
@@ -119,24 +122,36 @@ export class Gateway extends Connector {
|
|
|
119
122
|
}
|
|
120
123
|
|
|
121
124
|
private async discover (): Promise<void> {
|
|
125
|
+
const first = new Promise<void>((resolve) => {
|
|
126
|
+
this.resolveFirstMerge = resolve
|
|
127
|
+
})
|
|
128
|
+
|
|
122
129
|
await this.broadcast.receive<Branch>('expose', this.merge.bind(this))
|
|
123
130
|
await this.broadcast.transmit<null>('ping', null)
|
|
131
|
+
await this.settled(first)
|
|
124
132
|
}
|
|
125
133
|
|
|
126
|
-
private
|
|
127
|
-
const
|
|
134
|
+
private async settled (first: Promise<void>): Promise<void> {
|
|
135
|
+
const deadline = Date.now() + SETTLE_TIMEOUT
|
|
128
136
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
version: branch.version
|
|
134
|
-
})
|
|
137
|
+
await Promise.race([first, setTimeout(SETTLE_TIMEOUT)])
|
|
138
|
+
|
|
139
|
+
if (this.lastMerge === 0) {
|
|
140
|
+
console.warn('Discovery timed out waiting for the first expose')
|
|
135
141
|
|
|
136
142
|
return
|
|
137
143
|
}
|
|
138
144
|
|
|
139
|
-
|
|
145
|
+
while (Date.now() - this.lastMerge < SETTLE_QUIET) {
|
|
146
|
+
if (Date.now() >= deadline)
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
await setTimeout(SETTLE_POLL)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private merge (branch: Branch): void {
|
|
154
|
+
const id = branch.namespace + '.' + branch.component + '@' + branch.version
|
|
140
155
|
|
|
141
156
|
const attributes = {
|
|
142
157
|
namespace: branch.namespace,
|
|
@@ -146,14 +161,31 @@ export class Gateway extends Connector {
|
|
|
146
161
|
|
|
147
162
|
try {
|
|
148
163
|
this.tree.merge(branch.node, branch)
|
|
149
|
-
|
|
150
|
-
console.info('Branch merged', attributes)
|
|
151
164
|
} catch (exception: unknown) {
|
|
152
165
|
const message = exception instanceof Error ? exception.message : 'Unknown error'
|
|
153
166
|
|
|
154
167
|
console.error('Branch merge exception', { message, ...attributes })
|
|
168
|
+
|
|
169
|
+
return
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (this.merged.has(id)) {
|
|
173
|
+
console.debug('Branch refreshed', attributes)
|
|
174
|
+
|
|
175
|
+
return
|
|
155
176
|
}
|
|
177
|
+
|
|
178
|
+
this.merged.add(id)
|
|
179
|
+
this.lastMerge = Date.now()
|
|
180
|
+
this.resolveFirstMerge?.()
|
|
181
|
+
this.resolveFirstMerge = null
|
|
182
|
+
|
|
183
|
+
console.info('Branch merged', attributes)
|
|
156
184
|
}
|
|
157
185
|
}
|
|
158
186
|
|
|
159
187
|
export type Broadcast = bindings.Broadcast<Label>
|
|
188
|
+
|
|
189
|
+
const SETTLE_QUIET = 10_000
|
|
190
|
+
const SETTLE_TIMEOUT = 30_000
|
|
191
|
+
const SETTLE_POLL = 50
|
package/source/RTD/Node.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { type Match, type Parameter } from './Match'
|
|
|
5
5
|
export class Node {
|
|
6
6
|
public intermediate: boolean
|
|
7
7
|
public forward: string | null
|
|
8
|
+
public expiration: number
|
|
8
9
|
public methods: Methods
|
|
9
10
|
private readonly protected: boolean
|
|
10
11
|
private routes: Route[]
|
|
@@ -14,6 +15,7 @@ export class Node {
|
|
|
14
15
|
this.methods = methods
|
|
15
16
|
this.protected = properties.protected
|
|
16
17
|
this.forward = properties.forward ?? null
|
|
18
|
+
this.expiration = properties.expiration ?? Infinity
|
|
17
19
|
this.intermediate = this.routes.findIndex((route) => route.root) !== -1
|
|
18
20
|
|
|
19
21
|
this.sort()
|
|
@@ -59,6 +61,8 @@ export class Node {
|
|
|
59
61
|
|
|
60
62
|
this.routes = node.routes
|
|
61
63
|
this.methods = node.methods
|
|
64
|
+
this.expiration = node.expiration
|
|
65
|
+
this.forward = node.forward
|
|
62
66
|
|
|
63
67
|
// race condition is really unlikely
|
|
64
68
|
for (const method of methods)
|
|
@@ -96,4 +100,5 @@ export class Node {
|
|
|
96
100
|
export interface Properties {
|
|
97
101
|
protected: boolean
|
|
98
102
|
forward?: string
|
|
103
|
+
expiration?: number
|
|
99
104
|
}
|
package/source/RTD/Route.ts
CHANGED
|
@@ -22,6 +22,9 @@ export class Route {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
public match (fragments: string[], parameters: Parameter[]): Match | null {
|
|
25
|
+
if (Date.now() >= this.node.expiration)
|
|
26
|
+
return null
|
|
27
|
+
|
|
25
28
|
for (let i = 0; i < this.segments.length; i++) {
|
|
26
29
|
const segment = this.segments[i]
|
|
27
30
|
|
package/source/RTD/Tree.ts
CHANGED
|
@@ -16,8 +16,8 @@ export class Tree {
|
|
|
16
16
|
public constructor (node: syntax.Node, endpoints: EndpointsFactory, directives: DirectiveFactory) {
|
|
17
17
|
this.endpoints = endpoints
|
|
18
18
|
this.directives = directives
|
|
19
|
-
this.trunk = this.createNode(node, PROTECTED)
|
|
20
19
|
this.root = node
|
|
20
|
+
this.trunk = this.createNode(node, PROTECTED)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
public match (path: string): Match | null {
|
|
@@ -48,7 +48,7 @@ export class Tree {
|
|
|
48
48
|
endpoints: this.endpoints,
|
|
49
49
|
directives: {
|
|
50
50
|
factory: this.directives,
|
|
51
|
-
stack: this.root
|
|
51
|
+
stack: this.root.directives ?? []
|
|
52
52
|
},
|
|
53
53
|
extension
|
|
54
54
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Tree } from './Tree'
|
|
2
|
+
import type { EndpointsFactory } from '../Endpoint'
|
|
3
|
+
import type { DirectiveFactory } from './Directives'
|
|
4
|
+
import type * as syntax from './syntax'
|
|
5
|
+
|
|
6
|
+
const endpoints = {} as unknown as EndpointsFactory
|
|
7
|
+
|
|
8
|
+
const directives = {
|
|
9
|
+
create: () => ({
|
|
10
|
+
preflight: async () => null,
|
|
11
|
+
settle: async () => undefined,
|
|
12
|
+
dispose: () => undefined
|
|
13
|
+
}),
|
|
14
|
+
dispose: jest.fn()
|
|
15
|
+
} as unknown as DirectiveFactory
|
|
16
|
+
|
|
17
|
+
const root: syntax.Node = {
|
|
18
|
+
routes: [],
|
|
19
|
+
methods: [],
|
|
20
|
+
directives: []
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const pots: syntax.Node = {
|
|
24
|
+
routes: [
|
|
25
|
+
{
|
|
26
|
+
path: '/pots',
|
|
27
|
+
node: {
|
|
28
|
+
routes: [],
|
|
29
|
+
methods: [{ verb: 'GET', directives: [] }],
|
|
30
|
+
directives: []
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
methods: [],
|
|
35
|
+
directives: []
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
it('should ignore expired nodes during match', () => {
|
|
39
|
+
process.env.__TESTING_EXPOSITION_BRANCH_TTL = '1000'
|
|
40
|
+
|
|
41
|
+
const now = jest.spyOn(Date, 'now').mockReturnValue(10_000)
|
|
42
|
+
const tree = new Tree(root, endpoints, directives)
|
|
43
|
+
|
|
44
|
+
tree.merge(pots, { namespace: 'default', component: 'pots' })
|
|
45
|
+
|
|
46
|
+
expect(tree.match('/pots/')).not.toBeNull()
|
|
47
|
+
|
|
48
|
+
now.mockReturnValue(11_000)
|
|
49
|
+
|
|
50
|
+
expect(tree.match('/pots/')).toBeNull()
|
|
51
|
+
|
|
52
|
+
now.mockRestore()
|
|
53
|
+
delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
54
|
+
})
|
package/source/RTD/factory.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BRANCH_TTL } from '../const'
|
|
1
2
|
import { Node, type Properties } from './Node'
|
|
2
3
|
import { Route } from './Route'
|
|
3
4
|
import { segment } from './segment'
|
|
@@ -17,14 +18,28 @@ export function createNode (node: syntax.Node, context: Context): Node {
|
|
|
17
18
|
for (const method of node.methods)
|
|
18
19
|
methods[method.verb] = createMethod(method, context)
|
|
19
20
|
|
|
21
|
+
const protect = node.protected ?? context.protected
|
|
22
|
+
|
|
20
23
|
const properties: Properties = {
|
|
21
|
-
protected:
|
|
22
|
-
forward: node.forward
|
|
24
|
+
protected: protect,
|
|
25
|
+
forward: node.forward,
|
|
26
|
+
expiration: protect ? Infinity : Date.now() + branchTTL()
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
return new Node(routes, methods, properties)
|
|
26
30
|
}
|
|
27
31
|
|
|
32
|
+
function branchTTL (): number {
|
|
33
|
+
const value = process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
34
|
+
|
|
35
|
+
if (value === undefined || value === '')
|
|
36
|
+
return BRANCH_TTL
|
|
37
|
+
|
|
38
|
+
const parsed = Number(value)
|
|
39
|
+
|
|
40
|
+
return Number.isFinite(parsed) ? parsed : BRANCH_TTL
|
|
41
|
+
}
|
|
42
|
+
|
|
28
43
|
function createRoute (route: syntax.Route, context: Context): Route {
|
|
29
44
|
const stack = context.directives.stack.slice()
|
|
30
45
|
const segments = segment(route.path)
|
package/source/Tenant.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { setTimeout } from 'node:timers/promises'
|
|
1
2
|
import { Connector } from '@toa.io/core'
|
|
3
|
+
import { BRANCH_TTL } from './const'
|
|
2
4
|
import type { bindings } from '@toa.io/core'
|
|
3
5
|
import type { Label } from './discovery'
|
|
4
6
|
import type { Branch } from './Branch'
|
|
@@ -6,6 +8,8 @@ import type { Branch } from './Branch'
|
|
|
6
8
|
export class Tenant extends Connector {
|
|
7
9
|
private readonly broadcast: Broadcast
|
|
8
10
|
private readonly branch: Branch
|
|
11
|
+
private started = 0
|
|
12
|
+
private stopped = false
|
|
9
13
|
|
|
10
14
|
public constructor (broadcast: Broadcast, branch: Branch) {
|
|
11
15
|
super()
|
|
@@ -17,8 +21,29 @@ export class Tenant extends Connector {
|
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
public override async open (): Promise<void> {
|
|
24
|
+
this.started = Date.now()
|
|
25
|
+
|
|
20
26
|
await this.expose()
|
|
21
27
|
await this.broadcast.receive('ping', this.expose.bind(this))
|
|
28
|
+
|
|
29
|
+
void this.announce()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected override dispose (): void {
|
|
33
|
+
this.stopped = true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private async announce (): Promise<void> {
|
|
37
|
+
while (!this.stopped) {
|
|
38
|
+
const delay = exposeInterval(Date.now() - this.started)
|
|
39
|
+
|
|
40
|
+
await setTimeout(delay, undefined, { ref: false })
|
|
41
|
+
|
|
42
|
+
if (this.stopped)
|
|
43
|
+
break
|
|
44
|
+
|
|
45
|
+
await this.expose()
|
|
46
|
+
}
|
|
22
47
|
}
|
|
23
48
|
|
|
24
49
|
private async expose (): Promise<void> {
|
|
@@ -26,4 +51,12 @@ export class Tenant extends Connector {
|
|
|
26
51
|
}
|
|
27
52
|
}
|
|
28
53
|
|
|
54
|
+
function exposeInterval (uptime: number): number {
|
|
55
|
+
return Math.round(EXPOSE_MAX - (EXPOSE_MAX - EXPOSE_MIN) * Math.exp(-uptime / EXPOSE_TAU))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const EXPOSE_MIN = 5_000
|
|
59
|
+
const EXPOSE_MAX = Math.round(BRANCH_TTL / 2.1)
|
|
60
|
+
const EXPOSE_TAU = 900_000
|
|
61
|
+
|
|
29
62
|
type Broadcast = bindings.Broadcast<Label>
|
package/source/const.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const BRANCH_TTL = 1_800_000
|
package/transpiled/Gateway.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export declare class Gateway extends Connector {
|
|
|
8
8
|
private readonly tree;
|
|
9
9
|
private readonly interceptor;
|
|
10
10
|
private readonly merged;
|
|
11
|
+
private lastMerge;
|
|
12
|
+
private resolveFirstMerge;
|
|
11
13
|
constructor(broadcast: Broadcast, tree: Tree, interception: Interception);
|
|
12
14
|
process(context: http.Context): Promise<http.OutgoingMessage>;
|
|
13
15
|
protected open(): Promise<void>;
|
|
@@ -16,6 +18,7 @@ export declare class Gateway extends Connector {
|
|
|
16
18
|
private call;
|
|
17
19
|
private explain;
|
|
18
20
|
private discover;
|
|
21
|
+
private settled;
|
|
19
22
|
private merge;
|
|
20
23
|
}
|
|
21
24
|
export type Broadcast = bindings.Broadcast<Label>;
|
package/transpiled/Gateway.js
CHANGED
|
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.Gateway = void 0;
|
|
30
30
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
31
|
+
const promises_1 = require("node:timers/promises");
|
|
31
32
|
const openspan_1 = require("openspan");
|
|
32
33
|
const core_1 = require("@toa.io/core");
|
|
33
34
|
const http = __importStar(require("./HTTP"));
|
|
@@ -37,6 +38,8 @@ class Gateway extends core_1.Connector {
|
|
|
37
38
|
tree;
|
|
38
39
|
interceptor;
|
|
39
40
|
merged = new Set();
|
|
41
|
+
lastMerge = 0;
|
|
42
|
+
resolveFirstMerge = null;
|
|
40
43
|
constructor(broadcast, tree, interception) {
|
|
41
44
|
super();
|
|
42
45
|
this.broadcast = broadcast;
|
|
@@ -104,20 +107,28 @@ class Gateway extends core_1.Connector {
|
|
|
104
107
|
return { body, headers };
|
|
105
108
|
}
|
|
106
109
|
async discover() {
|
|
110
|
+
const first = new Promise((resolve) => {
|
|
111
|
+
this.resolveFirstMerge = resolve;
|
|
112
|
+
});
|
|
107
113
|
await this.broadcast.receive('expose', this.merge.bind(this));
|
|
108
114
|
await this.broadcast.transmit('ping', null);
|
|
115
|
+
await this.settled(first);
|
|
109
116
|
}
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
component: branch.component,
|
|
116
|
-
version: branch.version
|
|
117
|
-
});
|
|
117
|
+
async settled(first) {
|
|
118
|
+
const deadline = Date.now() + SETTLE_TIMEOUT;
|
|
119
|
+
await Promise.race([first, (0, promises_1.setTimeout)(SETTLE_TIMEOUT)]);
|
|
120
|
+
if (this.lastMerge === 0) {
|
|
121
|
+
openspan_1.console.warn('Discovery timed out waiting for the first expose');
|
|
118
122
|
return;
|
|
119
123
|
}
|
|
120
|
-
|
|
124
|
+
while (Date.now() - this.lastMerge < SETTLE_QUIET) {
|
|
125
|
+
if (Date.now() >= deadline)
|
|
126
|
+
break;
|
|
127
|
+
await (0, promises_1.setTimeout)(SETTLE_POLL);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
merge(branch) {
|
|
131
|
+
const id = branch.namespace + '.' + branch.component + '@' + branch.version;
|
|
121
132
|
const attributes = {
|
|
122
133
|
namespace: branch.namespace,
|
|
123
134
|
component: branch.component,
|
|
@@ -125,13 +136,25 @@ class Gateway extends core_1.Connector {
|
|
|
125
136
|
};
|
|
126
137
|
try {
|
|
127
138
|
this.tree.merge(branch.node, branch);
|
|
128
|
-
openspan_1.console.info('Branch merged', attributes);
|
|
129
139
|
}
|
|
130
140
|
catch (exception) {
|
|
131
141
|
const message = exception instanceof Error ? exception.message : 'Unknown error';
|
|
132
142
|
openspan_1.console.error('Branch merge exception', { message, ...attributes });
|
|
143
|
+
return;
|
|
133
144
|
}
|
|
145
|
+
if (this.merged.has(id)) {
|
|
146
|
+
openspan_1.console.debug('Branch refreshed', attributes);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this.merged.add(id);
|
|
150
|
+
this.lastMerge = Date.now();
|
|
151
|
+
this.resolveFirstMerge?.();
|
|
152
|
+
this.resolveFirstMerge = null;
|
|
153
|
+
openspan_1.console.info('Branch merged', attributes);
|
|
134
154
|
}
|
|
135
155
|
}
|
|
136
156
|
exports.Gateway = Gateway;
|
|
157
|
+
const SETTLE_QUIET = 10_000;
|
|
158
|
+
const SETTLE_TIMEOUT = 30_000;
|
|
159
|
+
const SETTLE_POLL = 50;
|
|
137
160
|
//# sourceMappingURL=Gateway.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../source/Gateway.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgC;AAChC,uCAAkC;AAClC,uCAAuD;AACvD,6CAA8B;AAC9B,6CAAsC;AAMtC,MAAa,OAAQ,SAAQ,gBAAS;IACnB,SAAS,CAAW;IACpB,IAAI,CAAM;IACV,WAAW,CAAc;IACzB,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../source/Gateway.ts"],"names":[],"mappings":"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"}
|
package/transpiled/RTD/Node.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { type Match, type Parameter } from './Match';
|
|
|
4
4
|
export declare class Node {
|
|
5
5
|
intermediate: boolean;
|
|
6
6
|
forward: string | null;
|
|
7
|
+
expiration: number;
|
|
7
8
|
methods: Methods;
|
|
8
9
|
private readonly protected;
|
|
9
10
|
private routes;
|
|
@@ -19,4 +20,5 @@ export declare class Node {
|
|
|
19
20
|
export interface Properties {
|
|
20
21
|
protected: boolean;
|
|
21
22
|
forward?: string;
|
|
23
|
+
expiration?: number;
|
|
22
24
|
}
|
package/transpiled/RTD/Node.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.Node = void 0;
|
|
|
4
4
|
class Node {
|
|
5
5
|
intermediate;
|
|
6
6
|
forward;
|
|
7
|
+
expiration;
|
|
7
8
|
methods;
|
|
8
9
|
protected;
|
|
9
10
|
routes;
|
|
@@ -12,6 +13,7 @@ class Node {
|
|
|
12
13
|
this.methods = methods;
|
|
13
14
|
this.protected = properties.protected;
|
|
14
15
|
this.forward = properties.forward ?? null;
|
|
16
|
+
this.expiration = properties.expiration ?? Infinity;
|
|
15
17
|
this.intermediate = this.routes.findIndex((route) => route.root) !== -1;
|
|
16
18
|
this.sort();
|
|
17
19
|
}
|
|
@@ -43,6 +45,8 @@ class Node {
|
|
|
43
45
|
const methods = Object.values(this.methods);
|
|
44
46
|
this.routes = node.routes;
|
|
45
47
|
this.methods = node.methods;
|
|
48
|
+
this.expiration = node.expiration;
|
|
49
|
+
this.forward = node.forward;
|
|
46
50
|
// race condition is really unlikely
|
|
47
51
|
for (const method of methods)
|
|
48
52
|
void method.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Node.js","sourceRoot":"","sources":["../../source/RTD/Node.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Node.js","sourceRoot":"","sources":["../../source/RTD/Node.ts"],"names":[],"mappings":"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"}
|
package/transpiled/RTD/Route.js
CHANGED
|
@@ -18,6 +18,8 @@ class Route {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
match(fragments, parameters) {
|
|
21
|
+
if (Date.now() >= this.node.expiration)
|
|
22
|
+
return null;
|
|
21
23
|
for (let i = 0; i < this.segments.length; i++) {
|
|
22
24
|
const segment = this.segments[i];
|
|
23
25
|
if (segment.fragment !== null && segment.fragment !== fragments[i])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../../source/RTD/Route.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../../source/RTD/Route.ts"],"names":[],"mappings":"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"}
|
package/transpiled/RTD/Tree.js
CHANGED
|
@@ -11,8 +11,8 @@ class Tree {
|
|
|
11
11
|
constructor(node, endpoints, directives) {
|
|
12
12
|
this.endpoints = endpoints;
|
|
13
13
|
this.directives = directives;
|
|
14
|
-
this.trunk = this.createNode(node, PROTECTED);
|
|
15
14
|
this.root = node;
|
|
15
|
+
this.trunk = this.createNode(node, PROTECTED);
|
|
16
16
|
}
|
|
17
17
|
match(path) {
|
|
18
18
|
if (path === '/')
|
|
@@ -36,7 +36,7 @@ class Tree {
|
|
|
36
36
|
endpoints: this.endpoints,
|
|
37
37
|
directives: {
|
|
38
38
|
factory: this.directives,
|
|
39
|
-
stack: this.root
|
|
39
|
+
stack: this.root.directives ?? []
|
|
40
40
|
},
|
|
41
41
|
extension
|
|
42
42
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../source/RTD/Tree.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AACtC,uCAAoC;AAQpC,MAAa,IAAI;IACE,IAAI,CAAa;IACjB,KAAK,CAAM;IACX,SAAS,CAAkB;IAC3B,UAAU,CAAkB;IAE7C,YAAoB,IAAiB,EAAE,SAA2B,EAAE,UAA4B;QAC9F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../source/RTD/Tree.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AACtC,uCAAoC;AAQpC,MAAa,IAAI;IACE,IAAI,CAAa;IACjB,KAAK,CAAM;IACX,SAAS,CAAkB;IAC3B,UAAU,CAAkB;IAE7C,YAAoB,IAAiB,EAAE,SAA2B,EAAE,UAA4B;QAC9F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAEM,KAAK,CAAE,IAAY;QACxB,IAAI,IAAI,KAAK,GAAG;YACd,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,UAAU,EAAE,EAAE;aACf,CAAA;QAEH,MAAM,SAAS,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAA;QAEhC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAEM,KAAK,CAAE,IAAiB,EAAE,SAAkB;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAE3D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;IAEO,UAAU,CAAE,IAAiB,EAAE,OAAgB,EAAE,SAAmB;QAC1E,MAAM,OAAO,GAAY;YACvB,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE;gBACV,OAAO,EAAE,IAAI,CAAC,UAAU;gBACxB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE;aAClC;YACD,SAAS;SACV,CAAA;QAED,OAAO,IAAA,oBAAU,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;CACF;AAhDD,oBAgDC;AAED,MAAM,SAAS,GAAG,IAAI,CAAA"}
|