durable-actors 0.7.16 → 0.8.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.
Files changed (175) hide show
  1. package/README.md +6 -6
  2. package/bin/durable-actors.js +2 -0
  3. package/dist/actor/actor.d.ts +20 -12
  4. package/dist/actor/actor.d.ts.map +1 -1
  5. package/dist/actor/actor.js +42 -35
  6. package/dist/actor/actor.js.map +1 -1
  7. package/dist/actor/alarm.d.ts +19 -0
  8. package/dist/actor/alarm.d.ts.map +1 -0
  9. package/dist/actor/alarm.js +2 -0
  10. package/dist/actor/alarm.js.map +1 -0
  11. package/dist/actor/context.d.ts +25 -0
  12. package/dist/actor/context.d.ts.map +1 -0
  13. package/dist/actor/context.js +83 -0
  14. package/dist/actor/context.js.map +1 -0
  15. package/dist/actor/database.d.ts +5 -4
  16. package/dist/actor/database.d.ts.map +1 -1
  17. package/dist/actor/database.js +9 -19
  18. package/dist/actor/database.js.map +1 -1
  19. package/dist/actor/decorators.d.ts +7 -2
  20. package/dist/actor/decorators.d.ts.map +1 -1
  21. package/dist/actor/decorators.js +11 -2
  22. package/dist/actor/decorators.js.map +1 -1
  23. package/dist/actor/resource.d.ts +9 -0
  24. package/dist/actor/resource.d.ts.map +1 -0
  25. package/dist/actor/resource.js +2 -0
  26. package/dist/actor/resource.js.map +1 -0
  27. package/dist/actor/schema.d.ts +3 -1
  28. package/dist/actor/schema.d.ts.map +1 -1
  29. package/dist/actor/schema.js.map +1 -1
  30. package/dist/actor/unchecked.d.ts +12 -0
  31. package/dist/actor/unchecked.d.ts.map +1 -0
  32. package/dist/actor/unchecked.js +8 -0
  33. package/dist/actor/unchecked.js.map +1 -0
  34. package/dist/cli/dev.d.ts.map +1 -1
  35. package/dist/cli/dev.js +13 -42
  36. package/dist/cli/dev.js.map +1 -1
  37. package/dist/cli/inspect.d.ts +73 -0
  38. package/dist/cli/inspect.d.ts.map +1 -0
  39. package/dist/cli/inspect.js +132 -0
  40. package/dist/cli/inspect.js.map +1 -0
  41. package/dist/cli/python.d.ts.map +1 -1
  42. package/dist/cli/python.js +0 -1
  43. package/dist/cli/python.js.map +1 -1
  44. package/dist/cli.d.ts +1 -1
  45. package/dist/cli.js +11 -18
  46. package/dist/cli.js.map +1 -1
  47. package/dist/client-runtime/http.d.ts +1 -1
  48. package/dist/client-runtime/http.d.ts.map +1 -1
  49. package/dist/client-runtime/http.js +1 -1
  50. package/dist/client-runtime/http.js.map +1 -1
  51. package/dist/client-runtime/stub.d.ts.map +1 -1
  52. package/dist/client-runtime/stub.js +11 -1
  53. package/dist/client-runtime/stub.js.map +1 -1
  54. package/dist/compiler/actor-compiler.d.ts +4 -2
  55. package/dist/compiler/actor-compiler.d.ts.map +1 -1
  56. package/dist/compiler/actor-compiler.js +48 -13
  57. package/dist/compiler/actor-compiler.js.map +1 -1
  58. package/dist/compiler/declarations.d.ts.map +1 -1
  59. package/dist/compiler/declarations.js +2678 -183
  60. package/dist/compiler/declarations.js.map +7 -1
  61. package/dist/compiler/features/atomicity.d.ts +9 -0
  62. package/dist/compiler/features/atomicity.d.ts.map +1 -0
  63. package/dist/compiler/features/atomicity.js +44 -0
  64. package/dist/compiler/features/atomicity.js.map +1 -0
  65. package/dist/compiler/features/interleave.d.ts +9 -0
  66. package/dist/compiler/features/{reentrancy.d.ts.map → interleave.d.ts.map} +1 -1
  67. package/dist/compiler/features/{reentrancy.js → interleave.js} +13 -13
  68. package/dist/compiler/features/{reentrancy.js.map → interleave.js.map} +1 -1
  69. package/dist/compiler/features/persistence.d.ts +2 -5
  70. package/dist/compiler/features/persistence.d.ts.map +1 -1
  71. package/dist/compiler/features/persistence.js +5 -83
  72. package/dist/compiler/features/persistence.js.map +1 -1
  73. package/dist/compiler/features/resource.d.ts +5 -0
  74. package/dist/compiler/features/resource.d.ts.map +1 -0
  75. package/dist/compiler/features/resource.js +18 -0
  76. package/dist/compiler/features/resource.js.map +1 -0
  77. package/dist/compiler/fieldParsing.d.ts +12 -0
  78. package/dist/compiler/fieldParsing.d.ts.map +1 -0
  79. package/dist/compiler/fieldParsing.js +106 -0
  80. package/dist/compiler/fieldParsing.js.map +1 -0
  81. package/dist/compiler/json-schema.d.ts +2 -2
  82. package/dist/compiler/json-schema.d.ts.map +1 -1
  83. package/dist/compiler/json-schema.js +22 -14
  84. package/dist/compiler/json-schema.js.map +1 -1
  85. package/dist/compiler/rpc-contract.d.ts +1 -1
  86. package/dist/compiler/rpc-contract.d.ts.map +1 -1
  87. package/dist/compiler/rpc-contract.js +21 -11
  88. package/dist/compiler/rpc-contract.js.map +1 -1
  89. package/dist/compiler/socket-contract.d.ts +1 -1
  90. package/dist/compiler/socket-contract.d.ts.map +1 -1
  91. package/dist/compiler/socket-contract.js +3 -3
  92. package/dist/compiler/socket-contract.js.map +1 -1
  93. package/dist/compiler/types.d.ts +13 -3
  94. package/dist/compiler/types.d.ts.map +1 -1
  95. package/dist/compiler/types.js +3 -1
  96. package/dist/compiler/types.js.map +1 -1
  97. package/dist/compiler/validate-public-contract.d.ts.map +1 -1
  98. package/dist/compiler/validate-public-contract.js +12 -1
  99. package/dist/compiler/validate-public-contract.js.map +1 -1
  100. package/dist/generated/client-runtime.d.ts.map +1 -1
  101. package/dist/generated/client-runtime.js +1 -1
  102. package/dist/generated/client-runtime.js.map +1 -1
  103. package/dist/host/actor-host.d.ts.map +1 -1
  104. package/dist/host/actor-host.js +44 -50
  105. package/dist/host/actor-host.js.map +1 -1
  106. package/dist/host/actor-runtime.d.ts +7 -8
  107. package/dist/host/actor-runtime.d.ts.map +1 -1
  108. package/dist/host/actor-runtime.js +80 -79
  109. package/dist/host/actor-runtime.js.map +1 -1
  110. package/dist/host/actor-worker.js +10 -27
  111. package/dist/host/actor-worker.js.map +1 -1
  112. package/dist/host/database-bridge.d.ts +16 -0
  113. package/dist/host/database-bridge.d.ts.map +1 -0
  114. package/dist/host/database-bridge.js +29 -0
  115. package/dist/host/database-bridge.js.map +1 -0
  116. package/dist/host/database.d.ts +86 -0
  117. package/dist/host/database.d.ts.map +1 -0
  118. package/dist/host/database.js +87 -0
  119. package/dist/host/database.js.map +1 -0
  120. package/dist/host/generic-host.js +1 -1
  121. package/dist/host/persisted-fields.d.ts +7 -0
  122. package/dist/host/persisted-fields.d.ts.map +1 -0
  123. package/dist/host/persisted-fields.js +29 -0
  124. package/dist/host/persisted-fields.js.map +1 -0
  125. package/dist/host/protocol.d.ts +55 -131
  126. package/dist/host/protocol.d.ts.map +1 -1
  127. package/dist/host/protocol.js +28 -28
  128. package/dist/host/protocol.js.map +1 -1
  129. package/dist/host/types.d.ts +8 -9
  130. package/dist/host/types.d.ts.map +1 -1
  131. package/dist/host/worker-supervisor.d.ts +32 -30
  132. package/dist/host/worker-supervisor.d.ts.map +1 -1
  133. package/dist/host/worker-supervisor.js +246 -230
  134. package/dist/host/worker-supervisor.js.map +1 -1
  135. package/dist/index.d.ts +5 -2
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +2 -1
  138. package/dist/index.js.map +1 -1
  139. package/dist/projectSdk.js +1 -1
  140. package/dist/projectSdk.js.map +1 -1
  141. package/dist/templates/actor/README.md +7 -9
  142. package/dist/templates/actor/bunfig +2 -0
  143. package/dist/templates/actor/package.json +6 -3
  144. package/dist/templates/ai-chat/README.md +8 -8
  145. package/dist/templates/ai-chat/bunfig +2 -0
  146. package/dist/templates/ai-chat/package.json +7 -5
  147. package/dist/templates/ai-chat/src/actors.ts +1 -1
  148. package/dist/templates/chat/README.md +8 -8
  149. package/dist/templates/chat/bunfig +2 -0
  150. package/dist/templates/chat/package.json +7 -5
  151. package/dist/templates/chat/src/actors.ts +1 -1
  152. package/dist/templates/documents/README.md +8 -8
  153. package/dist/templates/documents/bunfig +2 -0
  154. package/dist/templates/documents/package.json +7 -5
  155. package/dist/templates/documents/src/actors.ts +1 -1
  156. package/package.json +110 -108
  157. package/dist/cli/actor-source-watcher.d.ts +0 -25
  158. package/dist/cli/actor-source-watcher.d.ts.map +0 -1
  159. package/dist/cli/actor-source-watcher.js +0 -129
  160. package/dist/cli/actor-source-watcher.js.map +0 -1
  161. package/dist/compiler/features/reentrancy.d.ts +0 -9
  162. package/dist/host/sqlite.d.ts +0 -49
  163. package/dist/host/sqlite.d.ts.map +0 -1
  164. package/dist/host/sqlite.js +0 -159
  165. package/dist/host/sqlite.js.map +0 -1
  166. package/dist/templates/actor/pnpm-workspace.yaml +0 -2
  167. package/dist/templates/ai-chat/pnpm-workspace.yaml +0 -2
  168. package/dist/templates/chat/pnpm-workspace.yaml +0 -2
  169. package/dist/templates/documents/pnpm-workspace.yaml +0 -2
  170. package/dist/templates/python/README.md +0 -7
  171. package/dist/templates/python/gitignore +0 -6
  172. package/dist/templates/python/package.json +0 -11
  173. package/dist/templates/python/pnpm-workspace.yaml +0 -2
  174. package/dist/templates/python/pyproject.toml +0 -8
  175. package/dist/templates/python/src/actors.py +0 -9
