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.
Files changed (67) hide show
  1. package/README.md +16 -2
  2. package/build/background-jobs/forked-runner-child.js +20 -2
  3. package/build/background-jobs/main.js +35 -12
  4. package/build/background-jobs/pooled-runner-child.js +20 -2
  5. package/build/background-jobs/runner-graceful-shutdown.js +73 -0
  6. package/build/background-jobs/worker.js +53 -28
  7. package/build/configuration.js +77 -12
  8. package/build/database/advisory-lock-runner.js +12 -3
  9. package/build/database/record/index.js +12 -0
  10. package/build/frontend-models/base.js +192 -41
  11. package/build/http-client/websocket-client.js +48 -0
  12. package/build/src/background-jobs/forked-runner-child.js +20 -3
  13. package/build/src/background-jobs/main.d.ts +14 -1
  14. package/build/src/background-jobs/main.d.ts.map +1 -1
  15. package/build/src/background-jobs/main.js +37 -14
  16. package/build/src/background-jobs/pooled-runner-child.js +19 -3
  17. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +49 -0
  18. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -0
  19. package/build/src/background-jobs/runner-graceful-shutdown.js +70 -0
  20. package/build/src/background-jobs/worker.d.ts +18 -1
  21. package/build/src/background-jobs/worker.d.ts.map +1 -1
  22. package/build/src/background-jobs/worker.js +55 -31
  23. package/build/src/configuration.d.ts +29 -0
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +71 -11
  26. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  27. package/build/src/database/advisory-lock-runner.js +12 -4
  28. package/build/src/database/record/index.d.ts.map +1 -1
  29. package/build/src/database/record/index.js +9 -1
  30. package/build/src/frontend-models/base.d.ts +13 -4
  31. package/build/src/frontend-models/base.d.ts.map +1 -1
  32. package/build/src/frontend-models/base.js +173 -44
  33. package/build/src/http-client/websocket-client.d.ts +3 -0
  34. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  35. package/build/src/http-client/websocket-client.js +42 -1
  36. package/build/src/tenants/tenant.d.ts +20 -9
  37. package/build/src/tenants/tenant.d.ts.map +1 -1
  38. package/build/src/tenants/tenant.js +47 -12
  39. package/build/src/testing/factory/factory-registry.d.ts +22 -3
  40. package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
  41. package/build/src/testing/factory/factory-registry.js +32 -9
  42. package/build/src/testing/factory/factory-runner.d.ts +16 -4
  43. package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
  44. package/build/src/testing/factory/factory-runner.js +33 -10
  45. package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
  46. package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
  47. package/build/src/utils/shutdown-lifecycle.js +36 -0
  48. package/build/tenants/tenant.js +51 -11
  49. package/build/testing/factory/factory-registry.js +33 -8
  50. package/build/testing/factory/factory-runner.js +38 -12
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/utils/shutdown-lifecycle.js +41 -0
  53. package/package.json +5 -4
  54. package/src/background-jobs/forked-runner-child.js +20 -2
  55. package/src/background-jobs/main.js +35 -12
  56. package/src/background-jobs/pooled-runner-child.js +20 -2
  57. package/src/background-jobs/runner-graceful-shutdown.js +73 -0
  58. package/src/background-jobs/worker.js +53 -28
  59. package/src/configuration.js +77 -12
  60. package/src/database/advisory-lock-runner.js +12 -3
  61. package/src/database/record/index.js +12 -0
  62. package/src/frontend-models/base.js +192 -41
  63. package/src/http-client/websocket-client.js +48 -0
  64. package/src/tenants/tenant.js +51 -11
  65. package/src/testing/factory/factory-registry.js +33 -8
  66. package/src/testing/factory/factory-runner.js +38 -12
  67. 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, overrides, modelClass, target, chainNames: chain.map((definition) => definition.name)})
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 plus overrides into a compiled plan.
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, overrides, modelClass, target, chainNames}) {
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
+ }