solid-objects 0.12.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.
Files changed (187) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/MIT-LICENSE +19 -0
  3. package/README.md +958 -0
  4. package/dist/actor.d.ts +81 -0
  5. package/dist/actor.d.ts.map +1 -0
  6. package/dist/actor.js +141 -0
  7. package/dist/actor.js.map +1 -0
  8. package/dist/application-database.d.ts +3 -0
  9. package/dist/application-database.d.ts.map +1 -0
  10. package/dist/application-database.js +59 -0
  11. package/dist/application-database.js.map +1 -0
  12. package/dist/broadcast-worker.d.ts +18 -0
  13. package/dist/broadcast-worker.d.ts.map +1 -0
  14. package/dist/broadcast-worker.js +74 -0
  15. package/dist/broadcast-worker.js.map +1 -0
  16. package/dist/browser/components.d.ts +64 -0
  17. package/dist/browser/components.d.ts.map +1 -0
  18. package/dist/browser/components.js +294 -0
  19. package/dist/browser/components.js.map +1 -0
  20. package/dist/browser/index.d.ts +46 -0
  21. package/dist/browser/index.d.ts.map +1 -0
  22. package/dist/browser/index.js +207 -0
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/cli.d.ts +9 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +216 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/configuration.d.ts +96 -0
  29. package/dist/configuration.d.ts.map +1 -0
  30. package/dist/configuration.js +169 -0
  31. package/dist/configuration.js.map +1 -0
  32. package/dist/context.d.ts +20 -0
  33. package/dist/context.d.ts.map +1 -0
  34. package/dist/context.js +24 -0
  35. package/dist/context.js.map +1 -0
  36. package/dist/database/deadline.d.ts +9 -0
  37. package/dist/database/deadline.d.ts.map +1 -0
  38. package/dist/database/deadline.js +49 -0
  39. package/dist/database/deadline.js.map +1 -0
  40. package/dist/database/mysql.d.ts +21 -0
  41. package/dist/database/mysql.d.ts.map +1 -0
  42. package/dist/database/mysql.js +192 -0
  43. package/dist/database/mysql.js.map +1 -0
  44. package/dist/database/postgresql-sql.d.ts +2 -0
  45. package/dist/database/postgresql-sql.d.ts.map +1 -0
  46. package/dist/database/postgresql-sql.js +102 -0
  47. package/dist/database/postgresql-sql.js.map +1 -0
  48. package/dist/database/postgresql.d.ts +31 -0
  49. package/dist/database/postgresql.d.ts.map +1 -0
  50. package/dist/database/postgresql.js +172 -0
  51. package/dist/database/postgresql.js.map +1 -0
  52. package/dist/database/sqlite.d.ts +27 -0
  53. package/dist/database/sqlite.d.ts.map +1 -0
  54. package/dist/database/sqlite.js +190 -0
  55. package/dist/database/sqlite.js.map +1 -0
  56. package/dist/database/transaction-context.d.ts +3 -0
  57. package/dist/database/transaction-context.d.ts.map +1 -0
  58. package/dist/database/transaction-context.js +19 -0
  59. package/dist/database/transaction-context.js.map +1 -0
  60. package/dist/database/types.d.ts +20 -0
  61. package/dist/database/types.d.ts.map +1 -0
  62. package/dist/database/types.js +2 -0
  63. package/dist/database/types.js.map +1 -0
  64. package/dist/dead-letters.d.ts +23 -0
  65. package/dist/dead-letters.d.ts.map +1 -0
  66. package/dist/dead-letters.js +13 -0
  67. package/dist/dead-letters.js.map +1 -0
  68. package/dist/default-runtime.d.ts +5 -0
  69. package/dist/default-runtime.d.ts.map +1 -0
  70. package/dist/default-runtime.js +14 -0
  71. package/dist/default-runtime.js.map +1 -0
  72. package/dist/definition.d.ts +32 -0
  73. package/dist/definition.d.ts.map +1 -0
  74. package/dist/definition.js +173 -0
  75. package/dist/definition.js.map +1 -0
  76. package/dist/doctor.d.ts +32 -0
  77. package/dist/doctor.d.ts.map +1 -0
  78. package/dist/doctor.js +500 -0
  79. package/dist/doctor.js.map +1 -0
  80. package/dist/effect-worker.d.ts +18 -0
  81. package/dist/effect-worker.d.ts.map +1 -0
  82. package/dist/effect-worker.js +74 -0
  83. package/dist/effect-worker.js.map +1 -0
  84. package/dist/errors.d.ts +145 -0
  85. package/dist/errors.d.ts.map +1 -0
  86. package/dist/errors.js +120 -0
  87. package/dist/errors.js.map +1 -0
  88. package/dist/executable.d.ts +3 -0
  89. package/dist/executable.d.ts.map +1 -0
  90. package/dist/executable.js +12 -0
  91. package/dist/executable.js.map +1 -0
  92. package/dist/index.d.ts +24 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +21 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/maintenance-scheduler.d.ts +17 -0
  97. package/dist/maintenance-scheduler.d.ts.map +1 -0
  98. package/dist/maintenance-scheduler.js +41 -0
  99. package/dist/maintenance-scheduler.js.map +1 -0
  100. package/dist/process-administration.d.ts +30 -0
  101. package/dist/process-administration.d.ts.map +1 -0
  102. package/dist/process-administration.js +13 -0
  103. package/dist/process-administration.js.map +1 -0
  104. package/dist/realtime.d.ts +33 -0
  105. package/dist/realtime.d.ts.map +1 -0
  106. package/dist/realtime.js +238 -0
  107. package/dist/realtime.js.map +1 -0
  108. package/dist/reconciliation.d.ts +41 -0
  109. package/dist/reconciliation.d.ts.map +1 -0
  110. package/dist/reconciliation.js +19 -0
  111. package/dist/reconciliation.js.map +1 -0
  112. package/dist/records.d.ts +137 -0
  113. package/dist/records.d.ts.map +1 -0
  114. package/dist/records.js +2 -0
  115. package/dist/records.js.map +1 -0
  116. package/dist/reference.d.ts +97 -0
  117. package/dist/reference.d.ts.map +1 -0
  118. package/dist/reference.js +157 -0
  119. package/dist/reference.js.map +1 -0
  120. package/dist/reminder-administration.d.ts +35 -0
  121. package/dist/reminder-administration.d.ts.map +1 -0
  122. package/dist/reminder-administration.js +13 -0
  123. package/dist/reminder-administration.js.map +1 -0
  124. package/dist/reminder-scheduler.d.ts +18 -0
  125. package/dist/reminder-scheduler.d.ts.map +1 -0
  126. package/dist/reminder-scheduler.js +88 -0
  127. package/dist/reminder-scheduler.js.map +1 -0
  128. package/dist/repository.d.ts +142 -0
  129. package/dist/repository.d.ts.map +1 -0
  130. package/dist/repository.js +1237 -0
  131. package/dist/repository.js.map +1 -0
  132. package/dist/retention.d.ts +17 -0
  133. package/dist/retention.d.ts.map +1 -0
  134. package/dist/retention.js +13 -0
  135. package/dist/retention.js.map +1 -0
  136. package/dist/runtime.d.ts +140 -0
  137. package/dist/runtime.d.ts.map +1 -0
  138. package/dist/runtime.js +1737 -0
  139. package/dist/runtime.js.map +1 -0
  140. package/dist/schema.d.ts +8 -0
  141. package/dist/schema.d.ts.map +1 -0
  142. package/dist/schema.js +260 -0
  143. package/dist/schema.js.map +1 -0
  144. package/dist/serialization.d.ts +11 -0
  145. package/dist/serialization.d.ts.map +1 -0
  146. package/dist/serialization.js +82 -0
  147. package/dist/serialization.js.map +1 -0
  148. package/dist/test-helper.d.ts +15 -0
  149. package/dist/test-helper.d.ts.map +1 -0
  150. package/dist/test-helper.js +69 -0
  151. package/dist/test-helper.js.map +1 -0
  152. package/dist/types.d.ts +71 -0
  153. package/dist/types.d.ts.map +1 -0
  154. package/dist/types.js +2 -0
  155. package/dist/types.js.map +1 -0
  156. package/dist/version.d.ts +2 -0
  157. package/dist/version.d.ts.map +1 -0
  158. package/dist/version.js +2 -0
  159. package/dist/version.js.map +1 -0
  160. package/dist/wake-up/postgresql.d.ts +42 -0
  161. package/dist/wake-up/postgresql.d.ts.map +1 -0
  162. package/dist/wake-up/postgresql.js +234 -0
  163. package/dist/wake-up/postgresql.js.map +1 -0
  164. package/dist/wake-up/redis.d.ts +35 -0
  165. package/dist/wake-up/redis.d.ts.map +1 -0
  166. package/dist/wake-up/redis.js +151 -0
  167. package/dist/wake-up/redis.js.map +1 -0
  168. package/dist/wake-up.d.ts +24 -0
  169. package/dist/wake-up.d.ts.map +1 -0
  170. package/dist/wake-up.js +66 -0
  171. package/dist/wake-up.js.map +1 -0
  172. package/dist/worker.d.ts +36 -0
  173. package/dist/worker.d.ts.map +1 -0
  174. package/dist/worker.js +281 -0
  175. package/dist/worker.js.map +1 -0
  176. package/docs/api.md +197 -0
  177. package/docs/architecture.md +113 -0
  178. package/docs/authorization.md +31 -0
  179. package/docs/browser-protocol.md +93 -0
  180. package/docs/configuration.md +168 -0
  181. package/docs/correctness.md +53 -0
  182. package/docs/errors-and-recovery.md +89 -0
  183. package/docs/operations.md +170 -0
  184. package/docs/parity.md +94 -0
  185. package/docs/releasing.md +45 -0
  186. package/docs/state-and-lifecycle.md +162 -0
  187. package/package.json +100 -0