@@ -1,129 +0,0 @@
1
- import { watch } from "chokidar";
2
- import { existsSync } from "node:fs";
3
- import path from "node:path";
4
- async function watchActorSources(options, refresh) {
5
- const watcher = new ActorSourceWatcher(options, refresh, watch, message => console.warn(message));
6
- await watcher.start();
7
- return watcher;
8
- }
9
- class ActorSourceWatcher {
10
- options;
11
- refresh;
12
- createWatcher;
13
- warn;
14
- watcher;
15
- timer;
16
- updates = Promise.resolve();
17
- closing;
18
- disabled = false;
19
- constructor(options, refresh, createWatcher, warn) {
20
- this.options = options;
21
- this.refresh = refresh;
22
- this.createWatcher = createWatcher;
23
- this.warn = warn;
24
- }
25
- async start() {
26
- try {
27
- this.watcher = this.createWatcher(this.options.projectDirectory, {
28
- ignored: (watchedPath, stats) => ignoredActorPath(watchedPath, this.options) ||
29
- (stats?.isDirectory() === true && existsSync(path.join(watchedPath, "pyvenv.cfg"))) ||
30
- (stats !== undefined && !stats.isDirectory() && (!stats.isFile() || !isActorSource(watchedPath))),
31
- ignoreInitial: true,
32
- followSymlinks: false,
33
- atomic: true,
34
- awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 20 }
35
- });
36
- this.watcher.on("all", (_event, changedPath) => this.scheduleRefresh(changedPath));
37
- await this.waitUntilReady(this.watcher);
38
- }
39
- catch (error) {
40
- if (isWatchLimit(error))
41
- await this.disable(error);
42
- else {
43
- await this.close();
44
- throw error;
45
- }
46
- }
47
- }
48
- async close() {
49
- this.disabled = true;
50
- clearTimeout(this.timer);
51
- if (!this.closing) {
52
- this.closing = this.watcher?.close() ?? Promise.resolve();
53
- // Chokidar removes listeners on close, but pending filesystem operations can still emit errors.
54
- this.watcher?.on("error", () => { });
55
- }
56
- await this.closing;
57
- await this.updates;
58
- }
59
- scheduleRefresh(changedPath) {
60
- if (this.disabled || !isActorSource(changedPath))
61
- return;
62
- clearTimeout(this.timer);
63
- this.timer = setTimeout(() => {
64
- this.updates = this.updates.then(this.refresh).catch(reportWatchError);
65
- }, 75);
66
- }
67
- waitUntilReady(watcher) {
68
- return new Promise((resolve, reject) => {
69
- let ready = false;
70
- watcher.once("ready", () => {
71
- ready = true;
72
- resolve();
73
- });
74
- watcher.on("error", error => {
75
- if (this.disabled)
76
- return;
77
- if (isWatchLimit(error))
78
- void this.disable(error).then(resolve, reject);
79
- else if (!ready)
80
- reject(error);
81
- else
82
- reportWatchError(error);
83
- });
84
- });
85
- }
86
- async disable(error) {
87
- if (!this.disabled)
88
- this.warn(`Actor source watcher reached the OS file/watch limit (${error.code}). Automatic reload is disabled; ` +
89
- "the development server will continue running. Restart it to apply source changes. " +
90
- "Close other watchers or raise your OS file/watch limit, then restart to restore automatic reload. " +
91
- "Use --no-watch to disable watching explicitly.");
92
- await this.close();
93
- }
94
- }
95
- function isWatchLimit(error) {
96
- return error instanceof Error && "code" in error && ["EMFILE", "ENFILE", "ENOSPC"].includes(String(error.code));
97
- }
98
- function ignoredActorPath(candidate, options) {
99
- const relative = path.relative(options.projectDirectory, candidate);
100
- if (!relative || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
101
- return false;
102
- const components = relative.split(path.sep);
103
- if (components.some(component => [
104
- ".git",
105
- "node_modules",
106
- ".venv",
107
- "venv",
108
- "__pycache__",
109
- ".mypy_cache",
110
- ".pytest_cache",
111
- ".ruff_cache"
112
- ].includes(component)))
113
- return true;
114
- if ([".durable-actors", "generated"].includes(components[0]))
115
- return true;
116
- if (!options.dataDirectory)
117
- return false;
118
- const state = path.resolve(options.dataDirectory);
119
- return candidate === state || candidate.startsWith(`${state}${path.sep}`);
120
- }
121
- function isActorSource(candidate) {
122
- return (/\.(?:[cm]?[jt]sx?|json|ya?ml|py|toml)$/u.test(candidate) ||
123
- ["bun.lock", "uv.lock", "requirements.txt"].includes(path.basename(candidate)));
124
- }
125
- function reportWatchError(error) {
126
- console.error(`Actor source update failed: ${error instanceof Error ? error.message : String(error)}`);
127
- }
128
- export { ActorSourceWatcher, watchActorSources };
129
- //# sourceMappingURL=actor-source-watcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actor-source-watcher.js","sourceRoot":"","sources":["../../src/cli/actor-source-watcher.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import ts from "typescript";
2
- import type { DecoratorResult, DecoratorUse, ParsedActor } from "../types.js";
3
- declare function readReentrancy(use: DecoratorUse): DecoratorResult;
4
- declare function validateReentrancy(actor: ParsedActor): {
5
- methods: string[];
6
- diagnostics: ts.Diagnostic[];
7
- };
8
- export { readReentrancy, validateReentrancy };
9
- //# sourceMappingURL=reentrancy.d.ts.map
@@ -1,49 +0,0 @@
1
- import type { ActorDatabase, SqliteValue } from "../actor/database.js";
2
- import type { JsonObject } from "../json.js";
3
- interface SqliteState {
4
- readonly txid: number;
5
- readonly path?: string;
6
- }
7
- type SqliteCommitter = () => Promise<number>;
8
- declare class SqliteCaptureError extends Error {
9
- }
10
- interface ActorDatabaseStorage extends ActorDatabase {
11
- fields(): JsonObject;
12
- persistFields(fields: JsonObject): void;
13
- restore(state: SqliteState | undefined): void;
14
- snapshot(): Promise<SqliteState>;
15
- rollback(): void;
16
- close(): void;
17
- }
18
- declare class SqliteActorDatabase implements ActorDatabaseStorage {
19
- private readonly commit;
20
- private readonly connect;
21
- private connection;
22
- private seed;
23
- private txid;
24
- private version;
25
- private failure;
26
- constructor(commit: SqliteCommitter, connect?: (path: string) => SqliteConnection);
27
- exec<Row extends object>(sql: string, ...bindings: SqliteValue[]): Row[];
28
- fields(): JsonObject;
29
- persistFields(fields: JsonObject): void;
30
- restore(state: SqliteState | undefined): void;
31
- snapshot(): Promise<SqliteState>;
32
- rollback(): void;
33
- close(): void;
34
- private changeToken;
35
- private fieldDatabase;
36
- private open;
37
- }
38
- interface SqliteConnection {
39
- readonly isTransaction: boolean;
40
- exec(sql: string): void;
41
- prepare(sql: string): {
42
- all(...bindings: SqliteValue[]): object[];
43
- get(): Record<string, SqliteValue> | undefined;
44
- };
45
- close(): void;
46
- }
47
- export { SqliteActorDatabase, SqliteCaptureError };
48
- export type { ActorDatabaseStorage, SqliteState, SqliteCommitter };
49
- //# sourceMappingURL=sqlite.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/host/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAA;AAEvD,UAAU,WAAW;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5C,cAAM,kBAAmB,SAAQ,KAAK;CAAG;AAEzC,UAAU,oBAAqB,SAAQ,aAAa;IAChD,MAAM,IAAI,UAAU,CAAA;IACpB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAA;IAC7C,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IAChC,QAAQ,IAAI,IAAI,CAAA;IAChB,KAAK,IAAI,IAAI,CAAA;CAChB;AAED,cAAM,mBAAoB,YAAW,oBAAoB;IAQjD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR5B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,IAAI,CAAuC;IACnD,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAgC;gBAG1B,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAA6B;IAG7E,IAAI,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE;IASxE,MAAM,IAAI,UAAU;IAQpB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAWvC,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IASvC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAkBtC,QAAQ,IAAI,IAAI;IAKhB,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,IAAI;CAYf;AAED,UAAU,gBAAgB;IACtB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAClB,GAAG,CAAC,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAA;QACzC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,CAAA;KACjD,CAAA;IACD,KAAK,IAAI,IAAI,CAAA;CAChB;AA8DD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;AAClD,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAAE,CAAA"}
@@ -1,159 +0,0 @@
1
- import { createRequire } from "node:module";
2
- class SqliteCaptureError extends Error {
3
- }
4
- class SqliteActorDatabase {
5
- commit;
6
- connect;
7
- connection;
8
- seed;
9
- txid = 0;
10
- version = "";
11
- failure;
12
- constructor(commit, connect = openSqlite) {
13
- this.commit = commit;
14
- this.connect = connect;
15
- }
16
- exec(sql, ...bindings) {
17
- validateStatement(sql);
18
- const database = this.open();
19
- validateSingleStatement(database, sql);
20
- const statement = database.prepare(sql);
21
- if (!database.isTransaction)
22
- database.exec("BEGIN IMMEDIATE");
23
- return statement.all(...bindings);
24
- }
25
- fields() {
26
- const rows = this.fieldDatabase().prepare("SELECT name, value FROM __terse_fields").all();
27
- return Object.fromEntries(rows.map(row => [row.name, JSON.parse(row.value)]));
28
- }
29
- persistFields(fields) {
30
- const database = this.fieldDatabase();
31
- const put = database.prepare("INSERT INTO __terse_fields (name, value) VALUES (?, ?) ON CONFLICT(name) DO UPDATE SET value = excluded.value WHERE value <> excluded.value");
32
- for (const [name, value] of Object.entries(fields))
33
- put.all(name, JSON.stringify(value));
34
- database
35
- .prepare("DELETE FROM __terse_fields WHERE name NOT IN (SELECT value FROM json_each(?))")
36
- .all(JSON.stringify(Object.keys(fields)));
37
- }
38
- restore(state) {
39
- this.close();
40
- if (state === undefined || !Number.isSafeInteger(state.txid) || state.txid < 1 || !state.path)
41
- throw new Error("invalid actor SQLite recovery state");
42
- this.seed = { path: state.path };
43
- this.txid = state.txid;
44
- this.version = this.changeToken();
45
- }
46
- async snapshot() {
47
- try {
48
- const database = this.open();
49
- const version = this.changeToken();
50
- if (database.isTransaction)
51
- database.exec("COMMIT");
52
- if (version !== this.version) {
53
- const txid = await this.commit();
54
- if (!Number.isSafeInteger(txid) || txid < this.txid)
55
- throw new Error("invalid host commit position");
56
- this.txid = txid;
57
- this.version = version;
58
- }
59
- return { txid: this.txid };
60
- }
61
- catch (cause) {
62
- this.failure = new SqliteCaptureError("failed to replicate actor SQLite commit", { cause });
63
- throw this.failure;
64
- }
65
- }
66
- rollback() {
67
- if (this.connection?.isTransaction)
68
- this.connection.exec("ROLLBACK");
69
- if (this.connection !== undefined)
70
- this.version = this.changeToken();
71
- }
72
- close() {
73
- try {
74
- this.connection?.close();
75
- }
76
- finally {
77
- this.connection = undefined;
78
- this.seed = undefined;
79
- this.failure = undefined;
80
- }
81
- }
82
- changeToken() {
83
- const database = this.open();
84
- return JSON.stringify([
85
- database.prepare("SELECT total_changes() AS changes").get(),
86
- database.prepare("PRAGMA schema_version").get(),
87
- database.prepare("PRAGMA user_version").get()
88
- ]);
89
- }
90
- fieldDatabase() {
91
- const database = this.open();
92
- if (!database.isTransaction)
93
- database.exec("BEGIN IMMEDIATE");
94
- database.exec("CREATE TABLE IF NOT EXISTS __terse_fields (name TEXT PRIMARY KEY, value TEXT NOT NULL CHECK(json_valid(value)))");
95
- return database;
96
- }
97
- open() {
98
- if (this.failure !== undefined)
99
- throw this.failure;
100
- if (this.connection !== undefined)
101
- return this.connection;
102
- if (this.seed === undefined)
103
- throw new Error("actor SQLite database has not been restored");
104
- const database = (this.connection = this.connect(this.seed.path));
105
- database.exec("PRAGMA busy_timeout = 5000; PRAGMA foreign_keys = ON; PRAGMA journal_mode = WAL; PRAGMA wal_autocheckpoint = 0; PRAGMA synchronous = FULL");
106
- if (database.prepare("PRAGMA quick_check").get().quick_check !== "ok")
107
- throw new Error("invalid actor SQLite database");
108
- return database;
109
- }
110
- }
111
- function openSqlite(path) {
112
- const require = createRequire(import.meta.url);
113
- if (!process.versions.bun) {
114
- const { DatabaseSync } = require("node:sqlite");
115
- return new DatabaseSync(path);
116
- }
117
- const { Database } = require("bun:sqlite");
118
- const database = new Database(path, { strict: true });
119
- return {
120
- get isTransaction() {
121
- return database.inTransaction;
122
- },
123
- exec: sql => database.exec(sql),
124
- prepare: sql => database.prepare(sql),
125
- close: () => database.close()
126
- };
127
- }
128
- function validateStatement(sql) {
129
- const statement = withoutComments(sql);
130
- if (/(?:__terse_|_litestream_)/i.test(statement))
131
- throw new Error("SQLite runtime table names are reserved");
132
- if (/^(?:BEGIN|COMMIT|END|ROLLBACK|SAVEPOINT|RELEASE|ATTACH|DETACH|VACUUM)\b/i.test(statement))
133
- throw new Error("actor invocations own SQLite transactions and database files");
134
- if (/^PRAGMA\b/i.test(statement) &&
135
- !/^PRAGMA\s+(?:main\.)?(?:table_info|table_xinfo|index_info|index_xinfo|index_list|foreign_key_list|foreign_key_check|integrity_check|quick_check|user_version)\b/i.test(statement))
136
- throw new Error("this SQLite pragma is managed by the actor runtime");
137
- }
138
- function validateSingleStatement(database, sql) {
139
- const tokens = sql.matchAll(/--[^\n]*(?:\n|$)|\/\*[\s\S]*?\*\/|'(?:''|[^'])*'|"(?:""|[^"])*"|`(?:``|[^`])*`|\[[^\]]*\]|;/g);
140
- for (const token of tokens) {
141
- if (token[0] !== ";" || !withoutComments(sql.slice(token.index + 1)))
142
- continue;
143
- try {
144
- // SQLite distinguishes a statement boundary from a semicolon inside a trigger body.
145
- database.prepare(sql.slice(0, token.index + 1));
146
- }
147
- catch (error) {
148
- if (!(error instanceof Error) || !error.message.includes("incomplete input"))
149
- throw error;
150
- continue;
151
- }
152
- throw new Error("actor database exec accepts one SQL statement");
153
- }
154
- }
155
- function withoutComments(sql) {
156
- return sql.replace(/^(?:\s|;|--[^\n]*(?:\n|$)|\/\*[\s\S]*?\*\/)*/, "").trim();
157
- }
158
- export { SqliteActorDatabase, SqliteCaptureError };
159
- //# sourceMappingURL=sqlite.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/host/sqlite.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- allowBuilds:
2
- esbuild: true
@@ -1,2 +0,0 @@
1
- allowBuilds:
2
- esbuild: true
@@ -1,2 +0,0 @@
1
- allowBuilds:
2
- esbuild: true
@@ -1,2 +0,0 @@
1
- allowBuilds:
2
- esbuild: true
@@ -1,7 +0,0 @@
1
- # Python actors
2
-
3
- Install Node.js 22+, Python 3.11+, and uv. Run `pnpm install`, `uv sync`, then `pnpm exec durable-actors dev`. The shared TypeScript CLI selects `.venv` and checks actor types before starting and reloading.
4
-
5
- Edit `src/actors.py`. Write synchronous actor methods with ordinary `def`. Every instance field must use `persisted()` or `ephemeral()`. Use `emitted(persisted(...))` for state broadcasts and `ephemeral()` for temporary values such as caches and service clients. From your client application, install `durable-actors[codegen]` and run `pnpm exec durable-actors generate` against the running server. Generated Python clients include synchronous typed methods and models. Import `actors` from the generated package and use `actors.Counter.get("one")`; the SDK manages the HTTP connection pool. Actors with emitted fields also expose `actor.subscribe(callback)` for typed live state; close the returned subscription when finished. The CLI runs strict mypy after generation.
6
-
7
- Set `DURABLE_ACTORS_PYTHON` to select another interpreter. `DURABLE_ACTORS_BINARY` selects a locally built runtime.
@@ -1,6 +0,0 @@
1
- node_modules/
2
- .venv/
3
- .durable-actors/
4
- .mypy_cache/
5
- __pycache__/
6
- generated/
@@ -1,11 +0,0 @@
1
- {
2
- "name": "durable-actors-example-python",
3
- "private": true,
4
- "dependencies": {
5
- "durable-actors": "0.7.16"
6
- },
7
- "scripts": {
8
- "dev": "durable-actors dev",
9
- "generate": "durable-actors generate"
10
- }
11
- }
@@ -1,2 +0,0 @@
1
- allowBuilds:
2
- esbuild: true
@@ -1,8 +0,0 @@
1
- [project]
2
- name = "durable-actors-example"
3
- version = "0.1.0"
4
- requires-python = ">=3.11"
5
- dependencies = ["durable-actors[codegen]==0.7.16"]
6
-
7
- [tool.mypy]
8
- strict = true
@@ -1,9 +0,0 @@
1
- from durable_actors import Actor, persisted
2
-
3
-
4
- class Counter(Actor):
5
- count: int = persisted(0)
6
-
7
- def increment(self, amount: int = 1) -> int:
8
- self.count += amount
9
- return self.count