solid-objects 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/MIT-LICENSE +19 -0
  3. package/README.md +958 -0
  4. package/dist/actor.d.ts +81 -0
  5. package/dist/actor.d.ts.map +1 -0
  6. package/dist/actor.js +141 -0
  7. package/dist/actor.js.map +1 -0
  8. package/dist/application-database.d.ts +3 -0
  9. package/dist/application-database.d.ts.map +1 -0
  10. package/dist/application-database.js +59 -0
  11. package/dist/application-database.js.map +1 -0
  12. package/dist/broadcast-worker.d.ts +18 -0
  13. package/dist/broadcast-worker.d.ts.map +1 -0
  14. package/dist/broadcast-worker.js +74 -0
  15. package/dist/broadcast-worker.js.map +1 -0
  16. package/dist/browser/components.d.ts +64 -0
  17. package/dist/browser/components.d.ts.map +1 -0
  18. package/dist/browser/components.js +294 -0
  19. package/dist/browser/components.js.map +1 -0
  20. package/dist/browser/index.d.ts +46 -0
  21. package/dist/browser/index.d.ts.map +1 -0
  22. package/dist/browser/index.js +207 -0
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/cli.d.ts +9 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +216 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/configuration.d.ts +96 -0
  29. package/dist/configuration.d.ts.map +1 -0
  30. package/dist/configuration.js +169 -0
  31. package/dist/configuration.js.map +1 -0
  32. package/dist/context.d.ts +20 -0
  33. package/dist/context.d.ts.map +1 -0
  34. package/dist/context.js +24 -0
  35. package/dist/context.js.map +1 -0
  36. package/dist/database/deadline.d.ts +9 -0
  37. package/dist/database/deadline.d.ts.map +1 -0
  38. package/dist/database/deadline.js +49 -0
  39. package/dist/database/deadline.js.map +1 -0
  40. package/dist/database/mysql.d.ts +21 -0
  41. package/dist/database/mysql.d.ts.map +1 -0
  42. package/dist/database/mysql.js +192 -0
  43. package/dist/database/mysql.js.map +1 -0
  44. package/dist/database/postgresql-sql.d.ts +2 -0
  45. package/dist/database/postgresql-sql.d.ts.map +1 -0
  46. package/dist/database/postgresql-sql.js +102 -0
  47. package/dist/database/postgresql-sql.js.map +1 -0
  48. package/dist/database/postgresql.d.ts +31 -0
  49. package/dist/database/postgresql.d.ts.map +1 -0
  50. package/dist/database/postgresql.js +172 -0
  51. package/dist/database/postgresql.js.map +1 -0
  52. package/dist/database/sqlite.d.ts +27 -0
  53. package/dist/database/sqlite.d.ts.map +1 -0
  54. package/dist/database/sqlite.js +190 -0
  55. package/dist/database/sqlite.js.map +1 -0
  56. package/dist/database/transaction-context.d.ts +3 -0
  57. package/dist/database/transaction-context.d.ts.map +1 -0
  58. package/dist/database/transaction-context.js +19 -0
  59. package/dist/database/transaction-context.js.map +1 -0
  60. package/dist/database/types.d.ts +20 -0
  61. package/dist/database/types.d.ts.map +1 -0
  62. package/dist/database/types.js +2 -0
  63. package/dist/database/types.js.map +1 -0
  64. package/dist/dead-letters.d.ts +23 -0
  65. package/dist/dead-letters.d.ts.map +1 -0
  66. package/dist/dead-letters.js +13 -0
  67. package/dist/dead-letters.js.map +1 -0
  68. package/dist/default-runtime.d.ts +5 -0
  69. package/dist/default-runtime.d.ts.map +1 -0
  70. package/dist/default-runtime.js +14 -0
  71. package/dist/default-runtime.js.map +1 -0
  72. package/dist/definition.d.ts +32 -0
  73. package/dist/definition.d.ts.map +1 -0
  74. package/dist/definition.js +173 -0
  75. package/dist/definition.js.map +1 -0
  76. package/dist/doctor.d.ts +32 -0
  77. package/dist/doctor.d.ts.map +1 -0
  78. package/dist/doctor.js +500 -0
  79. package/dist/doctor.js.map +1 -0
  80. package/dist/effect-worker.d.ts +18 -0
  81. package/dist/effect-worker.d.ts.map +1 -0
  82. package/dist/effect-worker.js +74 -0
  83. package/dist/effect-worker.js.map +1 -0
  84. package/dist/errors.d.ts +145 -0
  85. package/dist/errors.d.ts.map +1 -0
  86. package/dist/errors.js +120 -0
  87. package/dist/errors.js.map +1 -0
  88. package/dist/executable.d.ts +3 -0
  89. package/dist/executable.d.ts.map +1 -0
  90. package/dist/executable.js +12 -0
  91. package/dist/executable.js.map +1 -0
  92. package/dist/index.d.ts +24 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +21 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/maintenance-scheduler.d.ts +17 -0
  97. package/dist/maintenance-scheduler.d.ts.map +1 -0
  98. package/dist/maintenance-scheduler.js +41 -0
  99. package/dist/maintenance-scheduler.js.map +1 -0
  100. package/dist/process-administration.d.ts +30 -0
  101. package/dist/process-administration.d.ts.map +1 -0
  102. package/dist/process-administration.js +13 -0
  103. package/dist/process-administration.js.map +1 -0
  104. package/dist/realtime.d.ts +33 -0
  105. package/dist/realtime.d.ts.map +1 -0
  106. package/dist/realtime.js +238 -0
  107. package/dist/realtime.js.map +1 -0
  108. package/dist/reconciliation.d.ts +41 -0
  109. package/dist/reconciliation.d.ts.map +1 -0
  110. package/dist/reconciliation.js +19 -0
  111. package/dist/reconciliation.js.map +1 -0
  112. package/dist/records.d.ts +137 -0
  113. package/dist/records.d.ts.map +1 -0
  114. package/dist/records.js +2 -0
  115. package/dist/records.js.map +1 -0
  116. package/dist/reference.d.ts +97 -0
  117. package/dist/reference.d.ts.map +1 -0
  118. package/dist/reference.js +157 -0
  119. package/dist/reference.js.map +1 -0
  120. package/dist/reminder-administration.d.ts +35 -0
  121. package/dist/reminder-administration.d.ts.map +1 -0
  122. package/dist/reminder-administration.js +13 -0
  123. package/dist/reminder-administration.js.map +1 -0
  124. package/dist/reminder-scheduler.d.ts +18 -0
  125. package/dist/reminder-scheduler.d.ts.map +1 -0
  126. package/dist/reminder-scheduler.js +88 -0
  127. package/dist/reminder-scheduler.js.map +1 -0
  128. package/dist/repository.d.ts +142 -0
  129. package/dist/repository.d.ts.map +1 -0
  130. package/dist/repository.js +1237 -0
  131. package/dist/repository.js.map +1 -0
  132. package/dist/retention.d.ts +17 -0
  133. package/dist/retention.d.ts.map +1 -0
  134. package/dist/retention.js +13 -0
  135. package/dist/retention.js.map +1 -0
  136. package/dist/runtime.d.ts +140 -0
  137. package/dist/runtime.d.ts.map +1 -0
  138. package/dist/runtime.js +1737 -0
  139. package/dist/runtime.js.map +1 -0
  140. package/dist/schema.d.ts +8 -0
  141. package/dist/schema.d.ts.map +1 -0
  142. package/dist/schema.js +260 -0
  143. package/dist/schema.js.map +1 -0
  144. package/dist/serialization.d.ts +11 -0
  145. package/dist/serialization.d.ts.map +1 -0
  146. package/dist/serialization.js +82 -0
  147. package/dist/serialization.js.map +1 -0
  148. package/dist/test-helper.d.ts +15 -0
  149. package/dist/test-helper.d.ts.map +1 -0
  150. package/dist/test-helper.js +69 -0
  151. package/dist/test-helper.js.map +1 -0
  152. package/dist/types.d.ts +71 -0
  153. package/dist/types.d.ts.map +1 -0
  154. package/dist/types.js +2 -0
  155. package/dist/types.js.map +1 -0
  156. package/dist/version.d.ts +2 -0
  157. package/dist/version.d.ts.map +1 -0
  158. package/dist/version.js +2 -0
  159. package/dist/version.js.map +1 -0
  160. package/dist/wake-up/postgresql.d.ts +42 -0
  161. package/dist/wake-up/postgresql.d.ts.map +1 -0
  162. package/dist/wake-up/postgresql.js +234 -0
  163. package/dist/wake-up/postgresql.js.map +1 -0
  164. package/dist/wake-up/redis.d.ts +35 -0
  165. package/dist/wake-up/redis.d.ts.map +1 -0
  166. package/dist/wake-up/redis.js +151 -0
  167. package/dist/wake-up/redis.js.map +1 -0
  168. package/dist/wake-up.d.ts +24 -0
  169. package/dist/wake-up.d.ts.map +1 -0
  170. package/dist/wake-up.js +66 -0
  171. package/dist/wake-up.js.map +1 -0
  172. package/dist/worker.d.ts +36 -0
  173. package/dist/worker.d.ts.map +1 -0
  174. package/dist/worker.js +281 -0
  175. package/dist/worker.js.map +1 -0
  176. package/docs/api.md +197 -0
  177. package/docs/architecture.md +113 -0
  178. package/docs/authorization.md +31 -0
  179. package/docs/browser-protocol.md +93 -0
  180. package/docs/configuration.md +168 -0
  181. package/docs/correctness.md +53 -0
  182. package/docs/errors-and-recovery.md +89 -0
  183. package/docs/operations.md +170 -0
  184. package/docs/parity.md +94 -0
  185. package/docs/releasing.md +45 -0
  186. package/docs/state-and-lifecycle.md +162 -0
  187. package/package.json +100 -0
