velocious 1.0.556 → 1.0.558
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/README.md +16 -2
- package/build/background-jobs/forked-runner-child.js +20 -2
- package/build/background-jobs/main.js +35 -12
- package/build/background-jobs/pooled-runner-child.js +20 -2
- package/build/background-jobs/runner-graceful-shutdown.js +73 -0
- package/build/background-jobs/worker.js +53 -28
- package/build/configuration.js +77 -12
- package/build/database/advisory-lock-runner.js +12 -3
- package/build/database/record/index.js +12 -0
- package/build/frontend-models/base.js +192 -41
- package/build/http-client/websocket-client.js +48 -0
- package/build/src/background-jobs/forked-runner-child.js +20 -3
- package/build/src/background-jobs/main.d.ts +14 -1
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +37 -14
- package/build/src/background-jobs/pooled-runner-child.js +19 -3
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts +49 -0
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -0
- package/build/src/background-jobs/runner-graceful-shutdown.js +70 -0
- package/build/src/background-jobs/worker.d.ts +18 -1
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +55 -31
- package/build/src/configuration.d.ts +29 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +71 -11
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/advisory-lock-runner.js +12 -4
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +9 -1
- package/build/src/frontend-models/base.d.ts +13 -4
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +173 -44
- package/build/src/http-client/websocket-client.d.ts +3 -0
- package/build/src/http-client/websocket-client.d.ts.map +1 -1
- package/build/src/http-client/websocket-client.js +42 -1
- package/build/src/tenants/tenant.d.ts +20 -9
- package/build/src/tenants/tenant.d.ts.map +1 -1
- package/build/src/tenants/tenant.js +47 -12
- package/build/src/testing/factory/factory-registry.d.ts +22 -3
- package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
- package/build/src/testing/factory/factory-registry.js +32 -9
- package/build/src/testing/factory/factory-runner.d.ts +16 -4
- package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
- package/build/src/testing/factory/factory-runner.js +33 -10
- package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
- package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
- package/build/src/utils/shutdown-lifecycle.js +36 -0
- package/build/tenants/tenant.js +51 -11
- package/build/testing/factory/factory-registry.js +33 -8
- package/build/testing/factory/factory-runner.js +38 -12
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/shutdown-lifecycle.js +41 -0
- package/package.json +5 -4
- package/src/background-jobs/forked-runner-child.js +20 -2
- package/src/background-jobs/main.js +35 -12
- package/src/background-jobs/pooled-runner-child.js +20 -2
- package/src/background-jobs/runner-graceful-shutdown.js +73 -0
- package/src/background-jobs/worker.js +53 -28
- package/src/configuration.js +77 -12
- package/src/database/advisory-lock-runner.js +12 -3
- package/src/database/record/index.js +12 -0
- package/src/frontend-models/base.js +192 -41
- package/src/http-client/websocket-client.js +48 -0
- package/src/tenants/tenant.js +51 -11
- package/src/testing/factory/factory-registry.js +33 -8
- package/src/testing/factory/factory-runner.js +38 -12
- package/src/utils/shutdown-lifecycle.js +41 -0
|
@@ -48,6 +48,16 @@ export default class FactoryRunner {
|
|
|
48
48
|
* @returns {CompiledPlan} - The compiled plan.
|
|
49
49
|
*/
|
|
50
50
|
compile(factoryName, requestedTraits, overrides) {
|
|
51
|
+
return this.applyOverrides(this.compileTemplate(factoryName, requestedTraits), overrides)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Compiles inheritance, traits and declarations without call-site overrides.
|
|
56
|
+
* @param {string} factoryName - Factory to run.
|
|
57
|
+
* @param {string[]} requestedTraits - Traits requested at the call site, in order.
|
|
58
|
+
* @returns {CompiledPlan} - Reusable declaration plan.
|
|
59
|
+
*/
|
|
60
|
+
compileTemplate(factoryName, requestedTraits) {
|
|
51
61
|
const chain = this._resolveChain(factoryName)
|
|
52
62
|
const target = chain[chain.length - 1]
|
|
53
63
|
const modelClass = this._resolveModelClass(chain)
|
|
@@ -67,7 +77,31 @@ export default class FactoryRunner {
|
|
|
67
77
|
this._expandTrait(traitName, target, flattened, [])
|
|
68
78
|
}
|
|
69
79
|
|
|
70
|
-
return this._buildPlan({flattened,
|
|
80
|
+
return this._buildPlan({flattened, modelClass, target, chainNames: chain.map((definition) => definition.name)})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Applies the current call-site overrides without mutating the reusable template.
|
|
85
|
+
* @param {CompiledPlan} planTemplate - Reusable declaration plan.
|
|
86
|
+
* @param {Record<string, ?>} overrides - Current call-site overrides.
|
|
87
|
+
* @returns {CompiledPlan} - Per-invocation plan.
|
|
88
|
+
*/
|
|
89
|
+
applyOverrides(planTemplate, overrides) {
|
|
90
|
+
const overrideKeys = Object.keys(overrides)
|
|
91
|
+
|
|
92
|
+
if (overrideKeys.length === 0) return planTemplate
|
|
93
|
+
|
|
94
|
+
const resolved = new Map(planTemplate.resolved)
|
|
95
|
+
|
|
96
|
+
for (const key of overrideKeys) {
|
|
97
|
+
const prior = resolved.get(key)
|
|
98
|
+
|
|
99
|
+
resolved.set(key, {slotKind: prior ? prior.slotKind : "attribute", value: overrides[key], isOverride: true})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
this._arbitrateAssociationOverrides(resolved, overrides, planTemplate.modelClass)
|
|
103
|
+
|
|
104
|
+
return {...planTemplate, resolved}
|
|
71
105
|
}
|
|
72
106
|
|
|
73
107
|
/**
|
|
@@ -193,16 +227,15 @@ export default class FactoryRunner {
|
|
|
193
227
|
}
|
|
194
228
|
|
|
195
229
|
/**
|
|
196
|
-
* Folds flattened declarations
|
|
230
|
+
* Folds flattened declarations into a reusable compiled plan.
|
|
197
231
|
* @param {object} args - Options.
|
|
198
232
|
* @param {Array<{decl: import("./declarations.js").Declaration}>} args.flattened - Flattened declarations.
|
|
199
|
-
* @param {Record<string, ?>} args.overrides - Call-site overrides.
|
|
200
233
|
* @param {(new (attributes?: Record<string, ?>) => ?) | null} args.modelClass - Resolved model class.
|
|
201
234
|
* @param {import("./factory-definition.js").default} args.target - Target factory definition.
|
|
202
235
|
* @param {string[]} args.chainNames - Inheritance chain names.
|
|
203
236
|
* @returns {CompiledPlan} - The compiled plan.
|
|
204
237
|
*/
|
|
205
|
-
_buildPlan({flattened,
|
|
238
|
+
_buildPlan({flattened, modelClass, target, chainNames}) {
|
|
206
239
|
/** @type {Map<string, Slot>} */
|
|
207
240
|
const resolved = new Map()
|
|
208
241
|
/** @type {Map<string, import("./declarations.js").CallbackDeclaration[]>} */
|
|
@@ -238,14 +271,6 @@ export default class FactoryRunner {
|
|
|
238
271
|
}
|
|
239
272
|
}
|
|
240
273
|
|
|
241
|
-
for (const key of Object.keys(overrides)) {
|
|
242
|
-
const prior = resolved.get(key)
|
|
243
|
-
|
|
244
|
-
resolved.set(key, {slotKind: prior ? prior.slotKind : "attribute", value: overrides[key], isOverride: true})
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
this._arbitrateAssociationOverrides(resolved, overrides, modelClass)
|
|
248
|
-
|
|
249
274
|
return {
|
|
250
275
|
factoryName: target.name,
|
|
251
276
|
factoryDefinition: target,
|
|
@@ -269,6 +294,7 @@ export default class FactoryRunner {
|
|
|
269
294
|
* @returns {void}
|
|
270
295
|
*/
|
|
271
296
|
_arbitrateAssociationOverrides(resolved, overrides, modelClass) {
|
|
297
|
+
if (Object.keys(overrides).length === 0) return
|
|
272
298
|
if (typeof modelClass !== "function" || !(modelClass.prototype instanceof DatabaseRecord)) return
|
|
273
299
|
|
|
274
300
|
const backendModelClass = /** @type {typeof DatabaseRecord} */ (modelClass)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runs service shutdown and its completion hook while preserving both failures.
|
|
5
|
+
* @param {object} args - Lifecycle callbacks.
|
|
6
|
+
* @param {() => Promise<void>} args.shutdown - Primary service shutdown.
|
|
7
|
+
* @param {() => void | Promise<void>} [args.onStopped] - Completion hook.
|
|
8
|
+
* @returns {Promise<void>} - Resolves after shutdown and the hook finish.
|
|
9
|
+
*/
|
|
10
|
+
export default async function shutdownLifecycle({shutdown, onStopped}) {
|
|
11
|
+
let shutdownFailed = false
|
|
12
|
+
let shutdownError
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
await shutdown()
|
|
16
|
+
} catch (error) {
|
|
17
|
+
shutdownFailed = true
|
|
18
|
+
shutdownError = error
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let hookFailed = false
|
|
22
|
+
let hookError
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
await onStopped?.()
|
|
26
|
+
} catch (error) {
|
|
27
|
+
hookFailed = true
|
|
28
|
+
hookError = error
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (shutdownFailed && hookFailed) {
|
|
32
|
+
throw new AggregateError(
|
|
33
|
+
[shutdownError, hookError],
|
|
34
|
+
"Service shutdown and onStopped hook failed",
|
|
35
|
+
{cause: shutdownError}
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (hookFailed) throw hookError
|
|
40
|
+
if (shutdownFailed) throw shutdownError
|
|
41
|
+
}
|