solid-objects 0.15.2 → 0.16.1
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 +157 -0
- package/README.md +1 -1
- package/dist/actor-runtime.d.ts +9 -1
- package/dist/actor-runtime.d.ts.map +1 -1
- package/dist/actor.d.ts +22 -4
- package/dist/actor.d.ts.map +1 -1
- package/dist/actor.js +81 -2
- package/dist/actor.js.map +1 -1
- package/dist/broadcast-worker.js +1 -1
- package/dist/broadcast-worker.js.map +1 -1
- package/dist/cloudflare/configuration.d.ts +3 -1
- package/dist/cloudflare/configuration.d.ts.map +1 -1
- package/dist/cloudflare/configuration.js +4 -0
- package/dist/cloudflare/configuration.js.map +1 -1
- package/dist/cloudflare/engine.d.ts +4 -0
- package/dist/cloudflare/engine.d.ts.map +1 -1
- package/dist/cloudflare/engine.js +91 -24
- package/dist/cloudflare/engine.js.map +1 -1
- package/dist/cloudflare/records.d.ts +2 -0
- package/dist/cloudflare/records.d.ts.map +1 -1
- package/dist/cloudflare/runtime.d.ts +8 -0
- package/dist/cloudflare/runtime.d.ts.map +1 -1
- package/dist/cloudflare/runtime.js +52 -1
- package/dist/cloudflare/runtime.js.map +1 -1
- package/dist/cloudflare/storage.d.ts +2 -0
- package/dist/cloudflare/storage.d.ts.map +1 -1
- package/dist/cloudflare/storage.js +10 -0
- package/dist/cloudflare/storage.js.map +1 -1
- package/dist/configuration.d.ts +9 -5
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js +43 -7
- package/dist/configuration.js.map +1 -1
- package/dist/database/types.d.ts +4 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/dead-letter-scopes.d.ts +75 -0
- package/dist/dead-letter-scopes.d.ts.map +1 -0
- package/dist/dead-letter-scopes.js +157 -0
- package/dist/dead-letter-scopes.js.map +1 -0
- package/dist/dead-letters.d.ts +5 -0
- package/dist/dead-letters.d.ts.map +1 -1
- package/dist/dead-letters.js +16 -0
- package/dist/dead-letters.js.map +1 -1
- package/dist/definition.d.ts +2 -0
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +1 -1
- package/dist/definition.js.map +1 -1
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +35 -2
- package/dist/doctor.js.map +1 -1
- package/dist/effect-recovery-coordinator.d.ts +2 -0
- package/dist/effect-recovery-coordinator.d.ts.map +1 -1
- package/dist/effect-recovery-coordinator.js +5 -2
- package/dist/effect-recovery-coordinator.js.map +1 -1
- package/dist/effect-worker.js +1 -1
- package/dist/effect-worker.js.map +1 -1
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/outcome.d.ts +18 -0
- package/dist/outcome.d.ts.map +1 -0
- package/dist/outcome.js +2 -0
- package/dist/outcome.js.map +1 -0
- package/dist/platform/uuid.d.ts +1 -0
- package/dist/platform/uuid.d.ts.map +1 -1
- package/dist/platform/uuid.js +5 -0
- package/dist/platform/uuid.js.map +1 -1
- package/dist/records.d.ts +6 -0
- package/dist/records.d.ts.map +1 -1
- package/dist/redrive.d.ts +60 -0
- package/dist/redrive.d.ts.map +1 -0
- package/dist/redrive.js +239 -0
- package/dist/redrive.js.map +1 -0
- package/dist/reference.d.ts +17 -3
- package/dist/reference.d.ts.map +1 -1
- package/dist/reference.js +10 -0
- package/dist/reference.js.map +1 -1
- package/dist/reminder-scheduler.js +1 -1
- package/dist/reminder-scheduler.js.map +1 -1
- package/dist/repository.d.ts +34 -4
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +124 -21
- package/dist/repository.js.map +1 -1
- package/dist/runtime.d.ts +42 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +263 -6
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +97 -1
- package/dist/schema.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wake-up/postgresql.d.ts +4 -2
- package/dist/wake-up/postgresql.d.ts.map +1 -1
- package/dist/wake-up/postgresql.js +9 -0
- package/dist/wake-up/postgresql.js.map +1 -1
- package/dist/wake-up/redis.d.ts +2 -1
- package/dist/wake-up/redis.d.ts.map +1 -1
- package/dist/wake-up/redis.js +6 -0
- package/dist/wake-up/redis.js.map +1 -1
- package/dist/wake-up-selection.d.ts +22 -0
- package/dist/wake-up-selection.d.ts.map +1 -0
- package/dist/wake-up-selection.js +198 -0
- package/dist/wake-up-selection.js.map +1 -0
- package/dist/wake-up.d.ts +15 -0
- package/dist/wake-up.d.ts.map +1 -1
- package/dist/wake-up.js +6 -0
- package/dist/wake-up.js.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/docs/api.md +202 -6
- package/docs/cloudflare.md +1 -0
- package/docs/configuration.md +52 -22
- package/docs/correctness.md +8 -0
- package/docs/dashboard.md +9 -0
- package/docs/fit.md +3 -1
- package/docs/operations.md +104 -7
- package/docs/parity.md +105 -25
- package/package.json +1 -1
package/dist/runtime.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { Actor, ActorClass } from "./actor.js";
|
|
2
2
|
import { BroadcastWorker } from "./broadcast-worker.js";
|
|
3
3
|
import { type BroadcastEvent, type SolidObjectsConfiguration } from "./configuration.js";
|
|
4
|
+
import type { Outcome } from "./outcome.js";
|
|
4
5
|
import { DeadLetterManager, type DeadLetter } from "./dead-letters.js";
|
|
6
|
+
import type { DeadLetterKind, RedriveFilters } from "./dead-letter-scopes.js";
|
|
7
|
+
import { RedriveManager } from "./redrive.js";
|
|
5
8
|
import { Doctor } from "./doctor.js";
|
|
6
9
|
import { ActorReferenceCore, MessageReference, type ActorReference, type ActorSnapshot } from "./reference.js";
|
|
7
10
|
import { ReconciliationManager, type OrphanedReconciliationOptions, type QuietReconciliationOptions, type ReconciliationPage, type ReconciliationPageOptions, type ReconciliationStatesOptions } from "./reconciliation.js";
|
|
@@ -17,6 +20,7 @@ import type { ActorIdentifier, AdministrationOptions, AsyncInvocationOptions, Co
|
|
|
17
20
|
import { SolidObjectsTestHelper } from "./test-helper.js";
|
|
18
21
|
import { Worker } from "./worker.js";
|
|
19
22
|
import { EffectWorker } from "./effect-worker.js";
|
|
23
|
+
import type { WakeUpAdapter, WakeUpCapability, WakeUpRole, WakeUpWatch } from "./wake-up.js";
|
|
20
24
|
import type { DatabaseConnection } from "./database/types.js";
|
|
21
25
|
export interface SnapshotWithIncarnation<ActorType extends Actor> {
|
|
22
26
|
snapshot: ActorSnapshot<ActorType>;
|
|
@@ -30,6 +34,7 @@ export declare class SolidObjectsRuntime {
|
|
|
30
34
|
readonly settings: import("./configuration.js").RuntimeSettings;
|
|
31
35
|
readonly repository: Repository;
|
|
32
36
|
readonly deadLetters: DeadLetterManager;
|
|
37
|
+
readonly redrives: RedriveManager;
|
|
33
38
|
readonly reconciliation: ReconciliationManager;
|
|
34
39
|
readonly retention: RetentionManager;
|
|
35
40
|
readonly doctor: Doctor;
|
|
@@ -46,6 +51,8 @@ export declare class SolidObjectsRuntime {
|
|
|
46
51
|
private running;
|
|
47
52
|
private pollingOnlyWakeUpWarningEmitted;
|
|
48
53
|
private pollingOnlyWakeUpWarningCheck;
|
|
54
|
+
private wakeUpSelection;
|
|
55
|
+
private wakeUpSelectionFailureLogged;
|
|
49
56
|
constructor(configuration: SolidObjectsConfiguration);
|
|
50
57
|
install(): Promise<void>;
|
|
51
58
|
register<ActorType extends Actor>(actorClass: ActorClass<ActorType>): ActorClass<ActorType>;
|
|
@@ -77,6 +84,13 @@ export declare class SolidObjectsRuntime {
|
|
|
77
84
|
private messageSnapshotBeforeDeadline;
|
|
78
85
|
private syncTimeout;
|
|
79
86
|
private databaseContentionTimeout;
|
|
87
|
+
findBy(input: {
|
|
88
|
+
reference?: ActorReferenceCore<Actor>;
|
|
89
|
+
requestId?: string;
|
|
90
|
+
idempotencyKey?: string;
|
|
91
|
+
authorizationContext?: AdministrationOptions["authorizationContext"];
|
|
92
|
+
}): Promise<MessageReference | undefined>;
|
|
93
|
+
messageOutcome<Result>(messageReference: MessageReference<Result>, options?: SnapshotOptions): Promise<Outcome<Result>>;
|
|
80
94
|
messageStatus(messageReference: MessageReference, options?: SnapshotOptions): Promise<MessageStatus>;
|
|
81
95
|
messageResult<Result>(messageReference: MessageReference<Result>, options?: SnapshotOptions): Promise<DeepReadonly<Result> | undefined>;
|
|
82
96
|
snapshot<ActorType extends Actor>(reference: ActorReferenceCore<ActorType>, options?: SnapshotOptions): Promise<ActorSnapshot<ActorType>>;
|
|
@@ -95,6 +109,16 @@ export declare class SolidObjectsRuntime {
|
|
|
95
109
|
authorizationContext: unknown;
|
|
96
110
|
}): Promise<PayloadEnvelope[]>;
|
|
97
111
|
destroy(reference: ActorReferenceCore<Actor>, options?: DestroyOptions): Promise<boolean>;
|
|
112
|
+
wakeUpAfterRevival(kind: DeadLetterKind): void;
|
|
113
|
+
administrationIdentity(authorizationContext: AdministrationOptions["authorizationContext"]): Promise<string | null>;
|
|
114
|
+
writeAdministrationEvent(input: {
|
|
115
|
+
connection: DatabaseConnection;
|
|
116
|
+
action: string;
|
|
117
|
+
kind: string;
|
|
118
|
+
subjectId?: string;
|
|
119
|
+
filters?: RedriveFilters;
|
|
120
|
+
actor: string | null;
|
|
121
|
+
}): Promise<void>;
|
|
98
122
|
inspectDeadLetters(options?: AdministrationOptions): Promise<readonly DeadLetter[]>;
|
|
99
123
|
retryDeadLetter(id: string, options?: AdministrationOptions): Promise<MessageReference>;
|
|
100
124
|
activeInstances(options?: ReconciliationPageOptions): Promise<ReconciliationPage>;
|
|
@@ -119,6 +143,9 @@ export declare class SolidObjectsRuntime {
|
|
|
119
143
|
lifecycle: "activated" | "unactivated";
|
|
120
144
|
}): Promise<void>;
|
|
121
145
|
close(): Promise<void>;
|
|
146
|
+
wakeUpAdapter(): Promise<WakeUpAdapter>;
|
|
147
|
+
wakeUpCapability(): Promise<WakeUpCapability>;
|
|
148
|
+
watchWakeUp(role: WakeUpRole): Promise<WakeUpWatch>;
|
|
122
149
|
warnIfPollingIsOnlyCrossProcessWakeUp(): Promise<void>;
|
|
123
150
|
private checkPollingOnlyCrossProcessWakeUp;
|
|
124
151
|
resetForTesting(): Promise<void>;
|
|
@@ -144,6 +171,10 @@ export declare class SolidObjectsRuntime {
|
|
|
144
171
|
}): Promise<MessageRow>;
|
|
145
172
|
announceInternalMessage(message: MessageRow): void;
|
|
146
173
|
private enqueue;
|
|
174
|
+
private lookedUpMessage;
|
|
175
|
+
private absentMessage;
|
|
176
|
+
private readableOperation;
|
|
177
|
+
private readableMessage;
|
|
147
178
|
private messageReferenceFromRow;
|
|
148
179
|
private renewLease;
|
|
149
180
|
private buildComponentSlots;
|
|
@@ -171,9 +202,19 @@ export declare class SolidObjectsRuntime {
|
|
|
171
202
|
* reports only after the commit succeeds, so a rolled-back turn stays silent.
|
|
172
203
|
*/
|
|
173
204
|
private warnAboutLargeState;
|
|
205
|
+
private resolveWakeUp;
|
|
206
|
+
private closeWakeUp;
|
|
207
|
+
private discardWakeUp;
|
|
174
208
|
private wakeUp;
|
|
209
|
+
private notifyWhenSelected;
|
|
210
|
+
private reportWakeUpSelectionFailure;
|
|
175
211
|
private authorize;
|
|
176
|
-
|
|
212
|
+
authorizeAdministration(options: {
|
|
213
|
+
action: string;
|
|
214
|
+
resource: string;
|
|
215
|
+
resourceId?: string;
|
|
216
|
+
authorizationContext: unknown;
|
|
217
|
+
}): Promise<void>;
|
|
177
218
|
private authorizeMessageReference;
|
|
178
219
|
}
|
|
179
220
|
export declare function createRuntime(configuration: SolidObjectsConfiguration): SolidObjectsRuntime;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,yBAAyB,EAC/B,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,yBAAyB,EAC/B,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAe,OAAO,EAAmB,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAkCpC,OAAO,EACL,kBAAkB,EAElB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,qBAAqB,EACrB,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAE/B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,SAAS,EAET,UAAU,EACV,WAAW,EACZ,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAU9F,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEV,oBAAoB,EAEpB,aAAa,EACb,eAAe,EAEhB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAW,MAAM,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAI5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAU7D,MAAM,WAAW,uBAAuB,CAAC,SAAS,SAAS,KAAK;IAC9D,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAiBD,KAAK,aAAa,GAAG,CACnB,cAAc,EAAE,UAAU,EAC1B,OAAO,EAAE,aAAa,KACnB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAC/B,KAAK,mBAAmB,GAAG,CACzB,cAAc,EAAE,UAAU,EAC1B,OAAO,EAAE,mBAAmB,KACzB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AA0B/B,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,QAAQ,+CAAA;IACjB,QAAQ,CAAC,UAAU,aAAA;IACnB,QAAQ,CAAC,WAAW,oBAAA;IACpB,QAAQ,CAAC,QAAQ,iBAAA;IACjB,QAAQ,CAAC,cAAc,wBAAA;IACvB,QAAQ,CAAC,SAAS,mBAAA;IAClB,QAAQ,CAAC,MAAM,SAAA;IACf,QAAQ,CAAC,OAAO,yBAAA;IAChB,QAAQ,CAAC,SAAS,kBAAA;IAClB,QAAQ,CAAC,QAAQ,kBAAA;IACjB,QAAQ,CAAC,SAAS,iBAAA;IAClB,QAAQ,CAAC,cAAc,wBAAA;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,+BAA+B,CAAQ;IAC/C,OAAO,CAAC,6BAA6B,CAA2B;IAChE,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,4BAA4B,CAAQ;gBAEhC,aAAa,EAAE,yBAAyB;IAiB9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,QAAQ,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;IAc3F,GAAG,CAAC,SAAS,SAAS,KAAK,EACzB,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EACjC,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,SAAS,CAAC;IAc5B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAK1D,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAMtE,iBAAiB,CAAC,OAAO,EAAE,MAAM,oBAAoB,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IAO9F,MAAM,IAAI,MAAM;IAIhB,YAAY,IAAI,YAAY;IAI5B,iBAAiB,IAAI,iBAAiB;IAItC,eAAe,IAAI,eAAe;IAM5B,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDvC,WAAW,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE;QAC3C,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACpC,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,UAAU,CAAA;QAC3B,OAAO,CAAC,EAAE,sBAAsB,CAAA;KACjC,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IA0B/B,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE;QACtC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACpC,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,UAAU,CAAA;QAC3B,OAAO,CAAC,EAAE,iBAAiB,CAAA;KAC5B,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAuD3B,IAAI,CAAC,MAAM,EACf,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAC1C,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YA0BlB,aAAa;IAyD3B,OAAO,CAAC,6BAA6B;YAUvB,WAAW;IA4FzB,OAAO,CAAC,yBAAyB;IA2C3B,MAAM,CAAC,KAAK,EAAE;QAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACrC,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,oBAAoB,CAAC,EAAE,qBAAqB,CAAC,sBAAsB,CAAC,CAAA;KACrE,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAkBnC,cAAc,CAAC,MAAM,EACzB,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAC1C,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAmCrB,aAAa,CACjB,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC;IAQnB,aAAa,CAAC,MAAM,EACxB,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAC1C,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAatC,QAAQ,CAAC,SAAS,SAAS,KAAK,EACpC,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC,EACxC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAY9B,uBAAuB,CAAC,SAAS,SAAS,KAAK,EACnD,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC,EACxC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAWhC,4BAA4B;IAkDpC,oBAAoB,CAAC,OAAO,EAAE;QAClC,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,oBAAoB,EAAE,OAAO,CAAA;QAC7B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;KAC1B,GAAG,OAAO,CAAC,cAAc,CAAC;IAoCrB,oBAAoB,CAAC,OAAO,EAAE;QAClC,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;QAC/B,oBAAoB,EAAE,OAAO,CAAA;KAC9B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwBxB,OAAO,CACX,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,EACpC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC;IAmBnB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIxC,sBAAsB,CAC1B,oBAAoB,EAAE,qBAAqB,CAAC,sBAAsB,CAAC,GAClE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKnB,wBAAwB,CAAC,KAAK,EAAE;QACpC,UAAU,EAAE,kBAAkB,CAAA;QAC9B,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,cAAc,CAAA;QACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBX,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC;IAUvF,eAAe,CACnB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,gBAAgB,CAAC;IAwCtB,eAAe,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAerF,gBAAgB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC;IA+BxF,gBAAgB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAU5E,qBAAqB;IAY7B,2BAA2B,CAC/B,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,kBAAkB,CAAC;IAmBxB,iBAAiB,CACrB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAyB9C,iBAAiB,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgBtF,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAarE,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAenE,gBAAgB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB1E,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;IA4BxF,WAAW,CACf,IAAI,EAAE,WAAW,EACjB,WAAW,CAAC,EAAE,KAAK,GAClB,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAmLrE,eAAe,CAAC,OAAO,EAAE;QAC7B,IAAI,EAAE,WAAW,CAAA;QACjB,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,SAAS,EAAE,WAAW,GAAG,aAAa,CAAA;KACvC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAIvC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAI7C,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAInD,qCAAqC,IAAI,OAAO,CAAC,IAAI,CAAC;YAc9C,kCAAkC;IAgB1C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAoBzD,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC/C,eAAe,CACnB,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GACzC,OAAO,CAAC,IAAI,CAAC;IAkBV,gBAAgB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBxD,sBAAsB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE;QACtD,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,UAAU,CAAA;QAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAqB/B,mCAAmC,CACvC,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,UAAU,CAAA;QAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,GACA,OAAO,CAAC,UAAU,CAAC;IAmBtB,uBAAuB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;YAKpC,OAAO;YAmCP,eAAe;YAmBf,aAAa;YA0Bb,iBAAiB;YAqCjB,eAAe;IAiC7B,OAAO,CAAC,uBAAuB;YAajB,UAAU;YAQV,mBAAmB;YA0DnB,mBAAmB;YAOnB,SAAS;IAyEvB,OAAO,CAAC,gBAAgB;YAmCV,aAAa;IA6B3B,OAAO,CAAC,6BAA6B;IAOrC,OAAO,CAAC,sBAAsB;IAQ9B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,oBAAoB;YAYd,yBAAyB;YA2BzB,0BAA0B;IAiExC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,OAAO;IAIf;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,aAAa;YAUP,WAAW;YAOX,aAAa;IAM3B,OAAO,CAAC,MAAM;YAIA,kBAAkB;IAShC,OAAO,CAAC,4BAA4B;YAMtB,SAAS;IAmBjB,uBAAuB,CAAC,OAAO,EAAE;QACrC,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,oBAAoB,EAAE,OAAO,CAAA;KAC9B,GAAG,OAAO,CAAC,IAAI,CAAC;YAKH,yBAAyB;CA2BxC;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,yBAAyB,GAAG,mBAAmB,CAE3F;AAED,wBAAgB,SAAS,CAAC,aAAa,EAAE,yBAAyB,GAAG,mBAAmB,CAIvF"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { BroadcastWorker } from "./broadcast-worker.js";
|
|
2
2
|
import { buildSettings, broadcastsEnabled, validateComponent, } from "./configuration.js";
|
|
3
3
|
import { currentActor, withActorContext, withActorProjection, withApplicationWritesForbidden, } from "./context.js";
|
|
4
|
+
import { randomUUID } from "./platform/uuid.js";
|
|
4
5
|
import { DeadLetterManager } from "./dead-letters.js";
|
|
6
|
+
import { RedriveManager, RedriveScheduler } from "./redrive.js";
|
|
5
7
|
import { Doctor } from "./doctor.js";
|
|
6
8
|
import { clearDefaultRuntime, setDefaultRuntime } from "./default-runtime.js";
|
|
7
9
|
import { actorState, hydrateActor, initialStateFor, migrateState, validateDefinition, } from "./definition.js";
|
|
8
|
-
import { ActorCallCycle, ActorSetupFailed, ActorDestroyed, DatabaseDeadlineExceeded, InvalidPayloadBroadcast, InvalidActor, LostActivation, MessageFailed, NonRetryableError, QueryMutatedState, Rejected, SyncTimeout, SyncEnqueueTimeout, SyncInsideTransaction, Unauthorized, UnknownCommitAction, UnknownDeadLetter, UnknownEffect, UnknownActorType, UnknownOperation, UnknownPayloadBroadcast, } from "./errors.js";
|
|
10
|
+
import { ActorCallCycle, ActorSetupFailed, ActorDestroyed, DatabaseDeadlineExceeded, InvalidPayloadBroadcast, InvalidActor, LostActivation, MessageFailed, MessagePruned, NonRetryableError, QueryMutatedState, Rejected, SyncTimeout, SyncEnqueueTimeout, SyncInsideTransaction, Unauthorized, UnknownCommitAction, UnknownDeadLetter, UnknownEffect, UnknownActorType, UnknownOperation, UnknownPayloadBroadcast, } from "./errors.js";
|
|
9
11
|
import { ActorReferenceCore, createActorReference, MessageReference, } from "./reference.js";
|
|
10
12
|
import { ReconciliationManager, } from "./reconciliation.js";
|
|
11
13
|
import { Repository } from "./repository.js";
|
|
@@ -21,12 +23,35 @@ import { SolidObjectsTestHelper } from "./test-helper.js";
|
|
|
21
23
|
import { waitFor, Worker } from "./worker.js";
|
|
22
24
|
import { EffectWorker } from "./effect-worker.js";
|
|
23
25
|
import { notifyWakeUp } from "./wake-up-notification.js";
|
|
26
|
+
import { selectWakeUp } from "./wake-up-selection.js";
|
|
24
27
|
import { withDatabaseDeadline } from "./database/deadline.js";
|
|
25
28
|
import { evaluateActorTurn, readActorObservables } from "./turn.js";
|
|
29
|
+
function scheduledReminderOf(row) {
|
|
30
|
+
const operation = row.message_operation ?? row.operation;
|
|
31
|
+
const name = row.operation;
|
|
32
|
+
return {
|
|
33
|
+
name,
|
|
34
|
+
operation,
|
|
35
|
+
key: name === operation ? null : name.slice(operation.length + 1),
|
|
36
|
+
runAtMilliseconds: Number(row.run_at_ms),
|
|
37
|
+
intervalMilliseconds: row.interval_ms === null ? null : Number(row.interval_ms),
|
|
38
|
+
missedPolicy: row.missed_policy,
|
|
39
|
+
status: row.status,
|
|
40
|
+
handle: { name },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let administrationEventCounter = 0;
|
|
44
|
+
function administrationEventId(occurredAtMilliseconds) {
|
|
45
|
+
administrationEventCounter = (administrationEventCounter + 1) % 1_000_000;
|
|
46
|
+
const stamp = String(occurredAtMilliseconds).padStart(15, "0");
|
|
47
|
+
const counter = String(administrationEventCounter).padStart(6, "0");
|
|
48
|
+
return `${stamp}-${counter}-${randomUUID()}`;
|
|
49
|
+
}
|
|
26
50
|
export class SolidObjectsRuntime {
|
|
27
51
|
settings;
|
|
28
52
|
repository;
|
|
29
53
|
deadLetters;
|
|
54
|
+
redrives;
|
|
30
55
|
reconciliation;
|
|
31
56
|
retention;
|
|
32
57
|
doctor;
|
|
@@ -43,10 +68,15 @@ export class SolidObjectsRuntime {
|
|
|
43
68
|
running = false;
|
|
44
69
|
pollingOnlyWakeUpWarningEmitted = false;
|
|
45
70
|
pollingOnlyWakeUpWarningCheck;
|
|
71
|
+
wakeUpSelection;
|
|
72
|
+
wakeUpSelectionFailureLogged = false;
|
|
46
73
|
constructor(configuration) {
|
|
47
74
|
this.settings = buildSettings(configuration);
|
|
48
|
-
this.repository = new Repository(this.settings
|
|
75
|
+
this.repository = new Repository(this.settings, {
|
|
76
|
+
wakeUpAdapter: () => this.wakeUpAdapter(),
|
|
77
|
+
});
|
|
49
78
|
this.deadLetters = new DeadLetterManager(this);
|
|
79
|
+
this.redrives = new RedriveManager(this);
|
|
50
80
|
this.reconciliation = new ReconciliationManager(this);
|
|
51
81
|
this.retention = new RetentionManager(this);
|
|
52
82
|
this.doctor = new Doctor(this);
|
|
@@ -451,6 +481,50 @@ export class SolidObjectsRuntime {
|
|
|
451
481
|
});
|
|
452
482
|
return error;
|
|
453
483
|
}
|
|
484
|
+
// A request id is unique across the table, so the runtime answers it. An
|
|
485
|
+
// idempotency key is unique per actor, so a reference supplies that scope.
|
|
486
|
+
async findBy(input) {
|
|
487
|
+
const named = [input.requestId, input.idempotencyKey].filter((value) => value !== undefined).length;
|
|
488
|
+
if (named !== 1) {
|
|
489
|
+
throw new TypeError("findBy expects exactly one of requestId or idempotencyKey");
|
|
490
|
+
}
|
|
491
|
+
if (input.idempotencyKey !== undefined && !input.reference) {
|
|
492
|
+
throw new TypeError("findBy with idempotencyKey requires reference");
|
|
493
|
+
}
|
|
494
|
+
const message = await this.lookedUpMessage(input);
|
|
495
|
+
if (!message)
|
|
496
|
+
return await this.absentMessage(input);
|
|
497
|
+
if (!(await this.readableMessage(message, input.authorizationContext)))
|
|
498
|
+
return undefined;
|
|
499
|
+
return this.messageReferenceFromRow(message);
|
|
500
|
+
}
|
|
501
|
+
async messageOutcome(messageReference, options = {}) {
|
|
502
|
+
const message = await this.authorizeMessageReference(messageReference, options.authorizationContext);
|
|
503
|
+
const found = await this.repository.messageWithStatus(message.id);
|
|
504
|
+
if (!found) {
|
|
505
|
+
return Object.freeze({
|
|
506
|
+
status: "unknown",
|
|
507
|
+
result: undefined,
|
|
508
|
+
error: undefined,
|
|
509
|
+
rejection: undefined,
|
|
510
|
+
attempts: 0,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
const snapshot = found.message;
|
|
514
|
+
return Object.freeze({
|
|
515
|
+
status: found.status,
|
|
516
|
+
result: snapshot.result === null
|
|
517
|
+
? undefined
|
|
518
|
+
: readonlyCopy(normalizeJson(JSON.parse(snapshot.result))),
|
|
519
|
+
error: snapshot.error === null
|
|
520
|
+
? undefined
|
|
521
|
+
: readonlyCopy(JSON.parse(snapshot.error)),
|
|
522
|
+
rejection: snapshot.rejection === null
|
|
523
|
+
? undefined
|
|
524
|
+
: readonlyCopy(JSON.parse(snapshot.rejection)),
|
|
525
|
+
attempts: Number(snapshot.attempt_count),
|
|
526
|
+
});
|
|
527
|
+
}
|
|
454
528
|
async messageStatus(messageReference, options = {}) {
|
|
455
529
|
const message = await this.authorizeMessageReference(messageReference, options.authorizationContext);
|
|
456
530
|
return this.repository.messageStatus(message.id);
|
|
@@ -501,6 +575,9 @@ export class SolidObjectsRuntime {
|
|
|
501
575
|
definition: registered.definition,
|
|
502
576
|
actorId: reference.actorId,
|
|
503
577
|
state,
|
|
578
|
+
readReminders: async () => instance === undefined
|
|
579
|
+
? []
|
|
580
|
+
: (await this.repository.remindersForInstance(instance.id)).map(scheduledReminderOf),
|
|
504
581
|
});
|
|
505
582
|
const stateBefore = stableJson(actorState(actor, registered.definition.stateKeys));
|
|
506
583
|
const intentCount = actor.intentCount();
|
|
@@ -544,6 +621,11 @@ export class SolidObjectsRuntime {
|
|
|
544
621
|
definition: registered.definition,
|
|
545
622
|
actorId: options.actorId,
|
|
546
623
|
state,
|
|
624
|
+
...(instance === undefined
|
|
625
|
+
? {}
|
|
626
|
+
: {
|
|
627
|
+
readReminders: async () => (await this.repository.remindersForInstance(instance.id)).map(scheduledReminderOf),
|
|
628
|
+
}),
|
|
547
629
|
});
|
|
548
630
|
return readonlyCopy({
|
|
549
631
|
actorType: options.actorType,
|
|
@@ -597,6 +679,27 @@ export class SolidObjectsRuntime {
|
|
|
597
679
|
}
|
|
598
680
|
return destroyed;
|
|
599
681
|
}
|
|
682
|
+
wakeUpAfterRevival(kind) {
|
|
683
|
+
this.wakeUp(kind === "effect" ? "effects" : "broadcasts");
|
|
684
|
+
}
|
|
685
|
+
async administrationIdentity(authorizationContext) {
|
|
686
|
+
const identity = await this.settings.administrationIdentity(authorizationContext);
|
|
687
|
+
return identity === null || identity === undefined ? null : String(identity).slice(0, 255);
|
|
688
|
+
}
|
|
689
|
+
async writeAdministrationEvent(input) {
|
|
690
|
+
const occurredAt = await input.connection.nowMilliseconds();
|
|
691
|
+
await input.connection.run(`INSERT INTO ${this.repository.table("administration_events")}
|
|
692
|
+
(id, action, kind, subject_id, filters, actor, occurred_at_ms)
|
|
693
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
694
|
+
administrationEventId(occurredAt),
|
|
695
|
+
input.action,
|
|
696
|
+
input.kind,
|
|
697
|
+
input.subjectId ?? null,
|
|
698
|
+
input.filters === undefined ? null : JSON.stringify(input.filters),
|
|
699
|
+
input.actor,
|
|
700
|
+
occurredAt,
|
|
701
|
+
]);
|
|
702
|
+
}
|
|
600
703
|
async inspectDeadLetters(options = {}) {
|
|
601
704
|
await this.authorizeAdministration({
|
|
602
705
|
action: "inspect",
|
|
@@ -620,10 +723,18 @@ export class SolidObjectsRuntime {
|
|
|
620
723
|
if (!actor.operations.has(deadLetter.operation)) {
|
|
621
724
|
throw new UnknownOperation(`unknown dead-letter operation ${JSON.stringify(deadLetter.operation)}`);
|
|
622
725
|
}
|
|
726
|
+
const actorIdentity = await this.administrationIdentity(options.authorizationContext);
|
|
623
727
|
const message = await this.repository.retryDeadLetter({
|
|
624
728
|
id,
|
|
625
729
|
initialState: initialStateFor(actor.definition),
|
|
626
730
|
stateVersion: actor.definition.stateVersion,
|
|
731
|
+
audit: (connection) => this.writeAdministrationEvent({
|
|
732
|
+
connection,
|
|
733
|
+
action: "dead_letter.retry",
|
|
734
|
+
kind: "message",
|
|
735
|
+
subjectId: id,
|
|
736
|
+
actor: actorIdentity,
|
|
737
|
+
}),
|
|
627
738
|
});
|
|
628
739
|
this.emitInstrumentation("dead_letter.retried", {
|
|
629
740
|
deadLetterId: id,
|
|
@@ -840,6 +951,7 @@ export class SolidObjectsRuntime {
|
|
|
840
951
|
definition,
|
|
841
952
|
actorId: turn.message.actor_id,
|
|
842
953
|
state: deepCopy(state),
|
|
954
|
+
readReminders: async () => (await this.repository.remindersForInstance(turn.instance.id)).map(scheduledReminderOf),
|
|
843
955
|
});
|
|
844
956
|
}
|
|
845
957
|
catch (error) {
|
|
@@ -1040,12 +1152,21 @@ export class SolidObjectsRuntime {
|
|
|
1040
1152
|
throw new Error("abort runtime.run() and wait for it before closing the runtime");
|
|
1041
1153
|
await this.callerWorker?.stop();
|
|
1042
1154
|
this.realtime.close();
|
|
1043
|
-
await this.
|
|
1155
|
+
await this.closeWakeUp();
|
|
1044
1156
|
await this.settings.database.close();
|
|
1045
1157
|
clearDefaultRuntime(this);
|
|
1046
1158
|
}
|
|
1159
|
+
async wakeUpAdapter() {
|
|
1160
|
+
return (await this.resolveWakeUp()).adapter;
|
|
1161
|
+
}
|
|
1162
|
+
async wakeUpCapability() {
|
|
1163
|
+
return (await this.resolveWakeUp()).capability;
|
|
1164
|
+
}
|
|
1165
|
+
async watchWakeUp(role) {
|
|
1166
|
+
return await (await this.wakeUpAdapter()).watch(role);
|
|
1167
|
+
}
|
|
1047
1168
|
async warnIfPollingIsOnlyCrossProcessWakeUp() {
|
|
1048
|
-
if (this.
|
|
1169
|
+
if (this.pollingOnlyWakeUpWarningEmitted)
|
|
1049
1170
|
return;
|
|
1050
1171
|
if (this.pollingOnlyWakeUpWarningCheck)
|
|
1051
1172
|
return this.pollingOnlyWakeUpWarningCheck;
|
|
@@ -1061,6 +1182,8 @@ export class SolidObjectsRuntime {
|
|
|
1061
1182
|
}
|
|
1062
1183
|
}
|
|
1063
1184
|
async checkPollingOnlyCrossProcessWakeUp() {
|
|
1185
|
+
if ((await this.wakeUpCapability()).crossesProcesses)
|
|
1186
|
+
return;
|
|
1064
1187
|
if (!(await this.repository.hasLiveProcessOutsideCurrentHostProcess()))
|
|
1065
1188
|
return;
|
|
1066
1189
|
if (this.pollingOnlyWakeUpWarningEmitted)
|
|
@@ -1082,6 +1205,7 @@ export class SolidObjectsRuntime {
|
|
|
1082
1205
|
await this.callerWorker?.stop();
|
|
1083
1206
|
this.callerWorker = undefined;
|
|
1084
1207
|
this.realtime.close();
|
|
1208
|
+
await this.discardWakeUp();
|
|
1085
1209
|
await this.repository.resetForTesting();
|
|
1086
1210
|
}
|
|
1087
1211
|
emitInstrumentation(name, attributes) {
|
|
@@ -1142,7 +1266,8 @@ export class SolidObjectsRuntime {
|
|
|
1142
1266
|
if (!actor.operations.has(dispatchOperation)) {
|
|
1143
1267
|
throw new UnknownOperation(`unknown reminder operation ${JSON.stringify(dispatchOperation)}`);
|
|
1144
1268
|
}
|
|
1145
|
-
await this.repository.enqueueReminder(reminder, options)
|
|
1269
|
+
if (!(await this.repository.enqueueReminder(reminder, options)))
|
|
1270
|
+
return;
|
|
1146
1271
|
this.wakeUp("actors");
|
|
1147
1272
|
this.emitInstrumentation("reminder.enqueued", {
|
|
1148
1273
|
reminderId: reminder.id,
|
|
@@ -1240,6 +1365,101 @@ export class SolidObjectsRuntime {
|
|
|
1240
1365
|
this.wakeUp("actors");
|
|
1241
1366
|
return this.messageReferenceFromRow(message);
|
|
1242
1367
|
}
|
|
1368
|
+
async lookedUpMessage(input) {
|
|
1369
|
+
if (input.requestId !== undefined) {
|
|
1370
|
+
return await this.repository.findMessageByRequestId(input.requestId);
|
|
1371
|
+
}
|
|
1372
|
+
return await this.repository.findMessageByIdempotencyKey({
|
|
1373
|
+
actorType: input.reference.actorType,
|
|
1374
|
+
actorId: input.reference.actorId,
|
|
1375
|
+
idempotencyKey: input.idempotencyKey,
|
|
1376
|
+
});
|
|
1377
|
+
}
|
|
1378
|
+
// An actor remembers the idempotency keys of its own finished turns, so a
|
|
1379
|
+
// key it remembers and no longer has a row for was pruned. A request id is
|
|
1380
|
+
// generated by the runtime, so no actor remembers one and both cases read
|
|
1381
|
+
// the same. A caller the policy refuses learns nothing either way.
|
|
1382
|
+
async absentMessage(input) {
|
|
1383
|
+
if (input.idempotencyKey === undefined)
|
|
1384
|
+
return undefined;
|
|
1385
|
+
const reference = input.reference;
|
|
1386
|
+
const remembered = await this.repository.rememberedIdempotencyKey({
|
|
1387
|
+
actorType: reference.actorType,
|
|
1388
|
+
actorId: reference.actorId,
|
|
1389
|
+
idempotencyKey: input.idempotencyKey,
|
|
1390
|
+
});
|
|
1391
|
+
if (!remembered)
|
|
1392
|
+
return undefined;
|
|
1393
|
+
const readable = await this.readableOperation({
|
|
1394
|
+
actorType: reference.actorType,
|
|
1395
|
+
actorId: reference.actorId,
|
|
1396
|
+
operation: remembered.operation,
|
|
1397
|
+
argumentsValue: remembered.arguments,
|
|
1398
|
+
authorizationContext: input.authorizationContext,
|
|
1399
|
+
});
|
|
1400
|
+
if (!readable)
|
|
1401
|
+
return undefined;
|
|
1402
|
+
throw new MessagePruned(input.idempotencyKey);
|
|
1403
|
+
}
|
|
1404
|
+
async readableOperation(input) {
|
|
1405
|
+
try {
|
|
1406
|
+
const registered = this.fetchActor(input.actorType);
|
|
1407
|
+
if (!registered.operations.has(input.operation) && !registered.queries.has(input.operation))
|
|
1408
|
+
return false;
|
|
1409
|
+
await this.authorize({
|
|
1410
|
+
kind: this.isQuery(registered.definition, input.operation) ? "query" : "message",
|
|
1411
|
+
reference: new ActorReferenceCore({
|
|
1412
|
+
runtime: this,
|
|
1413
|
+
actorClass: registered.actorClass,
|
|
1414
|
+
actorType: input.actorType,
|
|
1415
|
+
actorId: input.actorId,
|
|
1416
|
+
operations: registered.operations,
|
|
1417
|
+
queries: registered.queries,
|
|
1418
|
+
}),
|
|
1419
|
+
operation: input.operation,
|
|
1420
|
+
argumentsValue: input.argumentsValue,
|
|
1421
|
+
authorizationContext: input.authorizationContext,
|
|
1422
|
+
});
|
|
1423
|
+
return true;
|
|
1424
|
+
}
|
|
1425
|
+
catch (error) {
|
|
1426
|
+
if (error instanceof Unauthorized || error instanceof UnknownActorType)
|
|
1427
|
+
return false;
|
|
1428
|
+
throw error;
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
// A lookup answers a question, so an absent row, an actor this process no
|
|
1432
|
+
// longer registers, and a caller the policy refuses all read the same. A
|
|
1433
|
+
// request id that threw where it was refused would be a way to ask whether
|
|
1434
|
+
// one exists.
|
|
1435
|
+
async readableMessage(message, authorizationContext) {
|
|
1436
|
+
try {
|
|
1437
|
+
const registered = this.fetchActor(message.actor_type);
|
|
1438
|
+
if (!registered.operations.has(message.operation) &&
|
|
1439
|
+
!registered.queries.has(message.operation))
|
|
1440
|
+
return false;
|
|
1441
|
+
await this.authorize({
|
|
1442
|
+
kind: this.isQuery(registered.definition, message.operation) ? "query" : "message",
|
|
1443
|
+
reference: new ActorReferenceCore({
|
|
1444
|
+
runtime: this,
|
|
1445
|
+
actorClass: registered.actorClass,
|
|
1446
|
+
actorType: message.actor_type,
|
|
1447
|
+
actorId: message.actor_id,
|
|
1448
|
+
operations: registered.operations,
|
|
1449
|
+
queries: registered.queries,
|
|
1450
|
+
}),
|
|
1451
|
+
operation: message.operation,
|
|
1452
|
+
argumentsValue: jsonObject(JSON.parse(message.arguments)),
|
|
1453
|
+
authorizationContext,
|
|
1454
|
+
});
|
|
1455
|
+
return true;
|
|
1456
|
+
}
|
|
1457
|
+
catch (error) {
|
|
1458
|
+
if (error instanceof Unauthorized || error instanceof UnknownActorType)
|
|
1459
|
+
return false;
|
|
1460
|
+
throw error;
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1243
1463
|
messageReferenceFromRow(message) {
|
|
1244
1464
|
return new MessageReference({
|
|
1245
1465
|
runtime: this,
|
|
@@ -1268,6 +1488,7 @@ export class SolidObjectsRuntime {
|
|
|
1268
1488
|
...(broadcastsEnabled(this.settings)
|
|
1269
1489
|
? Array.from({ length: this.settings.broadcastWorkerCount }, () => () => this.broadcastWorker())
|
|
1270
1490
|
: []),
|
|
1491
|
+
() => new RedriveScheduler(this),
|
|
1271
1492
|
...(this.settings.retentionIntervalMilliseconds > 0
|
|
1272
1493
|
? [
|
|
1273
1494
|
() => new MaintenanceScheduler({
|
|
@@ -1564,8 +1785,44 @@ export class SolidObjectsRuntime {
|
|
|
1564
1785
|
thresholdBytes: this.settings.warnStateBytes,
|
|
1565
1786
|
});
|
|
1566
1787
|
}
|
|
1788
|
+
resolveWakeUp() {
|
|
1789
|
+
this.wakeUpSelection ??= selectWakeUp({
|
|
1790
|
+
setting: this.settings.wakeUp,
|
|
1791
|
+
database: this.settings.database,
|
|
1792
|
+
idlePollingIntervalMilliseconds: this.settings.idlePollingIntervalMilliseconds,
|
|
1793
|
+
logger: this.settings.logger,
|
|
1794
|
+
});
|
|
1795
|
+
return this.wakeUpSelection;
|
|
1796
|
+
}
|
|
1797
|
+
async closeWakeUp() {
|
|
1798
|
+
const selection = this.wakeUpSelection;
|
|
1799
|
+
if (!selection)
|
|
1800
|
+
return;
|
|
1801
|
+
const selected = await selection.catch(() => undefined);
|
|
1802
|
+
await selected?.adapter.close();
|
|
1803
|
+
}
|
|
1804
|
+
async discardWakeUp() {
|
|
1805
|
+
await this.closeWakeUp();
|
|
1806
|
+
this.wakeUpSelection = undefined;
|
|
1807
|
+
this.wakeUpSelectionFailureLogged = false;
|
|
1808
|
+
}
|
|
1567
1809
|
wakeUp(role) {
|
|
1568
|
-
|
|
1810
|
+
void this.notifyWhenSelected(role);
|
|
1811
|
+
}
|
|
1812
|
+
async notifyWhenSelected(role) {
|
|
1813
|
+
try {
|
|
1814
|
+
const selected = await this.resolveWakeUp();
|
|
1815
|
+
notifyWakeUp({ adapter: selected.adapter, logger: this.settings.logger, role });
|
|
1816
|
+
}
|
|
1817
|
+
catch (error) {
|
|
1818
|
+
this.reportWakeUpSelectionFailure(error instanceof Error ? error.name : "Error");
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
reportWakeUpSelectionFailure(errorName) {
|
|
1822
|
+
if (this.wakeUpSelectionFailureLogged)
|
|
1823
|
+
return;
|
|
1824
|
+
this.wakeUpSelectionFailureLogged = true;
|
|
1825
|
+
this.settings.logger.error({ event: "solid_objects.wake_up.selection_failed", errorName });
|
|
1569
1826
|
}
|
|
1570
1827
|
async authorize(options) {
|
|
1571
1828
|
const { kind, reference, operation, argumentsValue, authorizationContext } = options;
|