@@ -0,0 +1,66 @@
1
+ export class InProcessWakeUpAdapter {
2
+ generations = new Map();
3
+ waiters = new Map();
4
+ closed = false;
5
+ watch(role) {
6
+ const generation = this.generation(role);
7
+ return {
8
+ wait: (options) => this.wait({ role, generation, ...options }),
9
+ };
10
+ }
11
+ notify(role) {
12
+ if (this.closed)
13
+ return;
14
+ this.generations.set(role, this.generation(role) + 1);
15
+ const waiters = this.waiters.get(role);
16
+ if (!waiters)
17
+ return;
18
+ this.waiters.delete(role);
19
+ for (const wake of waiters)
20
+ wake();
21
+ }
22
+ close() {
23
+ if (this.closed)
24
+ return;
25
+ this.closed = true;
26
+ for (const waiters of this.waiters.values()) {
27
+ for (const wake of waiters)
28
+ wake();
29
+ }
30
+ this.waiters.clear();
31
+ }
32
+ wait(options) {
33
+ if (this.closed || options.signal?.aborted)
34
+ return Promise.resolve();
35
+ if (this.generation(options.role) !== options.generation)
36
+ return Promise.resolve();
37
+ return new Promise((resolve) => {
38
+ let settled = false;
39
+ const waiters = this.waiters.get(options.role) ?? new Set();
40
+ const finish = () => {
41
+ if (settled)
42
+ return;
43
+ settled = true;
44
+ clearTimeout(timeout);
45
+ waiters.delete(finish);
46
+ if (waiters.size === 0)
47
+ this.waiters.delete(options.role);
48
+ options.signal?.removeEventListener("abort", finish);
49
+ resolve();
50
+ };
51
+ const timeout = setTimeout(finish, options.timeoutMilliseconds);
52
+ waiters.add(finish);
53
+ this.waiters.set(options.role, waiters);
54
+ options.signal?.addEventListener("abort", finish, { once: true });
55
+ if (this.closed ||
56
+ options.signal?.aborted ||
57
+ this.generation(options.role) !== options.generation) {
58
+ finish();
59
+ }
60
+ });
61
+ }
62
+ generation(role) {
63
+ return this.generations.get(role) ?? 0;
64
+ }
65
+ }
66
+ //# sourceMappingURL=wake-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wake-up.js","sourceRoot":"","sources":["../src/wake-up.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,sBAAsB;IAChB,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC3C,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAA;IACzD,MAAM,GAAG,KAAK,CAAA;IAEtB,KAAK,CAAC,IAAgB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxC,OAAO;YACL,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;SAC/D,CAAA;IACH,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACzB,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,IAAI,EAAE,CAAA;QACpC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAEO,IAAI,CAAC,OAKZ;QACC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QACpE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,UAAU;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAElF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;YAC3D,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,OAAO;oBAAE,OAAM;gBACnB,OAAO,GAAG,IAAI,CAAA;gBACd,YAAY,CAAC,OAAO,CAAC,CAAA;gBACrB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACtB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACzD,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBACpD,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;YAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YACvC,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACjE,IACE,IAAI,CAAC,MAAM;gBACX,OAAO,CAAC,MAAM,EAAE,OAAO;gBACvB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,UAAU,EACpD,CAAC;gBACD,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,UAAU,CAAC,IAAgB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type { SolidObjectsRuntime } from "./runtime.js";
2
+ export declare class Worker {
3
+ private readonly runtime;
4
+ private readonly options;
5
+ readonly processId: `${string}-${string}-${string}-${string}-${string}`;
6
+ private registered;
7
+ private stopping;
8
+ private readonly activations;
9
+ constructor(runtime: SolidObjectsRuntime, options?: {
10
+ setupFailure?: "report" | "throw";
11
+ });
12
+ runOnce(options?: {
13
+ activationRetention?: "retain" | "release";
14
+ }): Promise<number>;
15
+ runUntilIdle(options?: {
16
+ maxTurns?: number;
17
+ }): Promise<number>;
18
+ run(signal: AbortSignal): Promise<void>;
19
+ requestShutdown(): void;
20
+ stopped(): boolean;
21
+ stop(): Promise<void>;
22
+ private releaseCachedActivations;
23
+ private ensureRegistered;
24
+ private claimCachedActivation;
25
+ private maintainCachedActivations;
26
+ private releaseActivation;
27
+ private releaseFailedSetup;
28
+ private reportSetupFailure;
29
+ }
30
+ export declare function waitFor(milliseconds: number, signal?: AbortSignal): Promise<void>;
31
+ export declare function withProcessHeartbeat<Result>(options: {
32
+ runtime: SolidObjectsRuntime;
33
+ processId: string;
34
+ operation: () => Promise<Result>;
35
+ }): Promise<Result>;
36
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AASvD,qBAAa,MAAM;IAOf,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,QAAQ,CAAC,SAAS,sDAAe;IACjC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBAG/C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;KAAO;IAGhE,OAAO,CAAC,OAAO,GAAE;QAAE,mBAAmB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAyEtF,YAAY,CAAC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAelE,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7C,eAAe,IAAI,IAAI;IAIvB,OAAO,IAAI,OAAO;IAIZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,wBAAwB;YAUxB,gBAAgB;YAMhB,qBAAqB;YAUrB,yBAAyB;YA6BzB,iBAAiB;YASjB,kBAAkB;IAQhC,OAAO,CAAC,kBAAkB;CAgB3B;AAmBD,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE;IAC1D,OAAO,EAAE,mBAAmB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB"}
package/dist/worker.js ADDED
@@ -0,0 +1,281 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { ActorSetupFailed, ApplicationWriteForbidden, LostActivation, StateMigrationError, } from "./errors.js";
3
+ export class Worker {
4
+ runtime;
5
+ options;
6
+ processId = randomUUID();
7
+ registered = false;
8
+ stopping = false;
9
+ activations = new Map();
10
+ constructor(runtime, options = {}) {
11
+ this.runtime = runtime;
12
+ this.options = options;
13
+ }
14
+ async runOnce(options = {}) {
15
+ try {
16
+ if (this.stopping)
17
+ return 0;
18
+ await this.ensureRegistered();
19
+ await this.runtime.repository.heartbeatProcess(this.processId);
20
+ await this.maintainCachedActivations();
21
+ let cached = await this.claimCachedActivation();
22
+ let turn = cached?.turn ?? (await this.runtime.repository.claim(this.processId));
23
+ if (!turn)
24
+ return 0;
25
+ let processed = 0;
26
+ const passStartedAt = performance.now();
27
+ let passExhausted = false;
28
+ while (turn) {
29
+ let execution;
30
+ try {
31
+ execution = await this.runtime.executeTurn(turn, cached?.actor);
32
+ }
33
+ catch (error) {
34
+ if (!(error instanceof ActorSetupFailed))
35
+ throw error;
36
+ await this.releaseFailedSetup(turn);
37
+ if (this.options.setupFailure === "throw")
38
+ throw error.setupError;
39
+ if (!isControlledSetupFailure(error.setupError))
40
+ throw error.setupError;
41
+ this.reportSetupFailure(turn, error.setupError);
42
+ return processed;
43
+ }
44
+ processed += 1;
45
+ if (!execution.retainActivation || !execution.actor) {
46
+ await this.releaseActivation({
47
+ turn,
48
+ ...(execution.actor === undefined ? {} : { actor: execution.actor }),
49
+ lifecycle: execution.activated ? "activated" : "unactivated",
50
+ });
51
+ return processed;
52
+ }
53
+ const now = performance.now();
54
+ cached = {
55
+ actor: execution.actor,
56
+ turn,
57
+ lastUsedAt: now,
58
+ renewAt: now + this.runtime.settings.leaseRenewalIntervalMilliseconds,
59
+ };
60
+ this.activations.set(turn.instance.id, cached);
61
+ passExhausted =
62
+ processed >= this.runtime.settings.maxMessagesPerActivationPass ||
63
+ performance.now() - passStartedAt >=
64
+ this.runtime.settings.maxActivationDurationMilliseconds;
65
+ if (passExhausted)
66
+ break;
67
+ turn = await this.runtime.repository.claim(this.processId, {
68
+ activation: activationLease(cached.turn),
69
+ });
70
+ }
71
+ if (passExhausted) {
72
+ if (!cached)
73
+ return processed;
74
+ const yielded = await this.runtime.repository.yieldReadyMessages(cached.turn.instance.id);
75
+ if (yielded > 0) {
76
+ this.runtime.emitInstrumentation("activation.yielded", {
77
+ actorType: cached.turn.message.actor_type,
78
+ actorId: cached.turn.message.actor_id,
79
+ processed,
80
+ readyMessages: yielded,
81
+ });
82
+ }
83
+ await this.releaseActivation({
84
+ turn: cached.turn,
85
+ actor: cached.actor,
86
+ lifecycle: "activated",
87
+ });
88
+ }
89
+ return processed;
90
+ }
91
+ finally {
92
+ if (options.activationRetention === "release")
93
+ await this.releaseCachedActivations();
94
+ }
95
+ }
96
+ async runUntilIdle(options = {}) {
97
+ const maxTurns = options.maxTurns ?? 10_000;
98
+ let processed = 0;
99
+ try {
100
+ while (!this.stopping && processed < maxTurns) {
101
+ const count = await this.runOnce();
102
+ if (count === 0)
103
+ break;
104
+ processed += count;
105
+ }
106
+ return processed;
107
+ }
108
+ finally {
109
+ await this.releaseCachedActivations();
110
+ }
111
+ }
112
+ async run(signal) {
113
+ await this.ensureRegistered();
114
+ while (!signal.aborted && !this.stopping) {
115
+ const wakeUp = await this.runtime.settings.wakeUp.watch("actors");
116
+ const processed = await this.runOnce();
117
+ if (processed === 0) {
118
+ await wakeUp.wait({
119
+ timeoutMilliseconds: Math.min(this.runtime.settings.pollingIntervalMilliseconds, this.runtime.settings.leaseRenewalIntervalMilliseconds),
120
+ signal,
121
+ });
122
+ }
123
+ }
124
+ await this.stop();
125
+ }
126
+ requestShutdown() {
127
+ this.stopping = true;
128
+ }
129
+ stopped() {
130
+ return this.stopping;
131
+ }
132
+ async stop() {
133
+ if (this.stopping && !this.registered)
134
+ return;
135
+ this.stopping = true;
136
+ if (this.registered)
137
+ await this.runtime.repository.startDrainingProcess(this.processId);
138
+ await this.releaseCachedActivations();
139
+ if (this.registered) {
140
+ await this.runtime.repository.stopProcess(this.processId);
141
+ this.registered = false;
142
+ }
143
+ }
144
+ async releaseCachedActivations() {
145
+ for (const activation of [...this.activations.values()]) {
146
+ await this.releaseActivation({
147
+ turn: activation.turn,
148
+ actor: activation.actor,
149
+ lifecycle: "activated",
150
+ });
151
+ }
152
+ }
153
+ async ensureRegistered() {
154
+ if (this.registered)
155
+ return;
156
+ await this.runtime.repository.registerProcess(this.processId, "worker");
157
+ this.registered = true;
158
+ }
159
+ async claimCachedActivation() {
160
+ for (const activation of this.activations.values()) {
161
+ const turn = await this.runtime.repository.claim(this.processId, {
162
+ activation: activationLease(activation.turn),
163
+ });
164
+ if (turn)
165
+ return { ...activation, turn };
166
+ }
167
+ return undefined;
168
+ }
169
+ async maintainCachedActivations() {
170
+ const now = performance.now();
171
+ for (const activation of [...this.activations.values()]) {
172
+ if (now - activation.lastUsedAt >=
173
+ this.runtime.settings.idleDeactivationTimeoutMilliseconds) {
174
+ await this.releaseActivation({
175
+ turn: activation.turn,
176
+ actor: activation.actor,
177
+ lifecycle: "activated",
178
+ });
179
+ continue;
180
+ }
181
+ if (now < activation.renewAt)
182
+ continue;
183
+ try {
184
+ await this.runtime.repository.renewActivation(activationLease(activation.turn));
185
+ activation.renewAt = now + this.runtime.settings.leaseRenewalIntervalMilliseconds;
186
+ }
187
+ catch (error) {
188
+ if (!(error instanceof LostActivation))
189
+ throw error;
190
+ await this.releaseActivation({
191
+ turn: activation.turn,
192
+ actor: activation.actor,
193
+ lifecycle: "activated",
194
+ });
195
+ }
196
+ }
197
+ }
198
+ async releaseActivation(options) {
199
+ this.activations.delete(options.turn.instance.id);
200
+ await this.runtime.deactivateActor(options);
201
+ }
202
+ async releaseFailedSetup(turn) {
203
+ try {
204
+ await this.runtime.repository.releaseFailedTurnSetup(turn);
205
+ }
206
+ catch (error) {
207
+ if (!(error instanceof LostActivation))
208
+ throw error;
209
+ }
210
+ }
211
+ reportSetupFailure(turn, error) {
212
+ const errorName = error instanceof Error ? error.name : "Error";
213
+ this.runtime.emitInstrumentation("worker.setup_failed", {
214
+ actorType: turn.message.actor_type,
215
+ actorId: turn.message.actor_id,
216
+ operation: turn.message.operation,
217
+ errorName,
218
+ });
219
+ this.runtime.settings.logger.error({
220
+ event: "solid_objects.worker.setup_failed",
221
+ actorType: turn.message.actor_type,
222
+ actorId: turn.message.actor_id,
223
+ operation: turn.message.operation,
224
+ errorName,
225
+ });
226
+ }
227
+ }
228
+ function isControlledSetupFailure(error) {
229
+ return (error instanceof StateMigrationError ||
230
+ error instanceof ApplicationWriteForbidden ||
231
+ error instanceof LostActivation);
232
+ }
233
+ function activationLease(turn) {
234
+ return {
235
+ instanceId: turn.instance.id,
236
+ processId: turn.processId,
237
+ activationToken: turn.activationToken,
238
+ activationGeneration: turn.activationGeneration,
239
+ };
240
+ }
241
+ export function waitFor(milliseconds, signal) {
242
+ if (signal?.aborted)
243
+ return Promise.resolve();
244
+ return new Promise((resolve) => {
245
+ const timeout = setTimeout(resolve, milliseconds);
246
+ signal?.addEventListener("abort", () => {
247
+ clearTimeout(timeout);
248
+ resolve();
249
+ }, { once: true });
250
+ });
251
+ }
252
+ export async function withProcessHeartbeat(options) {
253
+ const { runtime, processId, operation } = options;
254
+ const controller = new AbortController();
255
+ let heartbeatError;
256
+ const heartbeat = heartbeatUntilStopped({ runtime, processId, signal: controller.signal }).catch((error) => {
257
+ heartbeatError = error;
258
+ });
259
+ try {
260
+ const result = await operation();
261
+ controller.abort();
262
+ await heartbeat;
263
+ if (heartbeatError)
264
+ throw heartbeatError;
265
+ return result;
266
+ }
267
+ finally {
268
+ controller.abort();
269
+ await heartbeat;
270
+ }
271
+ }
272
+ async function heartbeatUntilStopped(options) {
273
+ const { runtime, processId, signal } = options;
274
+ while (!signal.aborted) {
275
+ await waitFor(runtime.settings.processHeartbeatIntervalMilliseconds, signal);
276
+ if (signal.aborted)
277
+ return;
278
+ await runtime.repository.heartbeatProcess(processId);
279
+ }
280
+ }
281
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAA;AAWpB,MAAM,OAAO,MAAM;IAOE;IACA;IAPV,SAAS,GAAG,UAAU,EAAE,CAAA;IACzB,UAAU,GAAG,KAAK,CAAA;IAClB,QAAQ,GAAG,KAAK,CAAA;IACP,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAA;IAElE,YACmB,OAA4B,EAC5B,UAAiD,EAAE;QADnD,YAAO,GAAP,OAAO,CAAqB;QAC5B,YAAO,GAAP,OAAO,CAA4C;IACnE,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,UAA0D,EAAE;QACxE,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAA;YAC3B,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;YAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC9D,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAA;YACtC,IAAI,MAAM,GAAiC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;YAC7E,IAAI,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YAChF,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAA;YACnB,IAAI,SAAS,GAAG,CAAC,CAAA;YACjB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACvC,IAAI,aAAa,GAAG,KAAK,CAAA;YACzB,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,SAAS,CAAA;gBACb,IAAI,CAAC;oBACH,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;gBACjE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,CAAC;wBAAE,MAAM,KAAK,CAAA;oBACrD,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;oBACnC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,OAAO;wBAAE,MAAM,KAAK,CAAC,UAAU,CAAA;oBACjE,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC;wBAAE,MAAM,KAAK,CAAC,UAAU,CAAA;oBACvE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;oBAC/C,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,SAAS,IAAI,CAAC,CAAA;gBACd,IAAI,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;oBACpD,MAAM,IAAI,CAAC,iBAAiB,CAAC;wBAC3B,IAAI;wBACJ,GAAG,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;qBAC7D,CAAC,CAAA;oBACF,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;gBAC7B,MAAM,GAAG;oBACP,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,IAAI;oBACJ,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAgC;iBACtE,CAAA;gBACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC9C,aAAa;oBACX,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAA4B;wBAC/D,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa;4BAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAA;gBAC3D,IAAI,aAAa;oBAAE,MAAK;gBACxB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;oBACzD,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;iBACzC,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM;oBAAE,OAAO,SAAS,CAAA;gBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;gBACzF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,EAAE;wBACrD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;wBACzC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;wBACrC,SAAS;wBACT,aAAa,EAAE,OAAO;qBACvB,CAAC,CAAA;gBACJ,CAAC;gBACD,MAAM,IAAI,CAAC,iBAAiB,CAAC;oBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,CAAC,mBAAmB,KAAK,SAAS;gBAAE,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAA;QACtF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAiC,EAAE;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAA;QAC3C,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;gBAClC,IAAI,KAAK,KAAK,CAAC;oBAAE,MAAK;gBACtB,SAAS,IAAI,KAAK,CAAA;YACpB,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAA;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAmB;QAC3B,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YACjE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;YACtC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,EACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CACvD;oBACD,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED,eAAe;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvF,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAA;QACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACzD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,CAAC,iBAAiB,CAAC;gBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,SAAS,EAAE,WAAW;aACvB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACvE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxB,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC/D,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;aAC7C,CAAC,CAAA;YACF,IAAI,IAAI;gBAAE,OAAO,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,CAAA;QAC1C,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,KAAK,CAAC,yBAAyB;QACrC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QAC7B,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACxD,IACE,GAAG,GAAG,UAAU,CAAC,UAAU;gBAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,EACzD,CAAC;gBACD,MAAM,IAAI,CAAC,iBAAiB,CAAC;oBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YACD,IAAI,GAAG,GAAG,UAAU,CAAC,OAAO;gBAAE,SAAQ;YACtC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC/E,UAAU,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAA;YACnF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC;oBAAE,MAAM,KAAK,CAAA;gBACnD,MAAM,IAAI,CAAC,iBAAiB,CAAC;oBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAI/B;QACC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjD,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAAiB;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC;gBAAE,MAAM,KAAK,CAAA;QACrD,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,IAAiB,EAAE,KAAc;QAC1D,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAA;QAC/D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;YACtD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC9B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,SAAS;SACV,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,KAAK,EAAE,mCAAmC;YAC1C,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC9B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,SAAS;SACV,CAAC,CAAA;IACJ,CAAC;CACF;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,OAAO,CACL,KAAK,YAAY,mBAAmB;QACpC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,cAAc,CAChC,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB;IACxC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;KAChD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,YAAoB,EAAE,MAAoB;IAChE,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QACjD,MAAM,EAAE,gBAAgB,CACtB,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,EAAE,CAAA;QACX,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAS,OAIlD;IACC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,cAAuB,CAAA;IAC3B,MAAM,SAAS,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAC9F,CAAC,KAAc,EAAE,EAAE;QACjB,cAAc,GAAG,KAAK,CAAA;IACxB,CAAC,CACF,CAAA;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;QAChC,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,MAAM,SAAS,CAAA;QACf,IAAI,cAAc;YAAE,MAAM,cAAc,CAAA;QACxC,OAAO,MAAM,CAAA;IACf,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,MAAM,SAAS,CAAA;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAIpC;IACC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAA;QAC5E,IAAI,MAAM,CAAC,OAAO;YAAE,OAAM;QAC1B,MAAM,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACtD,CAAC;AACH,CAAC"}
package/docs/api.md ADDED
@@ -0,0 +1,197 @@
1
+ # Public API reference
2
+
3
+ The package exports one server entry point plus database, wake-up, and browser
4
+ subpaths. TypeScript declaration files remain the source of truth for exact
5
+ generic signatures; this index explains the supported role of every export.
6
+
7
+ ## `solid-objects`
8
+
9
+ ### Runtime and actors
10
+
11
+ - `configure(options)`: create the process default `SolidObjectsRuntime`.
12
+ - `createRuntime(options)`: create an isolated runtime without changing the
13
+ default.
14
+ - `SolidObjectsRuntime`: installation, registration, supervision, and manager
15
+ owner. The normal lifecycle is `install()`, `run(signal)`, then `close()`.
16
+ - `Actor`: base class providing `ref()`, `actorId`, `currentMessage`,
17
+ `observables()`, `reject()`, `emit()`, `commitAction()`, `schedule()`,
18
+ `sendTo()`, and protected lifecycle hooks.
19
+ - `VERSION`: running package version.
20
+ - `ActorClass`, `ActorReference`, `ActorMessageSender`, `ActorSnapshot`,
21
+ `ActorOperationNames`, `ActorQueryNames`, `StagedOperations`, and
22
+ `ScheduledOperations`: inferred actor-class and fluent-dispatch types.
23
+ - `MessageReference`: immutable durable message identity with `id`,
24
+ `requestId`, actor identity, `sequence`, `status()`, `result()`, and `wait()`.
25
+ - `InvocationOptions`, `AsyncInvocationOptions`, `SnapshotOptions`, and
26
+ `DestroyOptions`: authorization, idempotency, timing, and scheduling options
27
+ used by reference methods.
28
+
29
+ `ActorIntents`, `EffectIntent`, `CommitActionIntent`, `ReminderIntent`,
30
+ `OutboundMessageIntent`, `ReminderOptions`, `OutboundMessageOptions`,
31
+ `PayloadBroadcasts`, and `PayloadBroadcastValue` describe actor-declared
32
+ transactional work and typed personalized projections.
33
+
34
+ ### Runtime managers
35
+
36
+ Every manager below is available as a property on `SolidObjectsRuntime`; the
37
+ class and result types are also exported for integration typing.
38
+
39
+ - `runtime.deadLetters` / `DeadLetterManager`: `all()` and idempotent `retry()`.
40
+ - `runtime.reminders` / `ReminderManager`: cursor-paginated `all()` and
41
+ idempotent paused-alarm `resume()`.
42
+ - `runtime.processes` / `ProcessManager`: immutable role `all()` and stale-owner
43
+ `cleanup()`.
44
+ - `runtime.reconciliation` / `ReconciliationManager`: `active()`,
45
+ `withoutPendingWork()`, `statesFor()`, and `orphaned()` bounded reads.
46
+ - `runtime.retention` / `RetentionManager`: `preview()` and authorized `prune()`
47
+ for messages, instances, or processes.
48
+ - `runtime.doctor` / `Doctor`: `run({ roundTrip })` structured installation
49
+ report.
50
+ - `runtime.testing` / `SolidObjectsTestHelper`: deterministic `drain()` and
51
+ dependency-ordered `reset()`.
52
+ - `runtime.realtime` / `RealtimeManager`: `connect()`, process-local
53
+ `publish()`, and `close()`.
54
+
55
+ The manager types are `DeadLetter`; `ReminderPage`, `ReminderPageOptions`,
56
+ `ReminderRecord`, `ReminderStatus`, and `ResumeReminderOptions`;
57
+ `ProcessCleanupResult`, `ProcessMetadata`, `ProcessRecord`, and
58
+ `ProcessShutdownState`; `DoctorCheck`, `DoctorOptions`, `DoctorReport`, and
59
+ `DoctorStatus`; `OrphanedReconciliationOptions`,
60
+ `QuietReconciliationOptions`, `ReconciliationInstance`, `ReconciliationPage`,
61
+ `ReconciliationPageOptions`, and `ReconciliationStatesOptions`;
62
+ `RetentionOptions`, `RetentionResult`, and `RetentionTarget`; and
63
+ `TestDrainOptions` and `TestHelperRole`. `RealtimeConnectionOptions`,
64
+ `RealtimeSession`, and `SubscriptionRequest` define the server session API.
65
+ `AdministrationOptions` carries the application-owned authorization context
66
+ for administration calls.
67
+
68
+ ### Registration and integration
69
+
70
+ - `runtime.register(ActorClass)`: validate and register an actor definition.
71
+ - `runtime.ref(ActorClass, actorId)`: register and address an actor in an
72
+ isolated runtime.
73
+ - `runtime.registerEffect(name, handler)`: register an at-least-once external
74
+ effect handler. `EffectContext` carries the stable effect ID and source
75
+ identity.
76
+ - `runtime.registerCommitAction(name, handler)`: register a same-database
77
+ fenced transaction handler. `CommitActionContext` includes the active
78
+ `DatabaseConnection`.
79
+ - `guardApplicationDatabase(database)`: return a facade that rejects writes
80
+ from actor-owned execution contexts.
81
+ - `parseSubscriptionRequest(value)`: validate the server-side JSON subscribe or
82
+ unsubscribe request before session routing.
83
+ - `runCli(arguments, options)` and `CliRunOptions`: embed and configure the
84
+ packaged command implementation; applications normally invoke the
85
+ `solid-objects` executable instead.
86
+
87
+ `SolidObjectsConfiguration`, `AuthorizationInput`,
88
+ `DestroyAuthorizationInput`, `AdministrationAuthorizationInput`,
89
+ `SubscriptionAuthorizationInput`, `BroadcastEvent`, and
90
+ `InstrumentationEvent` type the host integration contract. `JsonPrimitive`,
91
+ `JsonValue`, `JsonObject`, `DeepReadonly`, `ActorIdentifier`, `MessageContext`,
92
+ `MessageStatus`, and `Logger` are shared types. `Database`,
93
+ `DatabaseConnection`, `DatabaseFamily`, and `RunResult` support custom database
94
+ and commit-action integration.
95
+
96
+ ### Runtime extensions and manual workers
97
+
98
+ `runtime.registerComponent(factory, { count = 1 })` adds application-owned
99
+ supervised roles. Each factory must return a `LongRunningComponent`:
100
+
101
+ ```typescript
102
+ interface LongRunningComponent {
103
+ run(signal: AbortSignal): Promise<void>
104
+ requestShutdown(): void
105
+ stopped(): boolean
106
+ stop(): void | Promise<void>
107
+ }
108
+ ```
109
+
110
+ The runtime creates `count` independent instances, replaces an instance whose
111
+ `run()` settles unexpectedly, and stops replacement before graceful shutdown.
112
+ Factories should create fresh mutable state and `stop()` should be idempotent.
113
+
114
+ `Worker`, `EffectWorker`, `ReminderScheduler`, and `BroadcastWorker` are
115
+ exported for test runners and hosts that intentionally operate roles outside
116
+ `runtime.run()`. Runtime factory methods create the same classes. Each provides
117
+ `runOnce()`, bounded `runUntilIdle()`, `run(signal)`, `requestShutdown()`,
118
+ `stopped()`, and `stop()`. Manual roles still register process ownership and
119
+ must be stopped. Prefer `runtime.run()` in production and `runtime.testing` in
120
+ tests.
121
+
122
+ `InProcessWakeUpAdapter`, `WakeUpAdapter`, `WakeUpRole`, `WakeUpWatch`, and
123
+ `WakeUpWaitOptions` define the notification extension. A watch must be obtained
124
+ before checking durable state so a notification cannot fall between claim and
125
+ wait.
126
+
127
+ ### Errors
128
+
129
+ The root exports `SolidObjectsError` and its supported subclasses:
130
+
131
+ - policy and caller outcomes: `Unauthorized`, `Rejected`, `ActorDestroyed`,
132
+ `SyncEnqueueTimeout`, `SyncTimeout`, `SyncInsideTransaction`, and
133
+ `MessageFailed`;
134
+ - admission and payload failures: `MailboxFull`, `InvalidPayload`,
135
+ `PayloadTooLarge`, `IdempotencyConflict`, `InvalidPayloadBroadcast`, and
136
+ `UnknownPayloadBroadcast`;
137
+ - definition and execution failures: `InvalidActor`, `UnknownActorType`,
138
+ `UnknownOperation`, `ActorCallCycle`, `QueryMutatedState`,
139
+ `StateMigrationError`, `ApplicationWriteForbidden`, `UnknownEffect`, and
140
+ `UnknownCommitAction`;
141
+ - operational failures: `LostActivation`, `DatabaseDeadlineExceeded`,
142
+ `UnknownDeadLetter`, `UnknownReminder`, `ReminderNotPaused`, and
143
+ `UnsupportedDatabase`.
144
+
145
+ `NonRetryableError` is the application subclassing point. `SyncTimeoutDetails`
146
+ and `SyncTimeoutWaitingOn` type timeout diagnostics. See
147
+ [Errors and recovery](errors-and-recovery.md) before deciding what to catch.
148
+
149
+ ## `solid-objects/database/sqlite`
150
+
151
+ - `sqlite(options)`: construct `SQLiteDatabase`.
152
+ - `SQLiteDatabase`: `Database` implementation and `close()` owner.
153
+ - `SQLiteDatabaseOptions`: path, busy timeout, and lock retry options.
154
+
155
+ ## `solid-objects/database/postgresql`
156
+
157
+ - `postgresql(options)`: construct `PostgreSQLDatabase`.
158
+ - `PostgreSQLDatabase`: pooled `Database` implementation with `wakeUp()`.
159
+ - `PostgreSQLDatabaseOptions` and `PostgreSQLDatabaseWakeUpOptions`: pool and
160
+ notification configuration.
161
+ - `postgresqlWakeUp(options)` and `PostgreSQLWakeUpAdapter`: standalone
162
+ `LISTEN/NOTIFY` wake-up integration.
163
+ - `PostgreSQLWakeUpOptions` and `PostgreSQLWakeUpFailure`: listener options and
164
+ failure callback data.
165
+
166
+ ## `solid-objects/database/mysql`
167
+
168
+ - `mysql(options)`: construct `MySQLDatabase`.
169
+ - `MySQLDatabase`: pooled `mysql2` `Database` implementation.
170
+ - `MySQLDatabaseOptions`: pool configuration.
171
+ - `mysqlSql(sql)`: translate the portable conflict syntax used by custom
172
+ database integrations.
173
+
174
+ ## `solid-objects/wake-up/redis`
175
+
176
+ - `redisWakeUp(options)`: construct `RedisWakeUpAdapter`.
177
+ - `RedisWakeUpAdapter`: optional Pub/Sub latency layer.
178
+ - `RedisWakeUpOptions` and `RedisWakeUpFailure`: connection, channel, timeout,
179
+ and failure callback types.
180
+
181
+ ## `solid-objects/browser`
182
+
183
+ - `SolidObjectsBrowserClient`: connect, subscribe, unsubscribe, receive, and
184
+ close a versioned WebSocket client without Node imports.
185
+ - `BrowserClientOptions`, `ActorSubscription`, `InvalidationEnvelope`,
186
+ `PayloadEnvelope`, and `RealtimeEnvelope`: browser transport types.
187
+ - `parseInvalidation(value)` and `parseRealtimeEnvelope(value)`: validate and
188
+ deeply freeze received JSON for custom transports.
189
+ - `SolidObjectsComponentRegistry`: register keyed observable dependencies,
190
+ coalesce refreshes, abort superseded work, fence application, and close.
191
+ - `ComponentRegistration`, `RegisteredComponent`, `ComponentRefreshStrategy`,
192
+ `ComponentRefreshRequest`, `ComponentRefreshResult`, `ComponentApplication`,
193
+ `ComponentRefreshFailure`, and `ComponentRegistryOptions`: framework-neutral
194
+ refresh contract types.
195
+
196
+ The wire format, trust boundary, revision rules, and component semantics are in
197
+ [Browser protocol](browser-protocol.md).