@@ -0,0 +1,190 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { databaseDeadlineError, databaseDeadlineRemainingMilliseconds, requireDatabaseDeadlineRemaining, } from "./deadline.js";
3
+ import { DatabaseDeadlineExceeded } from "../errors.js";
4
+ import { databaseTransactionActive, withDatabaseTransaction } from "./transaction-context.js";
5
+ class SQLiteConnection {
6
+ database;
7
+ constructor(database) {
8
+ this.database = database;
9
+ }
10
+ async run(sql, parameters = []) {
11
+ requireDatabaseDeadlineRemaining();
12
+ const result = this.database.prepare(sql).run(...parameters.map(normalizeParameter));
13
+ const output = { changes: Number(result.changes) };
14
+ if (result.lastInsertRowid !== 0)
15
+ output.lastInsertId = String(result.lastInsertRowid);
16
+ return output;
17
+ }
18
+ async get(sql, parameters = []) {
19
+ requireDatabaseDeadlineRemaining();
20
+ return this.database.prepare(sql).get(...parameters.map(normalizeParameter));
21
+ }
22
+ async all(sql, parameters = []) {
23
+ requireDatabaseDeadlineRemaining();
24
+ return this.database.prepare(sql).all(...parameters.map(normalizeParameter));
25
+ }
26
+ async nowMilliseconds() {
27
+ requireDatabaseDeadlineRemaining();
28
+ const row = this.database
29
+ .prepare("SELECT CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER) AS now_ms")
30
+ .get();
31
+ return Number(row.now_ms);
32
+ }
33
+ }
34
+ export class SQLiteDatabase {
35
+ family = "sqlite";
36
+ schemaIdentity = "solid-objects-node-v1";
37
+ database;
38
+ databaseConnection;
39
+ accessTail = Promise.resolve();
40
+ closed = false;
41
+ timeoutMilliseconds;
42
+ lockRetryAttempts;
43
+ constructor(options) {
44
+ this.timeoutMilliseconds = options.timeoutMilliseconds ?? 5_000;
45
+ this.lockRetryAttempts = options.lockRetryAttempts ?? 10;
46
+ if (!Number.isSafeInteger(this.lockRetryAttempts) || this.lockRetryAttempts < 1) {
47
+ throw new TypeError("lockRetryAttempts must be a positive safe integer");
48
+ }
49
+ this.database = new DatabaseSync(options.path, {
50
+ timeout: this.timeoutMilliseconds,
51
+ readBigInts: true,
52
+ });
53
+ this.database.exec("PRAGMA foreign_keys = ON");
54
+ this.databaseConnection = new SQLiteConnection(this.database);
55
+ }
56
+ async connection(callback) {
57
+ return this.withAccess(() => callback(this.databaseConnection));
58
+ }
59
+ async transaction(callback) {
60
+ return withDatabaseTransaction(this, () => this.withAccess(() => this.runTransaction(callback)));
61
+ }
62
+ transactionActive() {
63
+ return databaseTransactionActive(this);
64
+ }
65
+ async close() {
66
+ if (this.closed)
67
+ return;
68
+ await this.accessTail;
69
+ if (this.closed)
70
+ return;
71
+ this.database.close();
72
+ this.closed = true;
73
+ }
74
+ async withAccess(callback) {
75
+ const initialRemaining = requireDatabaseDeadlineRemaining();
76
+ const previous = this.accessTail;
77
+ let release = () => { };
78
+ this.accessTail = new Promise((resolve) => {
79
+ release = resolve;
80
+ });
81
+ if (initialRemaining !== undefined) {
82
+ try {
83
+ await waitForAccess(previous, initialRemaining);
84
+ }
85
+ catch (error) {
86
+ void previous.then(release, release);
87
+ throw error;
88
+ }
89
+ }
90
+ else {
91
+ await previous;
92
+ }
93
+ try {
94
+ if (initialRemaining !== undefined)
95
+ requireDatabaseDeadlineRemaining();
96
+ return await this.withBusyTimeout(callback);
97
+ }
98
+ finally {
99
+ release();
100
+ }
101
+ }
102
+ async withBusyTimeout(callback) {
103
+ const remaining = requireDatabaseDeadlineRemaining();
104
+ if (remaining === undefined)
105
+ return callback();
106
+ this.database.exec(`PRAGMA busy_timeout = ${Math.max(remaining, 1)}`);
107
+ try {
108
+ return await callback();
109
+ }
110
+ catch (error) {
111
+ if (!sqliteBusyError(error))
112
+ throw error;
113
+ throw databaseDeadlineError(error);
114
+ }
115
+ finally {
116
+ this.database.exec(`PRAGMA busy_timeout = ${this.timeoutMilliseconds}`);
117
+ }
118
+ }
119
+ async runTransaction(callback) {
120
+ await this.beginTransactionWithRetry();
121
+ try {
122
+ const result = await callback(this.databaseConnection);
123
+ this.database.exec("COMMIT");
124
+ return result;
125
+ }
126
+ catch (error) {
127
+ this.database.exec("ROLLBACK");
128
+ throw error;
129
+ }
130
+ }
131
+ async beginTransactionWithRetry() {
132
+ let retries = 0;
133
+ while (true) {
134
+ try {
135
+ this.database.exec("BEGIN IMMEDIATE");
136
+ return;
137
+ }
138
+ catch (error) {
139
+ if (databaseDeadlineRemainingMilliseconds() !== undefined)
140
+ throw error;
141
+ if (!sqliteBusyError(error) || retries >= this.lockRetryAttempts)
142
+ throw error;
143
+ retries += 1;
144
+ await waitForRetry(retries);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ function waitForAccess(access, timeoutMilliseconds) {
150
+ return new Promise((resolve, reject) => {
151
+ const timeout = setTimeout(() => reject(new DatabaseDeadlineExceeded("database deadline exceeded")), timeoutMilliseconds);
152
+ void access.then(() => {
153
+ clearTimeout(timeout);
154
+ resolve();
155
+ }, (error) => {
156
+ clearTimeout(timeout);
157
+ reject(error);
158
+ });
159
+ });
160
+ }
161
+ function waitForRetry(attempt) {
162
+ const milliseconds = Math.min(2 ** (attempt - 1), 250);
163
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
164
+ }
165
+ export function sqlite(options) {
166
+ return new SQLiteDatabase(options);
167
+ }
168
+ function normalizeParameter(value) {
169
+ if (value === undefined)
170
+ return null;
171
+ if (value === null ||
172
+ typeof value === "string" ||
173
+ typeof value === "number" ||
174
+ typeof value === "bigint" ||
175
+ value instanceof Uint8Array)
176
+ return value;
177
+ if (typeof value === "boolean")
178
+ return value ? 1 : 0;
179
+ throw new TypeError(`unsupported SQLite parameter ${typeof value}`);
180
+ }
181
+ function sqliteBusyError(error) {
182
+ return (typeof error === "object" &&
183
+ error !== null &&
184
+ "code" in error &&
185
+ (error.code === "ERR_SQLITE_ERROR" || error.code === "SQLITE_BUSY") &&
186
+ "message" in error &&
187
+ typeof error.message === "string" &&
188
+ error.message.includes("database is locked"));
189
+ }
190
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/database/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function withDatabaseTransaction<Result>(database: object, operation: () => Promise<Result>): Promise<Result>;
2
+ export declare function databaseTransactionActive(database: object): boolean;
3
+ //# sourceMappingURL=transaction-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../../src/database/transaction-context.ts"],"names":[],"mappings":"AASA,wBAAgB,uBAAuB,CAAC,MAAM,EAC5C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKnE"}
@@ -0,0 +1,19 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const transactionScopes = new AsyncLocalStorage();
3
+ export function withDatabaseTransaction(database, operation) {
4
+ const scope = { database, active: true };
5
+ const scopes = [...(transactionScopes.getStore() ?? []), scope];
6
+ return transactionScopes.run(scopes, async () => {
7
+ try {
8
+ return await operation();
9
+ }
10
+ finally {
11
+ scope.active = false;
12
+ }
13
+ });
14
+ }
15
+ export function databaseTransactionActive(database) {
16
+ return (transactionScopes.getStore()?.some((scope) => scope.database === database && scope.active) ??
17
+ false);
18
+ }
19
+ //# sourceMappingURL=transaction-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-context.js","sourceRoot":"","sources":["../../src/database/transaction-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAOpD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAA+B,CAAA;AAE9E,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,SAAgC;IAEhC,MAAM,KAAK,GAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAC1D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IAC/D,OAAO,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QAC9C,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAA;QAC1B,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,MAAM,GAAG,KAAK,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,OAAO,CACL,iBAAiB,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;QAC1F,KAAK,CACN,CAAA;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type DatabaseFamily = "sqlite" | "postgresql" | "mysql";
2
+ export interface RunResult {
3
+ changes: number;
4
+ lastInsertId?: string;
5
+ }
6
+ export interface DatabaseConnection {
7
+ run(sql: string, parameters?: readonly unknown[]): Promise<RunResult>;
8
+ get<Row extends object>(sql: string, parameters?: readonly unknown[]): Promise<Row | undefined>;
9
+ all<Row extends object>(sql: string, parameters?: readonly unknown[]): Promise<Row[]>;
10
+ nowMilliseconds(): Promise<number>;
11
+ }
12
+ export interface Database {
13
+ readonly family: DatabaseFamily;
14
+ readonly schemaIdentity: string;
15
+ transactionActive?(): boolean;
16
+ connection<Result>(callback: (connection: DatabaseConnection) => Promise<Result>): Promise<Result>;
17
+ transaction<Result>(callback: (connection: DatabaseConnection) => Promise<Result>): Promise<Result>;
18
+ close(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/database/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAA;AAE9D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACrE,GAAG,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAA;IAC/F,GAAG,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACrF,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,iBAAiB,CAAC,IAAI,OAAO,CAAA;IAC7B,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAClG,WAAW,CAAC,MAAM,EAChB,QAAQ,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,GAC5D,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/database/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { MessageReference } from "./reference.js";
2
+ import type { SolidObjectsRuntime } from "./runtime.js";
3
+ import type { AdministrationOptions, DeepReadonly, JsonObject, JsonValue } from "./types.js";
4
+ export interface DeadLetter {
5
+ readonly id: string;
6
+ readonly messageId: string;
7
+ readonly actorType: string;
8
+ readonly actorId: string;
9
+ readonly operation: string;
10
+ readonly deliveryMode: "async" | "sync" | "internal";
11
+ readonly arguments: DeepReadonly<JsonObject>;
12
+ readonly attempts: number;
13
+ readonly error: DeepReadonly<Record<string, JsonValue>>;
14
+ readonly createdAt: Date;
15
+ readonly retriedMessageId: string | null;
16
+ }
17
+ export declare class DeadLetterManager {
18
+ private readonly runtime;
19
+ constructor(runtime: SolidObjectsRuntime);
20
+ all(options?: AdministrationOptions): Promise<readonly DeadLetter[]>;
21
+ retry(id: string, options?: AdministrationOptions): Promise<MessageReference>;
22
+ }
23
+ //# sourceMappingURL=dead-letters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-letters.d.ts","sourceRoot":"","sources":["../src/dead-letters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAA;IACpD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;IACvD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CACzC;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,mBAAmB;IAEzD,GAAG,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC;IAIxE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAGlF"}
@@ -0,0 +1,13 @@
1
+ export class DeadLetterManager {
2
+ runtime;
3
+ constructor(runtime) {
4
+ this.runtime = runtime;
5
+ }
6
+ all(options = {}) {
7
+ return this.runtime.inspectDeadLetters(options);
8
+ }
9
+ retry(id, options = {}) {
10
+ return this.runtime.retryDeadLetter(id, options);
11
+ }
12
+ }
13
+ //# sourceMappingURL=dead-letters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-letters.js","sourceRoot":"","sources":["../src/dead-letters.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAE7D,GAAG,CAAC,UAAiC,EAAE;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,UAAiC,EAAE;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { SolidObjectsRuntime } from "./runtime.js";
2
+ export declare function setDefaultRuntime(value: SolidObjectsRuntime): void;
3
+ export declare function getDefaultRuntime(): SolidObjectsRuntime;
4
+ export declare function clearDefaultRuntime(value?: SolidObjectsRuntime): void;
5
+ //# sourceMappingURL=default-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-runtime.d.ts","sourceRoot":"","sources":["../src/default-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAIvD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAElE;AAED,wBAAgB,iBAAiB,IAAI,mBAAmB,CAGvD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAErE"}
@@ -0,0 +1,14 @@
1
+ let runtime;
2
+ export function setDefaultRuntime(value) {
3
+ runtime = value;
4
+ }
5
+ export function getDefaultRuntime() {
6
+ if (!runtime)
7
+ throw new Error("SolidObjects.configure must be called before Actor.ref");
8
+ return runtime;
9
+ }
10
+ export function clearDefaultRuntime(value) {
11
+ if (value === undefined || runtime === value)
12
+ runtime = undefined;
13
+ }
14
+ //# sourceMappingURL=default-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-runtime.js","sourceRoot":"","sources":["../src/default-runtime.ts"],"names":[],"mappings":"AAEA,IAAI,OAAwC,CAAA;AAE5C,MAAM,UAAU,iBAAiB,CAAC,KAA0B;IAC1D,OAAO,GAAG,KAAK,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IACvF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA2B;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,GAAG,SAAS,CAAA;AACnE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Actor, type ActorClass } from "./actor.js";
2
+ import type { JsonObject } from "./types.js";
3
+ export type PayloadBroadcastHandler = (actor: Actor, authorizationContext: unknown) => unknown | Promise<unknown>;
4
+ export interface StateMigration {
5
+ from: number;
6
+ to: number;
7
+ migrate(state: JsonObject): JsonObject;
8
+ }
9
+ export interface ValidatedActorDefinition<ActorType extends Actor = Actor> {
10
+ actorClass: ActorClass<ActorType>;
11
+ type: string;
12
+ stateKeys: readonly string[];
13
+ operations: readonly string[];
14
+ queries: readonly string[];
15
+ stateVersion: number;
16
+ migrations: readonly StateMigration[];
17
+ payloads: Readonly<Record<string, PayloadBroadcastHandler>>;
18
+ }
19
+ export declare function validateDefinition<ActorType extends Actor>(actorClass: ActorClass<ActorType>): ValidatedActorDefinition<ActorType>;
20
+ export declare function initialStateFor(definition: ValidatedActorDefinition): JsonObject;
21
+ export declare function actorState(actor: Actor, stateKeys?: readonly string[]): JsonObject;
22
+ export declare function hydrateActor<ActorType extends Actor>(options: {
23
+ definition: ValidatedActorDefinition<ActorType>;
24
+ actorId: string;
25
+ state: JsonObject;
26
+ }): ActorType;
27
+ export declare function migrateState(options: {
28
+ definition: ValidatedActorDefinition;
29
+ storedVersion: number;
30
+ storedState: JsonObject;
31
+ }): JsonObject;
32
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,KAAK,EACZ,oBAAoB,EAAE,OAAO,KAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAE/B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAA;CACvC;AAED,MAAM,WAAW,wBAAwB,CAAC,SAAS,SAAS,KAAK,GAAG,KAAK;IACvE,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,SAAS,cAAc,EAAE,CAAA;IACrC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAA;CAC5D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,KAAK,EACxD,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,GAChC,wBAAwB,CAAC,SAAS,CAAC,CAsFrC;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,wBAAwB,GAAG,UAAU,CAEhF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAKlF;AAED,wBAAgB,YAAY,CAAC,SAAS,SAAS,KAAK,EAAE,OAAO,EAAE;IAC7D,UAAU,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAA;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,UAAU,CAAA;CAClB,GAAG,SAAS,CAOZ;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,UAAU,EAAE,wBAAwB,CAAA;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,UAAU,CAAA;CACxB,GAAG,UAAU,CA+Bb"}
@@ -0,0 +1,173 @@
1
+ import { Actor } from "./actor.js";
2
+ import { withApplicationWritesForbidden } from "./context.js";
3
+ import { ApplicationWriteForbidden, InvalidActor, StateMigrationError } from "./errors.js";
4
+ import { deepCopy, jsonObject, normalizeJson } from "./serialization.js";
5
+ export function validateDefinition(actorClass) {
6
+ const type = actorClass.actorType;
7
+ if (!type || !/^[A-Za-z0-9_.:-]+$/.test(type)) {
8
+ throw new InvalidActor("actorType must contain letters, digits, dots, colons, underscores, or hyphens");
9
+ }
10
+ const initialActor = new actorClass("__solid_objects_definition__");
11
+ const state = actorState(initialActor);
12
+ const stateKeys = Object.keys(state);
13
+ const operations = [];
14
+ const queries = [...stateKeys];
15
+ const reservedNames = actorPrototypeNames();
16
+ const referenceNames = new Set([
17
+ "actorClass",
18
+ "actorId",
19
+ "actorType",
20
+ "destroy",
21
+ "operations",
22
+ "queries",
23
+ "runtime",
24
+ "send",
25
+ "snapshot",
26
+ "then",
27
+ "with",
28
+ ]);
29
+ let prototype = actorClass.prototype;
30
+ while (prototype && prototype !== Actor.prototype) {
31
+ for (const name of Object.getOwnPropertyNames(prototype)) {
32
+ if (name === "constructor" || reservedNames.has(name))
33
+ continue;
34
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
35
+ if (!descriptor)
36
+ continue;
37
+ validateOperationName(name);
38
+ validateReferenceName(name, referenceNames);
39
+ if (typeof descriptor.get === "function") {
40
+ if (!queries.includes(name))
41
+ queries.push(name);
42
+ continue;
43
+ }
44
+ if (typeof descriptor.value === "function" && !operations.includes(name)) {
45
+ operations.push(name);
46
+ }
47
+ }
48
+ prototype = Object.getPrototypeOf(prototype);
49
+ }
50
+ for (const stateKey of stateKeys) {
51
+ validateOperationName(stateKey);
52
+ validateReferenceName(stateKey, referenceNames);
53
+ if (reservedNames.has(stateKey) || operations.includes(stateKey)) {
54
+ throw new InvalidActor(`state field ${stateKey} conflicts with an actor operation`);
55
+ }
56
+ }
57
+ const stateVersion = actorClass.stateVersion ?? 1;
58
+ if (!Number.isSafeInteger(stateVersion) || stateVersion < 1) {
59
+ throw new InvalidActor("stateVersion must be a positive safe integer");
60
+ }
61
+ const migrations = actorClass.migrations ?? [];
62
+ const migrationStarts = new Set();
63
+ for (const migration of migrations) {
64
+ if (migration.to !== migration.from + 1) {
65
+ throw new InvalidActor("state migrations must advance exactly one version");
66
+ }
67
+ if (migrationStarts.has(migration.from)) {
68
+ throw new InvalidActor(`state migration from ${migration.from} is defined more than once`);
69
+ }
70
+ migrationStarts.add(migration.from);
71
+ }
72
+ const payloads = validatePayloads(actorClass);
73
+ return Object.freeze({
74
+ actorClass,
75
+ type,
76
+ stateKeys: Object.freeze(stateKeys),
77
+ operations: Object.freeze(operations),
78
+ queries: Object.freeze(queries),
79
+ stateVersion,
80
+ migrations: Object.freeze([...migrations]),
81
+ payloads,
82
+ });
83
+ }
84
+ export function initialStateFor(definition) {
85
+ return actorState(new definition.actorClass("__solid_objects_defaults__"), definition.stateKeys);
86
+ }
87
+ export function actorState(actor, stateKeys) {
88
+ const keys = stateKeys ?? Object.keys(actor);
89
+ const state = {};
90
+ for (const key of keys)
91
+ state[key] = actor[key];
92
+ return jsonObject(state);
93
+ }
94
+ export function hydrateActor(options) {
95
+ const { definition, actorId, state } = options;
96
+ const actor = new definition.actorClass(actorId);
97
+ actor.prepare(new Set(definition.operations));
98
+ const target = actor;
99
+ for (const key of definition.stateKeys)
100
+ target[key] = deepCopy(state[key]);
101
+ return actor;
102
+ }
103
+ export function migrateState(options) {
104
+ const { definition, storedVersion, storedState } = options;
105
+ if (storedVersion > definition.stateVersion) {
106
+ throw new StateMigrationError(`stored state version ${storedVersion} is newer than code version ${definition.stateVersion}`);
107
+ }
108
+ try {
109
+ let state = deepCopy(storedState);
110
+ let version = storedVersion;
111
+ while (version < definition.stateVersion) {
112
+ const migration = definition.migrations.find((candidate) => candidate.from === version);
113
+ if (!migration)
114
+ throw new StateMigrationError(`missing state migration from version ${version}`);
115
+ state = jsonObject(withApplicationWritesForbidden(() => migration.migrate(deepCopy(state))));
116
+ version = migration.to;
117
+ }
118
+ const defaults = initialStateFor(definition);
119
+ for (const [key, value] of Object.entries(defaults)) {
120
+ if (!(key in state))
121
+ state[key] = normalizeJson(value);
122
+ }
123
+ return state;
124
+ }
125
+ catch (error) {
126
+ if (error instanceof StateMigrationError || error instanceof ApplicationWriteForbidden) {
127
+ throw error;
128
+ }
129
+ const message = error instanceof Error ? error.message : String(error);
130
+ throw new StateMigrationError(`state migration failed: ${message}`, { cause: error });
131
+ }
132
+ }
133
+ function actorPrototypeNames() {
134
+ const names = new Set();
135
+ let prototype = Actor.prototype;
136
+ while (prototype && prototype !== Object.prototype) {
137
+ for (const name of Object.getOwnPropertyNames(prototype))
138
+ names.add(name);
139
+ prototype = Object.getPrototypeOf(prototype);
140
+ }
141
+ return names;
142
+ }
143
+ function validateOperationName(name) {
144
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
145
+ throw new InvalidActor(`invalid actor member name ${JSON.stringify(name)}`);
146
+ }
147
+ }
148
+ function validateReferenceName(name, reservedNames) {
149
+ if (reservedNames.has(name)) {
150
+ throw new InvalidActor(`actor member ${JSON.stringify(name)} conflicts with the reference API`);
151
+ }
152
+ }
153
+ function validatePayloads(actorClass) {
154
+ const configured = actorClass.payloads ?? {};
155
+ if (!isRecord(configured))
156
+ throw new InvalidActor("actor payloads must be an object");
157
+ const payloads = {};
158
+ for (const [name, handler] of Object.entries(configured)) {
159
+ validateOperationName(name);
160
+ if (typeof handler !== "function") {
161
+ throw new InvalidActor(`actor payload ${JSON.stringify(name)} must be a function`);
162
+ }
163
+ payloads[name] = handler;
164
+ }
165
+ return Object.freeze(payloads);
166
+ }
167
+ function isRecord(value) {
168
+ if (typeof value !== "object" || value === null || Array.isArray(value))
169
+ return false;
170
+ const prototype = Object.getPrototypeOf(value);
171
+ return prototype === Object.prototype || prototype === null;
172
+ }
173
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { SolidObjectsRuntime } from "./runtime.js";
2
+ import type { DeepReadonly, JsonObject } from "./types.js";
3
+ export type DoctorStatus = "pass" | "warn" | "fail" | "info" | "skip";
4
+ export interface DoctorCheck {
5
+ readonly name: string;
6
+ readonly status: DoctorStatus;
7
+ readonly message: string;
8
+ readonly details?: DeepReadonly<JsonObject>;
9
+ }
10
+ export interface DoctorReport {
11
+ readonly healthy: boolean;
12
+ readonly checks: readonly DoctorCheck[];
13
+ }
14
+ export interface DoctorOptions {
15
+ roundTrip?: "run" | "skip";
16
+ }
17
+ export declare class Doctor {
18
+ private readonly runtime;
19
+ constructor(runtime: SolidObjectsRuntime);
20
+ run(options?: DoctorOptions): Promise<DoctorReport>;
21
+ private checkConfiguration;
22
+ private checkSchema;
23
+ private checkAuthorization;
24
+ private authorizationProbes;
25
+ private checkDatabase;
26
+ private checkPostgreSQL;
27
+ private checkMySQL;
28
+ private checkRuntime;
29
+ private checkRoundTrip;
30
+ private removeProbe;
31
+ }
32
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CAC3B;AAmED,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,mBAAmB;IAEnD,GAAG,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAoC7D,OAAO,CAAC,kBAAkB;YAYZ,WAAW;YAuEX,kBAAkB;IA+DhC,OAAO,CAAC,mBAAmB;YA8Bb,aAAa;YA6Bb,eAAe;YAqBf,UAAU;YAkCV,YAAY;YA+BZ,cAAc;YAiDd,WAAW;CAsB1B"}