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.
- package/CHANGELOG.md +110 -0
- package/MIT-LICENSE +19 -0
- package/README.md +958 -0
- package/dist/actor.d.ts +81 -0
- package/dist/actor.d.ts.map +1 -0
- package/dist/actor.js +141 -0
- package/dist/actor.js.map +1 -0
- package/dist/application-database.d.ts +3 -0
- package/dist/application-database.d.ts.map +1 -0
- package/dist/application-database.js +59 -0
- package/dist/application-database.js.map +1 -0
- package/dist/broadcast-worker.d.ts +18 -0
- package/dist/broadcast-worker.d.ts.map +1 -0
- package/dist/broadcast-worker.js +74 -0
- package/dist/broadcast-worker.js.map +1 -0
- package/dist/browser/components.d.ts +64 -0
- package/dist/browser/components.d.ts.map +1 -0
- package/dist/browser/components.js +294 -0
- package/dist/browser/components.js.map +1 -0
- package/dist/browser/index.d.ts +46 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +207 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +216 -0
- package/dist/cli.js.map +1 -0
- package/dist/configuration.d.ts +96 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +169 -0
- package/dist/configuration.js.map +1 -0
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +24 -0
- package/dist/context.js.map +1 -0
- package/dist/database/deadline.d.ts +9 -0
- package/dist/database/deadline.d.ts.map +1 -0
- package/dist/database/deadline.js +49 -0
- package/dist/database/deadline.js.map +1 -0
- package/dist/database/mysql.d.ts +21 -0
- package/dist/database/mysql.d.ts.map +1 -0
- package/dist/database/mysql.js +192 -0
- package/dist/database/mysql.js.map +1 -0
- package/dist/database/postgresql-sql.d.ts +2 -0
- package/dist/database/postgresql-sql.d.ts.map +1 -0
- package/dist/database/postgresql-sql.js +102 -0
- package/dist/database/postgresql-sql.js.map +1 -0
- package/dist/database/postgresql.d.ts +31 -0
- package/dist/database/postgresql.d.ts.map +1 -0
- package/dist/database/postgresql.js +172 -0
- package/dist/database/postgresql.js.map +1 -0
- package/dist/database/sqlite.d.ts +27 -0
- package/dist/database/sqlite.d.ts.map +1 -0
- package/dist/database/sqlite.js +190 -0
- package/dist/database/sqlite.js.map +1 -0
- package/dist/database/transaction-context.d.ts +3 -0
- package/dist/database/transaction-context.d.ts.map +1 -0
- package/dist/database/transaction-context.js +19 -0
- package/dist/database/transaction-context.js.map +1 -0
- package/dist/database/types.d.ts +20 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/dead-letters.d.ts +23 -0
- package/dist/dead-letters.d.ts.map +1 -0
- package/dist/dead-letters.js +13 -0
- package/dist/dead-letters.js.map +1 -0
- package/dist/default-runtime.d.ts +5 -0
- package/dist/default-runtime.d.ts.map +1 -0
- package/dist/default-runtime.js +14 -0
- package/dist/default-runtime.js.map +1 -0
- package/dist/definition.d.ts +32 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +173 -0
- package/dist/definition.js.map +1 -0
- package/dist/doctor.d.ts +32 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +500 -0
- package/dist/doctor.js.map +1 -0
- package/dist/effect-worker.d.ts +18 -0
- package/dist/effect-worker.d.ts.map +1 -0
- package/dist/effect-worker.js +74 -0
- package/dist/effect-worker.js.map +1 -0
- package/dist/errors.d.ts +145 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +120 -0
- package/dist/errors.js.map +1 -0
- package/dist/executable.d.ts +3 -0
- package/dist/executable.d.ts.map +1 -0
- package/dist/executable.js +12 -0
- package/dist/executable.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/maintenance-scheduler.d.ts +17 -0
- package/dist/maintenance-scheduler.d.ts.map +1 -0
- package/dist/maintenance-scheduler.js +41 -0
- package/dist/maintenance-scheduler.js.map +1 -0
- package/dist/process-administration.d.ts +30 -0
- package/dist/process-administration.d.ts.map +1 -0
- package/dist/process-administration.js +13 -0
- package/dist/process-administration.js.map +1 -0
- package/dist/realtime.d.ts +33 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +238 -0
- package/dist/realtime.js.map +1 -0
- package/dist/reconciliation.d.ts +41 -0
- package/dist/reconciliation.d.ts.map +1 -0
- package/dist/reconciliation.js +19 -0
- package/dist/reconciliation.js.map +1 -0
- package/dist/records.d.ts +137 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +2 -0
- package/dist/records.js.map +1 -0
- package/dist/reference.d.ts +97 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.js +157 -0
- package/dist/reference.js.map +1 -0
- package/dist/reminder-administration.d.ts +35 -0
- package/dist/reminder-administration.d.ts.map +1 -0
- package/dist/reminder-administration.js +13 -0
- package/dist/reminder-administration.js.map +1 -0
- package/dist/reminder-scheduler.d.ts +18 -0
- package/dist/reminder-scheduler.d.ts.map +1 -0
- package/dist/reminder-scheduler.js +88 -0
- package/dist/reminder-scheduler.js.map +1 -0
- package/dist/repository.d.ts +142 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +1237 -0
- package/dist/repository.js.map +1 -0
- package/dist/retention.d.ts +17 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +13 -0
- package/dist/retention.js.map +1 -0
- package/dist/runtime.d.ts +140 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1737 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +260 -0
- package/dist/schema.js.map +1 -0
- package/dist/serialization.d.ts +11 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +82 -0
- package/dist/serialization.js.map +1 -0
- package/dist/test-helper.d.ts +15 -0
- package/dist/test-helper.d.ts.map +1 -0
- package/dist/test-helper.js +69 -0
- package/dist/test-helper.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/wake-up/postgresql.d.ts +42 -0
- package/dist/wake-up/postgresql.d.ts.map +1 -0
- package/dist/wake-up/postgresql.js +234 -0
- package/dist/wake-up/postgresql.js.map +1 -0
- package/dist/wake-up/redis.d.ts +35 -0
- package/dist/wake-up/redis.d.ts.map +1 -0
- package/dist/wake-up/redis.js +151 -0
- package/dist/wake-up/redis.js.map +1 -0
- package/dist/wake-up.d.ts +24 -0
- package/dist/wake-up.d.ts.map +1 -0
- package/dist/wake-up.js +66 -0
- package/dist/wake-up.js.map +1 -0
- package/dist/worker.d.ts +36 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +281 -0
- package/dist/worker.js.map +1 -0
- package/docs/api.md +197 -0
- package/docs/architecture.md +113 -0
- package/docs/authorization.md +31 -0
- package/docs/browser-protocol.md +93 -0
- package/docs/configuration.md +168 -0
- package/docs/correctness.md +53 -0
- package/docs/errors-and-recovery.md +89 -0
- package/docs/operations.md +170 -0
- package/docs/parity.md +94 -0
- package/docs/releasing.md +45 -0
- package/docs/state-and-lifecycle.md +162 -0
- package/package.json +100 -0
package/dist/wake-up.js
ADDED
|
@@ -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":"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"}
|
package/dist/worker.d.ts
ADDED
|
@@ -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":"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"}
|
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).
|