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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helper.js","sourceRoot":"","sources":["../src/test-helper.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type JsonPrimitive = null | boolean | number | string;
|
|
2
|
+
export type JsonValue = JsonPrimitive | JsonValue[] | {
|
|
3
|
+
[key: string]: JsonValue;
|
|
4
|
+
};
|
|
5
|
+
export type JsonObject = {
|
|
6
|
+
[key: string]: JsonValue;
|
|
7
|
+
};
|
|
8
|
+
export type DeepReadonly<Value> = Value extends JsonPrimitive ? Value : Value extends readonly (infer Item)[] ? readonly DeepReadonly<Item>[] : Value extends object ? {
|
|
9
|
+
readonly [Key in keyof Value]: DeepReadonly<Value[Key]>;
|
|
10
|
+
} : Value;
|
|
11
|
+
export type ActorIdentifier = string | number;
|
|
12
|
+
export interface InvocationOptions<AuthorizationContext = unknown> {
|
|
13
|
+
authorizationContext?: AuthorizationContext;
|
|
14
|
+
idempotencyKey?: string;
|
|
15
|
+
timeoutMilliseconds?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface AsyncInvocationOptions<AuthorizationContext = unknown> {
|
|
18
|
+
authorizationContext?: AuthorizationContext;
|
|
19
|
+
idempotencyKey?: string;
|
|
20
|
+
availableAt?: Date;
|
|
21
|
+
}
|
|
22
|
+
export interface DestroyOptions<AuthorizationContext = unknown> {
|
|
23
|
+
authorizationContext?: AuthorizationContext;
|
|
24
|
+
}
|
|
25
|
+
export interface SnapshotOptions<AuthorizationContext = unknown> {
|
|
26
|
+
authorizationContext?: AuthorizationContext;
|
|
27
|
+
}
|
|
28
|
+
export interface AdministrationOptions<AuthorizationContext = unknown> {
|
|
29
|
+
authorizationContext?: AuthorizationContext;
|
|
30
|
+
}
|
|
31
|
+
export interface MessageContext {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly requestId: string;
|
|
34
|
+
readonly idempotencyKey: string | null;
|
|
35
|
+
readonly enqueuedAt: Date;
|
|
36
|
+
readonly actorType: string;
|
|
37
|
+
readonly actorId: string;
|
|
38
|
+
readonly sequence: bigint;
|
|
39
|
+
readonly attempt: number;
|
|
40
|
+
}
|
|
41
|
+
export interface EffectContext {
|
|
42
|
+
readonly id: string;
|
|
43
|
+
readonly attempt: number;
|
|
44
|
+
readonly sourceMessageId: string;
|
|
45
|
+
readonly actorType: string;
|
|
46
|
+
readonly actorId: string;
|
|
47
|
+
}
|
|
48
|
+
export interface CommitActionContext {
|
|
49
|
+
readonly actorType: string;
|
|
50
|
+
readonly actorId: string;
|
|
51
|
+
readonly messageId: string;
|
|
52
|
+
readonly requestId: string;
|
|
53
|
+
readonly sequence: bigint;
|
|
54
|
+
readonly activationGeneration: bigint;
|
|
55
|
+
readonly connection: DatabaseConnection;
|
|
56
|
+
}
|
|
57
|
+
export type MessageStatus = "ready" | "claimed" | "completed" | "rejected" | "dead" | "unknown";
|
|
58
|
+
export interface Logger {
|
|
59
|
+
debug(entry: Record<string, unknown>): void;
|
|
60
|
+
info(entry: Record<string, unknown>): void;
|
|
61
|
+
warn(entry: Record<string, unknown>): void;
|
|
62
|
+
error(entry: Record<string, unknown>): void;
|
|
63
|
+
}
|
|
64
|
+
export interface LongRunningComponent {
|
|
65
|
+
run(signal: AbortSignal): Promise<void>;
|
|
66
|
+
requestShutdown(): void;
|
|
67
|
+
stopped(): boolean;
|
|
68
|
+
stop(): Promise<void> | void;
|
|
69
|
+
}
|
|
70
|
+
import type { DatabaseConnection } from "./database/types.js";
|
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAA"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { WakeUpAdapter, WakeUpRole, WakeUpWatch } from "../wake-up.js";
|
|
2
|
+
export interface PostgreSQLWakeUpFailure {
|
|
3
|
+
operation: "connect" | "listen" | "connection";
|
|
4
|
+
error: Error;
|
|
5
|
+
}
|
|
6
|
+
export interface PostgreSQLWakeUpOptions {
|
|
7
|
+
connectionString: string;
|
|
8
|
+
channelPrefix?: string;
|
|
9
|
+
applicationName?: string;
|
|
10
|
+
onListenerError?: (failure: PostgreSQLWakeUpFailure) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class PostgreSQLWakeUpAdapter implements WakeUpAdapter {
|
|
13
|
+
private readonly clientConfiguration;
|
|
14
|
+
private readonly channels;
|
|
15
|
+
private readonly rolesByChannel;
|
|
16
|
+
private readonly generations;
|
|
17
|
+
private readonly waiters;
|
|
18
|
+
private readonly listenedRoles;
|
|
19
|
+
private readonly listening;
|
|
20
|
+
private readonly onListenerError;
|
|
21
|
+
private client;
|
|
22
|
+
private connecting;
|
|
23
|
+
private closed;
|
|
24
|
+
constructor(options: PostgreSQLWakeUpOptions);
|
|
25
|
+
watch(role: WakeUpRole): Promise<WakeUpWatch>;
|
|
26
|
+
notify(role: WakeUpRole): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
private ensureListening;
|
|
29
|
+
private listen;
|
|
30
|
+
private connectedClient;
|
|
31
|
+
private connectionFailed;
|
|
32
|
+
private connectionEnded;
|
|
33
|
+
private receive;
|
|
34
|
+
private wait;
|
|
35
|
+
private wake;
|
|
36
|
+
private wakeEveryRole;
|
|
37
|
+
private generation;
|
|
38
|
+
private channel;
|
|
39
|
+
private reportFailure;
|
|
40
|
+
}
|
|
41
|
+
export declare function postgresqlWakeUp(options: PostgreSQLWakeUpOptions): PostgreSQLWakeUpAdapter;
|
|
42
|
+
//# sourceMappingURL=postgresql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../src/wake-up/postgresql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAS3E,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAA;IAC9C,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAA;CAC7D;AAED,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4C;IAC5E,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAQ;gBAEV,OAAO,EAAE,uBAAuB;IAgCtC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ7C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,eAAe;YAgBf,MAAM;YAgBN,eAAe;IAwB7B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,IAAI;IAkCZ,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,aAAa;CAQtB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,uBAAuB,CAE1F"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { Client } from "pg";
|
|
2
|
+
const ROLES = [
|
|
3
|
+
"actors",
|
|
4
|
+
"effects",
|
|
5
|
+
"reminders",
|
|
6
|
+
"broadcasts",
|
|
7
|
+
];
|
|
8
|
+
export class PostgreSQLWakeUpAdapter {
|
|
9
|
+
clientConfiguration;
|
|
10
|
+
channels = new Map();
|
|
11
|
+
rolesByChannel = new Map();
|
|
12
|
+
generations = new Map();
|
|
13
|
+
waiters = new Map();
|
|
14
|
+
listenedRoles = new Set();
|
|
15
|
+
listening = new Map();
|
|
16
|
+
onListenerError;
|
|
17
|
+
client;
|
|
18
|
+
connecting;
|
|
19
|
+
closed = false;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
if (options.connectionString.length === 0) {
|
|
22
|
+
throw new TypeError("PostgreSQL wake-up connectionString must not be empty");
|
|
23
|
+
}
|
|
24
|
+
const channelPrefix = options.channelPrefix ?? "solid_objects";
|
|
25
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(channelPrefix)) {
|
|
26
|
+
throw new TypeError("PostgreSQL wake-up channelPrefix must contain only letters, digits, and underscores");
|
|
27
|
+
}
|
|
28
|
+
for (const role of ROLES) {
|
|
29
|
+
const channel = `${channelPrefix}_${role}`;
|
|
30
|
+
if (Buffer.byteLength(channel) > 63) {
|
|
31
|
+
throw new TypeError("PostgreSQL wake-up channel names must not exceed 63 bytes");
|
|
32
|
+
}
|
|
33
|
+
this.channels.set(role, channel);
|
|
34
|
+
this.rolesByChannel.set(channel, role);
|
|
35
|
+
}
|
|
36
|
+
this.clientConfiguration = {
|
|
37
|
+
connectionString: options.connectionString,
|
|
38
|
+
application_name: options.applicationName ?? "solid-objects-wake-up",
|
|
39
|
+
};
|
|
40
|
+
this.onListenerError =
|
|
41
|
+
options.onListenerError ??
|
|
42
|
+
((failure) => console.error({
|
|
43
|
+
event: "solid_objects.postgresql_wake_up.failed",
|
|
44
|
+
operation: failure.operation,
|
|
45
|
+
errorName: failure.error.name,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
async watch(role) {
|
|
49
|
+
await this.ensureListening(role);
|
|
50
|
+
const generation = this.generation(role);
|
|
51
|
+
return {
|
|
52
|
+
wait: (options) => this.wait({ role, generation, ...options }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async notify(role) {
|
|
56
|
+
if (this.closed)
|
|
57
|
+
return;
|
|
58
|
+
const client = await this.connectedClient();
|
|
59
|
+
await client.query("SELECT pg_notify($1, $2)", [this.channel(role), role]);
|
|
60
|
+
}
|
|
61
|
+
async close() {
|
|
62
|
+
if (this.closed)
|
|
63
|
+
return;
|
|
64
|
+
this.closed = true;
|
|
65
|
+
this.wakeEveryRole();
|
|
66
|
+
const connecting = this.connecting;
|
|
67
|
+
const client = this.client;
|
|
68
|
+
this.client = undefined;
|
|
69
|
+
this.connecting = undefined;
|
|
70
|
+
if (client) {
|
|
71
|
+
await client.end().catch((error) => this.reportFailure("connection", error));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!connecting)
|
|
75
|
+
return;
|
|
76
|
+
const connected = await connecting.catch(() => undefined);
|
|
77
|
+
await connected?.end().catch((error) => this.reportFailure("connection", error));
|
|
78
|
+
}
|
|
79
|
+
async ensureListening(role) {
|
|
80
|
+
if (this.closed || this.listenedRoles.has(role))
|
|
81
|
+
return;
|
|
82
|
+
const existing = this.listening.get(role);
|
|
83
|
+
if (existing) {
|
|
84
|
+
await existing;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const listening = this.listen(role);
|
|
88
|
+
this.listening.set(role, listening);
|
|
89
|
+
try {
|
|
90
|
+
await listening;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
if (this.listening.get(role) === listening)
|
|
94
|
+
this.listening.delete(role);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async listen(role) {
|
|
98
|
+
let client;
|
|
99
|
+
try {
|
|
100
|
+
client = await this.connectedClient();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
this.reportFailure("connect", error);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
await client.query(`LISTEN "${this.channel(role)}"`);
|
|
108
|
+
if (this.client === client)
|
|
109
|
+
this.listenedRoles.add(role);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.reportFailure("listen", error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async connectedClient() {
|
|
116
|
+
if (this.closed)
|
|
117
|
+
throw new Error("PostgreSQL wake-up adapter is closed");
|
|
118
|
+
if (this.client)
|
|
119
|
+
return this.client;
|
|
120
|
+
if (this.connecting)
|
|
121
|
+
return this.connecting;
|
|
122
|
+
const client = new Client(this.clientConfiguration);
|
|
123
|
+
client.on("notification", (notification) => this.receive(notification));
|
|
124
|
+
client.on("error", (error) => this.connectionFailed(client, error));
|
|
125
|
+
client.on("end", () => this.connectionEnded(client));
|
|
126
|
+
const connecting = client.connect().then(() => {
|
|
127
|
+
if (this.closed)
|
|
128
|
+
throw new Error("PostgreSQL wake-up adapter is closed");
|
|
129
|
+
this.client = client;
|
|
130
|
+
return client;
|
|
131
|
+
});
|
|
132
|
+
this.connecting = connecting;
|
|
133
|
+
try {
|
|
134
|
+
return await connecting;
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
await client.end().catch(() => undefined);
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
if (this.connecting === connecting)
|
|
142
|
+
this.connecting = undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
connectionFailed(client, error) {
|
|
146
|
+
if (this.client !== client || this.closed)
|
|
147
|
+
return;
|
|
148
|
+
this.client = undefined;
|
|
149
|
+
this.listenedRoles.clear();
|
|
150
|
+
this.listening.clear();
|
|
151
|
+
this.reportFailure("connection", error);
|
|
152
|
+
this.wakeEveryRole();
|
|
153
|
+
}
|
|
154
|
+
connectionEnded(client) {
|
|
155
|
+
if (this.client !== client || this.closed)
|
|
156
|
+
return;
|
|
157
|
+
this.client = undefined;
|
|
158
|
+
this.listenedRoles.clear();
|
|
159
|
+
this.listening.clear();
|
|
160
|
+
this.reportFailure("connection", new Error("PostgreSQL wake-up connection ended"));
|
|
161
|
+
this.wakeEveryRole();
|
|
162
|
+
}
|
|
163
|
+
receive(notification) {
|
|
164
|
+
const role = this.rolesByChannel.get(notification.channel);
|
|
165
|
+
if (!role)
|
|
166
|
+
return;
|
|
167
|
+
this.wake(role);
|
|
168
|
+
}
|
|
169
|
+
wait(options) {
|
|
170
|
+
if (this.closed || options.signal?.aborted)
|
|
171
|
+
return Promise.resolve();
|
|
172
|
+
if (this.generation(options.role) !== options.generation)
|
|
173
|
+
return Promise.resolve();
|
|
174
|
+
return new Promise((resolve) => {
|
|
175
|
+
let settled = false;
|
|
176
|
+
const waiters = this.waiters.get(options.role) ?? new Set();
|
|
177
|
+
const finish = () => {
|
|
178
|
+
if (settled)
|
|
179
|
+
return;
|
|
180
|
+
settled = true;
|
|
181
|
+
clearTimeout(timeout);
|
|
182
|
+
waiters.delete(finish);
|
|
183
|
+
if (waiters.size === 0)
|
|
184
|
+
this.waiters.delete(options.role);
|
|
185
|
+
options.signal?.removeEventListener("abort", finish);
|
|
186
|
+
resolve();
|
|
187
|
+
};
|
|
188
|
+
const timeout = setTimeout(finish, options.timeoutMilliseconds);
|
|
189
|
+
waiters.add(finish);
|
|
190
|
+
this.waiters.set(options.role, waiters);
|
|
191
|
+
options.signal?.addEventListener("abort", finish, { once: true });
|
|
192
|
+
if (this.closed ||
|
|
193
|
+
options.signal?.aborted ||
|
|
194
|
+
this.generation(options.role) !== options.generation) {
|
|
195
|
+
finish();
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
wake(role) {
|
|
200
|
+
this.generations.set(role, this.generation(role) + 1);
|
|
201
|
+
const waiters = this.waiters.get(role);
|
|
202
|
+
if (!waiters)
|
|
203
|
+
return;
|
|
204
|
+
this.waiters.delete(role);
|
|
205
|
+
for (const finish of waiters)
|
|
206
|
+
finish();
|
|
207
|
+
}
|
|
208
|
+
wakeEveryRole() {
|
|
209
|
+
for (const role of ROLES)
|
|
210
|
+
this.wake(role);
|
|
211
|
+
}
|
|
212
|
+
generation(role) {
|
|
213
|
+
return this.generations.get(role) ?? 0;
|
|
214
|
+
}
|
|
215
|
+
channel(role) {
|
|
216
|
+
const channel = this.channels.get(role);
|
|
217
|
+
if (!channel)
|
|
218
|
+
throw new TypeError(`unknown wake-up role ${role}`);
|
|
219
|
+
return channel;
|
|
220
|
+
}
|
|
221
|
+
reportFailure(operation, error) {
|
|
222
|
+
try {
|
|
223
|
+
this.onListenerError({
|
|
224
|
+
operation,
|
|
225
|
+
error: error instanceof Error ? error : new Error("PostgreSQL wake-up failed"),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch { }
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export function postgresqlWakeUp(options) {
|
|
232
|
+
return new PostgreSQLWakeUpAdapter(options);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=postgresql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/wake-up/postgresql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type WakeUpAdapter, type WakeUpRole, type WakeUpWatch } from "../wake-up.js";
|
|
2
|
+
export interface RedisWakeUpFailure {
|
|
3
|
+
operation: "connect" | "subscribe" | "publish" | "connection";
|
|
4
|
+
error: Error;
|
|
5
|
+
}
|
|
6
|
+
export interface RedisWakeUpOptions {
|
|
7
|
+
url: string;
|
|
8
|
+
channelPrefix?: string;
|
|
9
|
+
connectionTimeoutMilliseconds?: number;
|
|
10
|
+
onError?: (failure: RedisWakeUpFailure) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class RedisWakeUpAdapter implements WakeUpAdapter {
|
|
13
|
+
private readonly local;
|
|
14
|
+
private readonly publisher;
|
|
15
|
+
private readonly subscriber;
|
|
16
|
+
private readonly channels;
|
|
17
|
+
private readonly subscriptions;
|
|
18
|
+
private readonly connectionTimeoutMilliseconds;
|
|
19
|
+
private readonly onError;
|
|
20
|
+
private publisherConnection;
|
|
21
|
+
private subscriberConnection;
|
|
22
|
+
private closed;
|
|
23
|
+
constructor(options: RedisWakeUpOptions);
|
|
24
|
+
watch(role: WakeUpRole): Promise<WakeUpWatch>;
|
|
25
|
+
notify(role: WakeUpRole): Promise<void>;
|
|
26
|
+
close(): void;
|
|
27
|
+
private ensurePublisher;
|
|
28
|
+
private ensureSubscriber;
|
|
29
|
+
private ensureSubscribed;
|
|
30
|
+
private withTimeout;
|
|
31
|
+
private channel;
|
|
32
|
+
private report;
|
|
33
|
+
}
|
|
34
|
+
export declare function redisWakeUp(options: RedisWakeUpOptions): RedisWakeUpAdapter;
|
|
35
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/wake-up/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,eAAe,CAAA;AAStB,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,CAAA;IAC7D,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAChD;AAED,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAQ;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,mBAAmB,CAA2B;IACtD,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,MAAM,CAAQ;gBAEV,OAAO,EAAE,kBAAkB;IA+BjC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAS7C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,MAAM;CAQf;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAE3E"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { createClient } from "redis";
|
|
2
|
+
import { InProcessWakeUpAdapter, } from "../wake-up.js";
|
|
3
|
+
const ROLES = [
|
|
4
|
+
"actors",
|
|
5
|
+
"effects",
|
|
6
|
+
"reminders",
|
|
7
|
+
"broadcasts",
|
|
8
|
+
];
|
|
9
|
+
export class RedisWakeUpAdapter {
|
|
10
|
+
local = new InProcessWakeUpAdapter();
|
|
11
|
+
publisher;
|
|
12
|
+
subscriber;
|
|
13
|
+
channels = new Map();
|
|
14
|
+
subscriptions = new Map();
|
|
15
|
+
connectionTimeoutMilliseconds;
|
|
16
|
+
onError;
|
|
17
|
+
publisherConnection;
|
|
18
|
+
subscriberConnection;
|
|
19
|
+
closed = false;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
if (options.url.length === 0)
|
|
22
|
+
throw new TypeError("Redis wake-up url must not be empty");
|
|
23
|
+
const channelPrefix = options.channelPrefix ?? "solid_objects";
|
|
24
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(channelPrefix)) {
|
|
25
|
+
throw new TypeError("Redis wake-up channelPrefix must contain only letters, digits, and underscores");
|
|
26
|
+
}
|
|
27
|
+
const connectionTimeoutMilliseconds = options.connectionTimeoutMilliseconds ?? 1_000;
|
|
28
|
+
if (!Number.isFinite(connectionTimeoutMilliseconds) || connectionTimeoutMilliseconds <= 0) {
|
|
29
|
+
throw new TypeError("Redis wake-up connectionTimeoutMilliseconds must be positive");
|
|
30
|
+
}
|
|
31
|
+
this.connectionTimeoutMilliseconds = connectionTimeoutMilliseconds;
|
|
32
|
+
for (const role of ROLES)
|
|
33
|
+
this.channels.set(role, `${channelPrefix}:${role}`);
|
|
34
|
+
this.publisher = createClient({
|
|
35
|
+
url: options.url,
|
|
36
|
+
socket: { connectTimeout: connectionTimeoutMilliseconds },
|
|
37
|
+
});
|
|
38
|
+
this.subscriber = this.publisher.duplicate();
|
|
39
|
+
this.onError =
|
|
40
|
+
options.onError ??
|
|
41
|
+
((failure) => console.error({
|
|
42
|
+
event: "solid_objects.redis_wake_up.failed",
|
|
43
|
+
operation: failure.operation,
|
|
44
|
+
errorName: failure.error.name,
|
|
45
|
+
}));
|
|
46
|
+
this.publisher.on("error", (error) => this.report("connection", error));
|
|
47
|
+
this.subscriber.on("error", (error) => this.report("connection", error));
|
|
48
|
+
}
|
|
49
|
+
async watch(role) {
|
|
50
|
+
if (!this.closed) {
|
|
51
|
+
await this.withTimeout(this.ensureSubscribed(role)).catch((error) => {
|
|
52
|
+
this.report("subscribe", error);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return this.local.watch(role);
|
|
56
|
+
}
|
|
57
|
+
async notify(role) {
|
|
58
|
+
if (this.closed)
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
await this.withTimeout(this.ensurePublisher());
|
|
62
|
+
await this.publisher.publish(this.channel(role), role);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
this.report("publish", error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
close() {
|
|
69
|
+
if (this.closed)
|
|
70
|
+
return;
|
|
71
|
+
this.closed = true;
|
|
72
|
+
this.local.close();
|
|
73
|
+
if (this.publisher.isOpen)
|
|
74
|
+
this.publisher.destroy();
|
|
75
|
+
if (this.subscriber.isOpen)
|
|
76
|
+
this.subscriber.destroy();
|
|
77
|
+
}
|
|
78
|
+
ensurePublisher() {
|
|
79
|
+
if (this.publisher.isReady)
|
|
80
|
+
return Promise.resolve();
|
|
81
|
+
if (this.publisherConnection)
|
|
82
|
+
return this.publisherConnection;
|
|
83
|
+
const connection = this.publisher.connect().then(() => undefined);
|
|
84
|
+
this.publisherConnection = connection;
|
|
85
|
+
void connection
|
|
86
|
+
.catch((error) => this.report("connect", error))
|
|
87
|
+
.finally(() => {
|
|
88
|
+
if (this.publisherConnection === connection)
|
|
89
|
+
this.publisherConnection = undefined;
|
|
90
|
+
});
|
|
91
|
+
return connection;
|
|
92
|
+
}
|
|
93
|
+
ensureSubscriber() {
|
|
94
|
+
if (this.subscriber.isReady)
|
|
95
|
+
return Promise.resolve();
|
|
96
|
+
if (this.subscriberConnection)
|
|
97
|
+
return this.subscriberConnection;
|
|
98
|
+
const connection = this.subscriber.connect().then(() => undefined);
|
|
99
|
+
this.subscriberConnection = connection;
|
|
100
|
+
void connection
|
|
101
|
+
.catch((error) => this.report("connect", error))
|
|
102
|
+
.finally(() => {
|
|
103
|
+
if (this.subscriberConnection === connection)
|
|
104
|
+
this.subscriberConnection = undefined;
|
|
105
|
+
});
|
|
106
|
+
return connection;
|
|
107
|
+
}
|
|
108
|
+
ensureSubscribed(role) {
|
|
109
|
+
const existing = this.subscriptions.get(role);
|
|
110
|
+
if (existing)
|
|
111
|
+
return existing;
|
|
112
|
+
const subscription = this.ensureSubscriber().then(() => this.subscriber.subscribe(this.channel(role), () => this.local.notify(role)));
|
|
113
|
+
this.subscriptions.set(role, subscription);
|
|
114
|
+
void subscription.catch(() => {
|
|
115
|
+
if (this.subscriptions.get(role) === subscription)
|
|
116
|
+
this.subscriptions.delete(role);
|
|
117
|
+
});
|
|
118
|
+
return subscription;
|
|
119
|
+
}
|
|
120
|
+
withTimeout(operation) {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
const timeout = setTimeout(() => reject(new Error("Redis wake-up connection timed out")), this.connectionTimeoutMilliseconds);
|
|
123
|
+
void operation.then((result) => {
|
|
124
|
+
clearTimeout(timeout);
|
|
125
|
+
resolve(result);
|
|
126
|
+
}, (error) => {
|
|
127
|
+
clearTimeout(timeout);
|
|
128
|
+
reject(error);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
channel(role) {
|
|
133
|
+
const channel = this.channels.get(role);
|
|
134
|
+
if (!channel)
|
|
135
|
+
throw new TypeError(`unknown wake-up role ${role}`);
|
|
136
|
+
return channel;
|
|
137
|
+
}
|
|
138
|
+
report(operation, error) {
|
|
139
|
+
try {
|
|
140
|
+
this.onError({
|
|
141
|
+
operation,
|
|
142
|
+
error: error instanceof Error ? error : new Error("Redis wake-up failed"),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
catch { }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export function redisWakeUp(options) {
|
|
149
|
+
return new RedisWakeUpAdapter(options);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/wake-up/redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type WakeUpRole = "actors" | "effects" | "reminders" | "broadcasts";
|
|
2
|
+
export interface WakeUpWaitOptions {
|
|
3
|
+
timeoutMilliseconds: number;
|
|
4
|
+
signal?: AbortSignal;
|
|
5
|
+
}
|
|
6
|
+
export interface WakeUpWatch {
|
|
7
|
+
wait(options: WakeUpWaitOptions): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface WakeUpAdapter {
|
|
10
|
+
watch(role: WakeUpRole): WakeUpWatch | Promise<WakeUpWatch>;
|
|
11
|
+
notify(role: WakeUpRole): void | Promise<void>;
|
|
12
|
+
close(): void | Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare class InProcessWakeUpAdapter implements WakeUpAdapter {
|
|
15
|
+
private readonly generations;
|
|
16
|
+
private readonly waiters;
|
|
17
|
+
private closed;
|
|
18
|
+
watch(role: WakeUpRole): WakeUpWatch;
|
|
19
|
+
notify(role: WakeUpRole): void;
|
|
20
|
+
close(): void;
|
|
21
|
+
private wait;
|
|
22
|
+
private generation;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=wake-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake-up.d.ts","sourceRoot":"","sources":["../src/wake-up.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAA;AAE1E,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3D,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAED,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,MAAM,CAAQ;IAEtB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW;IAOpC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAS9B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,IAAI;IAmCZ,OAAO,CAAC,UAAU;CAGnB"}
|