@sanoma-ai/workflows 0.7.0 → 0.8.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 (168) hide show
  1. package/README.md +43 -12
  2. package/dist/apps-list.d.ts +90 -0
  3. package/dist/apps-list.js +109 -0
  4. package/dist/apps-list.js.map +1 -0
  5. package/dist/apps.d.ts +42 -0
  6. package/dist/apps.js +137 -0
  7. package/dist/apps.js.map +1 -0
  8. package/dist/call-workflow.js +5 -6
  9. package/dist/call-workflow.js.map +1 -1
  10. package/dist/call.js +6 -3
  11. package/dist/call.js.map +1 -1
  12. package/dist/cedar.d.ts +1 -1
  13. package/dist/cedar.js +6 -4
  14. package/dist/cedar.js.map +1 -1
  15. package/dist/change-steps.d.ts +10 -0
  16. package/dist/change-steps.js +204 -0
  17. package/dist/change-steps.js.map +1 -0
  18. package/dist/change-workflow.d.ts +54 -0
  19. package/dist/change-workflow.js +161 -0
  20. package/dist/change-workflow.js.map +1 -0
  21. package/dist/change.d.ts +121 -24
  22. package/dist/change.js +196 -17
  23. package/dist/change.js.map +1 -1
  24. package/dist/claims.d.ts +58 -0
  25. package/dist/claims.js +27 -0
  26. package/dist/claims.js.map +1 -0
  27. package/dist/client.d.ts +92 -0
  28. package/dist/client.js +268 -6
  29. package/dist/client.js.map +1 -1
  30. package/dist/collection.d.ts +6 -1
  31. package/dist/collection.js +11 -3
  32. package/dist/collection.js.map +1 -1
  33. package/dist/config.d.ts +56 -8
  34. package/dist/config.js +71 -29
  35. package/dist/config.js.map +1 -1
  36. package/dist/constructors.d.ts +37 -1
  37. package/dist/constructors.js +6 -2
  38. package/dist/constructors.js.map +1 -1
  39. package/dist/db.d.ts +21 -21
  40. package/dist/db.js +31 -54
  41. package/dist/db.js.map +1 -1
  42. package/dist/deadlines.d.ts +18 -12
  43. package/dist/deadlines.js +18 -24
  44. package/dist/deadlines.js.map +1 -1
  45. package/dist/define.d.ts +30 -14
  46. package/dist/define.js +9 -1
  47. package/dist/define.js.map +1 -1
  48. package/dist/demo.d.ts +15 -4
  49. package/dist/demo.js +27 -12
  50. package/dist/demo.js.map +1 -1
  51. package/dist/describe.d.ts +16 -2
  52. package/dist/describe.js +39 -4
  53. package/dist/describe.js.map +1 -1
  54. package/dist/direct.d.ts +4 -3
  55. package/dist/direct.js +7 -4
  56. package/dist/direct.js.map +1 -1
  57. package/dist/errors.d.ts +2 -0
  58. package/dist/errors.js +2 -0
  59. package/dist/errors.js.map +1 -1
  60. package/dist/fake.d.ts +26 -0
  61. package/dist/fake.js +123 -0
  62. package/dist/fake.js.map +1 -1
  63. package/dist/host.d.ts +2 -3
  64. package/dist/host.js +1 -1
  65. package/dist/host.js.map +1 -1
  66. package/dist/index.d.ts +8 -7
  67. package/dist/index.js +7 -6
  68. package/dist/index.js.map +1 -1
  69. package/dist/lint.js +20 -6
  70. package/dist/lint.js.map +1 -1
  71. package/dist/op.d.ts +8 -1
  72. package/dist/op.js.map +1 -1
  73. package/dist/outline.js +13 -6
  74. package/dist/outline.js.map +1 -1
  75. package/dist/paths.d.ts +16 -0
  76. package/dist/paths.js +54 -2
  77. package/dist/paths.js.map +1 -1
  78. package/dist/person.d.ts +5 -0
  79. package/dist/person.js +3 -1
  80. package/dist/person.js.map +1 -1
  81. package/dist/resources.d.ts +7 -2
  82. package/dist/resources.js +27 -10
  83. package/dist/resources.js.map +1 -1
  84. package/dist/run.d.ts +7 -0
  85. package/dist/run.js.map +1 -1
  86. package/dist/scenario.d.ts +2 -2
  87. package/dist/scenario.js +10 -4
  88. package/dist/scenario.js.map +1 -1
  89. package/dist/scenarios.d.ts +1 -1
  90. package/dist/scenarios.js.map +1 -1
  91. package/dist/sdk.d.ts +1 -1
  92. package/dist/sdk.js +19 -5
  93. package/dist/sdk.js.map +1 -1
  94. package/dist/shared.d.ts +43 -2
  95. package/dist/shared.js +46 -4
  96. package/dist/shared.js.map +1 -1
  97. package/dist/sites.d.ts +26 -5
  98. package/dist/sites.js +56 -20
  99. package/dist/sites.js.map +1 -1
  100. package/dist/source.d.ts +179 -5
  101. package/dist/source.js +13 -0
  102. package/dist/source.js.map +1 -1
  103. package/dist/supervisor.d.ts +5 -4
  104. package/dist/supervisor.js +2 -11
  105. package/dist/supervisor.js.map +1 -1
  106. package/dist/version.d.ts +8 -0
  107. package/dist/version.js +21 -13
  108. package/dist/version.js.map +1 -1
  109. package/dist/wakeup-driver.d.ts +128 -0
  110. package/dist/wakeup-driver.js +216 -0
  111. package/dist/wakeup-driver.js.map +1 -0
  112. package/dist/wakeup-service.d.ts +4 -4
  113. package/dist/wakeup-service.js +19 -25
  114. package/dist/wakeup-service.js.map +1 -1
  115. package/dist/wakeup-type.d.ts +43 -0
  116. package/dist/wakeup-type.js +80 -0
  117. package/dist/wakeup-type.js.map +1 -0
  118. package/dist/wakeup.d.ts +1 -8
  119. package/dist/wakeup.js +2 -11
  120. package/dist/wakeup.js.map +1 -1
  121. package/dist/worker.d.ts +2 -2
  122. package/dist/worker.js +50 -7
  123. package/dist/worker.js.map +1 -1
  124. package/oxlint.json +3 -2
  125. package/package.json +3 -1
  126. package/src/apps-list.ts +119 -0
  127. package/src/apps.ts +162 -0
  128. package/src/call-workflow.ts +10 -2
  129. package/src/call.ts +6 -3
  130. package/src/cedar.ts +9 -7
  131. package/src/change-steps.ts +274 -0
  132. package/src/change-workflow.ts +198 -0
  133. package/src/change.ts +257 -27
  134. package/src/claims.ts +79 -0
  135. package/src/client.ts +320 -4
  136. package/src/collection.ts +22 -3
  137. package/src/config.ts +104 -35
  138. package/src/constructors.ts +8 -2
  139. package/src/db.ts +39 -66
  140. package/src/deadlines.ts +27 -30
  141. package/src/define.ts +31 -12
  142. package/src/demo.ts +55 -24
  143. package/src/describe.ts +67 -4
  144. package/src/direct.ts +9 -5
  145. package/src/errors.ts +3 -0
  146. package/src/fake.ts +137 -0
  147. package/src/host.ts +3 -4
  148. package/src/index.ts +22 -3
  149. package/src/lint.ts +21 -6
  150. package/src/op.ts +8 -1
  151. package/src/outline.ts +15 -6
  152. package/src/paths.ts +57 -2
  153. package/src/person.ts +4 -1
  154. package/src/resources.ts +31 -11
  155. package/src/run.ts +5 -0
  156. package/src/scenario.ts +14 -4
  157. package/src/scenarios.ts +1 -1
  158. package/src/sdk.ts +21 -7
  159. package/src/shared.ts +60 -5
  160. package/src/sites.ts +70 -24
  161. package/src/source.ts +168 -5
  162. package/src/supervisor.ts +7 -12
  163. package/src/version.ts +25 -16
  164. package/src/wakeup-driver.ts +270 -0
  165. package/src/wakeup-service.ts +21 -28
  166. package/src/wakeup-type.ts +90 -0
  167. package/src/wakeup.ts +6 -17
  168. package/src/worker.ts +48 -9
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA6DrE,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC;AAEzD,wGAAwG;AACxG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AA4DrH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE;IACjD,MAAM,EAAE;QACN,OAAO,EAAE;YACP,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,wEAAwE;YACrF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAgC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE;SACxE;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAoE,CAAC;AAEnG,mGAAmG;AACnG,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE;IAClD,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;CAC7F,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,+BAA+B,CAAC;AAE/C,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE;QAC9F,mFAAmF;QACnF,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE;QACjD,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAyC,EAAE,EAAE;QACrD,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,YAAY,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE;YACzF,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,CACH,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,GAAG,EAAE,EAAE,aAAa,GAAG,KAAK,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;QACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,yBAAyB,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;AAC/G,CAAC;AA4GD,6HAA6H;AAC7H,MAAM,UAAU,SAAS,CACvB,OAAwC,EACxC,GAAW;IAEX,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type SanomaConfig } from "./config.ts";
1
+ import type { SanomaConfig } from "./config.ts";
2
2
  import type { SelfStop } from "./deadlines.ts";
3
3
  import { type WorkerOptions } from "./worker.ts";
4
4
  /** A worker under a supervisor (`superviseWorker`). */
@@ -12,10 +12,11 @@ export interface Supervisor {
12
12
  */
13
13
  resume(): Promise<void>;
14
14
  /**
15
- * A wakeup's `GET /wake?generation=N`: `resume` when the worker stopped with `generation`
16
- * registered (`shouldWake`); a no-op for any other, and while one starts or runs.
15
+ * A wakeup's `GET /wake`: `resume` when the worker stopped itself; a no-op while one starts or
16
+ * runs. A wake that arrives late, twice or for a replaced registration starts a worker that
17
+ * finds nothing to do and stops again on its own check.
17
18
  */
18
- wake(generation: number): Promise<void>;
19
+ wake(): Promise<void>;
19
20
  /** Stops the worker running or starting, and starts none again. */
20
21
  stop(): Promise<void>;
21
22
  }
@@ -1,5 +1,3 @@
1
- import { resolveConfig } from "./config.js";
2
- import { shouldWake } from "./db.js";
3
1
  import { warn } from "./log.js";
4
2
  import { errorMessage } from "./shared.js";
5
3
  import { startWorker } from "./worker.js";
@@ -17,7 +15,6 @@ export async function superviseWorker(config, options = {}) {
17
15
  let closed = false;
18
16
  // A write while the worker starts or runs, since it began starting.
19
17
  let heard = false;
20
- let databaseUrl;
21
18
  const launch = async () => {
22
19
  heard = false;
23
20
  const started = await startWorker(config, { ...workerOptions, ...(selfStop && { onStopped: selfStopped }) });
@@ -30,7 +27,7 @@ export async function superviseWorker(config, options = {}) {
30
27
  worker = undefined;
31
28
  if (closed)
32
29
  return;
33
- // Resumed first, so `stopped` is false when `onStopped` (the exit rule) looks.
30
+ // Resumed first, so `stopped` is false when `onStopped` looks.
34
31
  if (heard)
35
32
  void supervisor.resume();
36
33
  onStopped?.(stopped);
@@ -56,13 +53,7 @@ export async function superviseWorker(config, options = {}) {
56
53
  starting = undefined;
57
54
  }));
58
55
  },
59
- async wake(generation) {
60
- if (!supervisor.stopped)
61
- return;
62
- databaseUrl ??= resolveConfig(config).databaseUrl;
63
- if (await shouldWake(databaseUrl, generation))
64
- await supervisor.resume();
65
- },
56
+ wake: () => (supervisor.stopped ? supervisor.resume() : Promise.resolve()),
66
57
  async stop() {
67
58
  closed = true;
68
59
  await starting;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAmC,MAAM,aAAa,CAAC;AAqC3E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAoB,EAAE,OAAO,GAAsB,EAAE;IACzF,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IACjE,IAAI,MAA0B,CAAC;IAC/B,IAAI,QAAmC,CAAC;IACxC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,oEAAoE;IACpE,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,KAAK,GAAG,KAAK,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7G,IAAI,MAAM;YAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;;YAC5B,MAAM,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,OAAiB,EAAE,EAAE;QACxC,MAAM,GAAG,SAAS,CAAC;QACnB,IAAI,MAAM;YAAE,OAAO;QACnB,+DAA+D;QAC/D,IAAI,KAAK;YAAE,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QACpC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAe;QAC7B,IAAI,OAAO;YACT,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;QACzC,CAAC;QACD,MAAM;YACJ,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,MAAM,EAAE;iBACxB,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,qCAAqC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACvF,OAAO,CAAC,GAAG,EAAE;gBACZ,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,QAAQ,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,CAAC;YACvB,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,OAAO,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;IACF,MAAM,MAAM,EAAE,CAAC;IACf,OAAO,UAAU,CAAC;AACpB,CAAC"}
package/dist/version.d.ts CHANGED
@@ -30,3 +30,11 @@ export declare function computeVersion({ appName, workflows: definitions, }: {
30
30
  appName: string;
31
31
  workflows: readonly WorkflowDefinition<any, any>[];
32
32
  }): string;
33
+ /**
34
+ * A hash of the built-in `change` workflow's own code, which each change run carries (its
35
+ * `changeCode` attribute) so a worker on another version of the app may take it over
36
+ * (`carryChangeRuns` in worker.ts): what `computeVersion` hashes of that one workflow, with
37
+ * `RUNTIME_VERSION`, `STEP_LAYOUT` and the installed DBOS version. Never the company's workflows
38
+ * nor `DBOS__APPVERSION`, so a merge that changes only the company's code leaves it as it is.
39
+ */
40
+ export declare function changeCodeOf(change: WorkflowDefinition<any, any>): string;
package/dist/version.js CHANGED
@@ -53,20 +53,28 @@ export function computeVersion({ appName, workflows: definitions, }) {
53
53
  const named = process.env.DBOS__APPVERSION?.trim();
54
54
  if (named)
55
55
  return `${appName}@${named}`;
56
- const workflows = definitions
57
- .map((wf) => [
58
- wf.name,
59
- wf.run.toString(),
60
- opIdsOf(wf),
61
- // The input schema is parsed outside steps on replay, so a change to it must change the version.
62
- inputSchemaOf(wf),
63
- ])
64
- .toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
65
- const hash = createHash("sha256")
66
- .update(JSON.stringify([appName, RUNTIME_VERSION, STEP_LAYOUT, installedDbosVersion(), ...workflows]))
67
- .digest("hex");
68
- return `${appName}@${hash}`;
56
+ const workflows = definitions.map(codeOf).toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
57
+ return `${appName}@${sha256([appName, RUNTIME_VERSION, STEP_LAYOUT, installedDbosVersion(), ...workflows])}`;
69
58
  }
59
+ /**
60
+ * A hash of the built-in `change` workflow's own code, which each change run carries (its
61
+ * `changeCode` attribute) so a worker on another version of the app may take it over
62
+ * (`carryChangeRuns` in worker.ts): what `computeVersion` hashes of that one workflow, with
63
+ * `RUNTIME_VERSION`, `STEP_LAYOUT` and the installed DBOS version. Never the company's workflows
64
+ * nor `DBOS__APPVERSION`, so a merge that changes only the company's code leaves it as it is.
65
+ */
66
+ export function changeCodeOf(change) {
67
+ return sha256([RUNTIME_VERSION, STEP_LAYOUT, installedDbosVersion(), codeOf(change)]);
68
+ }
69
+ const sha256 = (parts) => createHash("sha256").update(JSON.stringify(parts)).digest("hex");
70
+ /** What the hashes read of a workflow: its name, the source of its `run`, its operations and its input schema. */
71
+ const codeOf = (wf) => [
72
+ wf.name,
73
+ wf.run.toString(),
74
+ opIdsOf(wf),
75
+ // The input schema is parsed outside steps on replay, so a change to it must change the version.
76
+ inputSchemaOf(wf),
77
+ ];
70
78
  /** The workflow's input schema as the hash sees it: its JSON Schema, or its text when zod can't convert it. */
71
79
  function inputSchemaOf(wf) {
72
80
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { z } from "zod";
2
+ import { type CallContext, DriverError } from "./op.ts";
3
+ import type { PlanAction } from "./resource.ts";
4
+ import type { WakeupRegistration } from "./wakeup.ts";
5
+ /** An instance as the service shows it (`GET /wakeup/instances/{id}`): the fields read here. */
6
+ declare const instanceSchema: z.ZodObject<{
7
+ id: z.ZodString;
8
+ url: z.ZodString;
9
+ at: z.ZodNullable<z.ZodString>;
10
+ lastError: z.ZodNullable<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export type Instance = z.output<typeof instanceSchema>;
13
+ /** The wakeup service, as the operations use it. Each call fails with a `DriverError`. */
14
+ export interface WakeupApi {
15
+ /**
16
+ * `POST /wakeup/instances { url, token }` with the account's token: the instance the token
17
+ * names, made, or moved to `url` when the account registered it before.
18
+ */
19
+ put(url: string, token: string): Promise<{
20
+ id: string;
21
+ }>;
22
+ /** `GET /wakeup/instances/{id}` with the account's token; undefined when there is none (404). */
23
+ get(id: string): Promise<Instance | undefined>;
24
+ /** `DELETE /wakeup/instances/{id}` with the account's token; nothing when there is none. */
25
+ remove(id: string): Promise<void>;
26
+ /** `PUT /wakeup/wake { at }` with the instance's token, which names the instance. */
27
+ wake(registration: WakeupRegistration, token: string): Promise<void>;
28
+ }
29
+ /** What the service holds of an instance that registered no wake: a new one's, and one moved to a new URL. */
30
+ export declare const UNREGISTERED: {
31
+ readonly at: null;
32
+ readonly lastError: null;
33
+ };
34
+ export declare const fail: (message: string, status: number) => DriverError;
35
+ /**
36
+ * The wakeup type's operations and `wakeup.register` over `api()`, made on each call. The
37
+ * instance's token, `SANOMA_WAKEUP_TOKEN`, names the instance: `create` and `update` both post it
38
+ * with the host's URL (minted and stored first when none is, as for a data file written by hand),
39
+ * so a new host is the same instance moved, never a replace; `register` sends it.
40
+ */
41
+ export declare function wakeupCalls(api: () => WakeupApi): {
42
+ import: ({ id }: {
43
+ id: string;
44
+ }) => Promise<{
45
+ id: string;
46
+ gone: boolean;
47
+ state: {
48
+ id: string;
49
+ host: string;
50
+ at: string | null;
51
+ lastError: string | null;
52
+ };
53
+ } | {
54
+ state?: undefined;
55
+ id: string;
56
+ gone: boolean;
57
+ }>;
58
+ read: ({ id }: {
59
+ id: string;
60
+ }) => Promise<{
61
+ id: string;
62
+ gone: boolean;
63
+ state: {
64
+ id: string;
65
+ host: string;
66
+ at: string | null;
67
+ lastError: string | null;
68
+ };
69
+ } | {
70
+ state?: undefined;
71
+ id: string;
72
+ gone: boolean;
73
+ }>;
74
+ plan: (input: {
75
+ id?: string;
76
+ desired?: Record<string, unknown>;
77
+ }) => Promise<{
78
+ action: PlanAction;
79
+ planned?: Record<string, unknown>;
80
+ unknown: string[];
81
+ replace: string[];
82
+ }>;
83
+ create: ({ desired }: {
84
+ desired: Record<string, unknown>;
85
+ }, call: CallContext) => Promise<{
86
+ id: string;
87
+ state: {
88
+ id: string;
89
+ host: string;
90
+ at: string | null;
91
+ lastError: string | null;
92
+ };
93
+ }>;
94
+ update: ({ id, desired, expect, }: {
95
+ id: string;
96
+ desired: Record<string, unknown>;
97
+ expect?: {
98
+ action: PlanAction;
99
+ replace: string[];
100
+ };
101
+ }, call: CallContext) => Promise<{
102
+ id: string;
103
+ state: {
104
+ id: string;
105
+ host: string;
106
+ at: string | null;
107
+ lastError: string | null;
108
+ };
109
+ }>;
110
+ delete: ({ id }: {
111
+ id: string;
112
+ }) => Promise<{
113
+ id: string;
114
+ gone: true;
115
+ }>;
116
+ register: (registration: WakeupRegistration, { secrets }: CallContext) => Promise<{}>;
117
+ };
118
+ /**
119
+ * The real wakeup service at `SANOMA_WAKEUP_URL`: instances created, read and deleted with
120
+ * `SANOMA_WAKEUP_ACCOUNT_TOKEN`, each named by its `SANOMA_WAKEUP_TOKEN` (which `create` and
121
+ * `register` send). `timeoutMs` is how long one request may take: 10 s by default.
122
+ */
123
+ export declare function sanomaWakeupDriver({ timeoutMs }?: {
124
+ timeoutMs?: number;
125
+ }): import("./op.ts").Driver;
126
+ /** The wakeup's step for Gherkin tests: an instance at the service before the run, named `wakeup` (`$wakeup.id`). */
127
+ export declare const wakeupSteps: import("./steps.ts").Steps;
128
+ export {};
@@ -0,0 +1,216 @@
1
+ import { z } from "zod";
2
+ import { defineDriver, DriverError, retryableStatus } from "./op.js";
3
+ import { defineSteps } from "./steps.js";
4
+ import { instanceUrl, mintInstanceToken, WAKEUP_TOKEN } from "./wakeup-service.js";
5
+ import { wakeupOps } from "./wakeup-type.js";
6
+ // `sanoma.wakeup`'s operations over a wakeup service (`WakeupApi`): the driver's call it over
7
+ // HTTP (plain `fetch`, the service has no SDK), the fake's (`fakeSanomaWakeup` in `fake.ts`)
8
+ // answer from its state. Both go through `wakeupCalls`, so they plan, post the token and refuse
9
+ // alike. `config.ts` puts the two together as the built-in `sanomaWakeup`.
10
+ /** An instance as the service shows it (`GET /wakeup/instances/{id}`): the fields read here. */
11
+ const instanceSchema = z.object({
12
+ id: z.string(),
13
+ url: z.string(),
14
+ at: z.string().nullable(),
15
+ lastError: z.string().nullable(),
16
+ });
17
+ /** What the service holds of an instance that registered no wake: a new one's, and one moved to a new URL. */
18
+ export const UNREGISTERED = { at: null, lastError: null };
19
+ export const fail = (message, status) => new DriverError(`sanoma.wakeup: ${message}`, { retryable: retryableStatus(status), status });
20
+ /** The driver's own refusal, before or instead of a call: never retried. */
21
+ const refused = (message, vendorCode) => new DriverError(`sanoma.wakeup: ${message}`, { retryable: false, ...(vendorCode && { vendorCode }) });
22
+ /** A wakeup's state: the service's instance, its URL as `host`. */
23
+ const stateOf = ({ id, url, at, lastError }) => ({ id, host: url, at, lastError });
24
+ /** A URL as the service keeps it (`instanceUrl`, the service's own rule), or as given when the service would refuse it. */
25
+ const normalUrl = (url) => {
26
+ const checked = instanceUrl(url);
27
+ return "url" in checked ? checked.url : String(url);
28
+ };
29
+ /**
30
+ * The wakeup type's operations and `wakeup.register` over `api()`, made on each call. The
31
+ * instance's token, `SANOMA_WAKEUP_TOKEN`, names the instance: `create` and `update` both post it
32
+ * with the host's URL (minted and stored first when none is, as for a data file written by hand),
33
+ * so a new host is the same instance moved, never a replace; `register` sends it.
34
+ */
35
+ export function wakeupCalls(api) {
36
+ const read = async ({ id }) => {
37
+ const found = await api().get(id);
38
+ return found ? { id, gone: false, state: stateOf(found) } : { id, gone: true };
39
+ };
40
+ /**
41
+ * The instance the stored token names, at the desired host: made or moved, its state as a new
42
+ * one's (a repeat after a lost reply keeps the wake the service holds, which the next read shows).
43
+ */
44
+ const put = async (desired, { secrets }) => {
45
+ const host = normalUrl(desired.host);
46
+ const token = await secrets.ensure(WAKEUP_TOKEN, mintInstanceToken);
47
+ const { id } = await api().put(host, token);
48
+ const state = { id, host, ...UNREGISTERED };
49
+ return { id, state };
50
+ };
51
+ const plan = async ({ id, desired }) => {
52
+ const state = id === undefined ? undefined : (await read({ id })).state;
53
+ const none = { unknown: [], replace: [] };
54
+ if (!desired)
55
+ return { action: state ? "delete" : "none", state, ...none };
56
+ const planned = { host: normalUrl(desired.host) };
57
+ if (!state)
58
+ return { action: "create", planned, unknown: ["id"], replace: [] };
59
+ if (planned.host === state.host)
60
+ return { action: "none", planned: state, state, ...none };
61
+ // A move forgets the wake registered at the old URL, as the service does.
62
+ return { action: "update", planned: { ...state, ...planned, ...UNREGISTERED }, state, ...none };
63
+ };
64
+ return {
65
+ import: read,
66
+ read,
67
+ plan: async (input) => {
68
+ const { state: _, ...out } = await plan(input);
69
+ return out;
70
+ },
71
+ create: ({ desired }, call) => put(desired, call),
72
+ update: async ({ id, desired, expect, }, call) => {
73
+ const fresh = await plan({ id, desired });
74
+ if (expect && (expect.action !== fresh.action || expect.replace.join() !== fresh.replace.join())) {
75
+ throw refused(`update: the plan changed (${expect.action}, now ${fresh.action})`, "plan_changed");
76
+ }
77
+ if (fresh.state && fresh.action === "none")
78
+ return { id, state: fresh.state };
79
+ return put(desired, call);
80
+ },
81
+ delete: async ({ id }) => {
82
+ await api().remove(id);
83
+ return { id, gone: true };
84
+ },
85
+ register: async (registration, { secrets }) => {
86
+ const token = await secrets.get(WAKEUP_TOKEN);
87
+ if (!token)
88
+ throw refused(`register: ${WAKEUP_TOKEN} is not set: connect a wakeup service in /setup, then apply the wakeup`);
89
+ await api().wake(registration, token);
90
+ return {};
91
+ },
92
+ };
93
+ }
94
+ /** The environment variables the driver reads, on every call. */
95
+ const env = z.object({
96
+ SANOMA_WAKEUP_URL: z.url().optional().describe("the wakeup service's URL: Sanoma's, or your own `sanoma wakeup`"),
97
+ SANOMA_WAKEUP_ACCOUNT_TOKEN: z
98
+ .string()
99
+ .startsWith("swa_", "an account's token starts swa_")
100
+ .optional()
101
+ .describe("an account's token at the wakeup service (swa_…), which creates and deletes the instances"),
102
+ // No check of its form: a host's own wakeup (Cloudflare's alarm) takes this variable too, and
103
+ // the service refuses a token that is not an instance's.
104
+ [WAKEUP_TOKEN]: z
105
+ .string()
106
+ .optional()
107
+ .describe("this instance's token at the wakeup service (swi_…), which /setup mints and the wakeup's create registers"),
108
+ });
109
+ /** The variable `name`, read when an operation is called, or the driver's refusal. */
110
+ function required(name) {
111
+ const value = process.env[name];
112
+ if (!value)
113
+ throw refused(`${name} is not set (${env.shape[name].description})`);
114
+ return value;
115
+ }
116
+ const Posted = z.object({ id: z.string() });
117
+ /** The service's error body. */
118
+ const Problem = z.object({ error: z.string() });
119
+ const instance = (id) => `/wakeup/instances/${encodeURIComponent(id)}`;
120
+ /** The service at `SANOMA_WAKEUP_URL`, read when an operation is called: each request's failure a `DriverError`. */
121
+ function serviceApi(timeoutMs) {
122
+ const base = required("SANOMA_WAKEUP_URL").replace(/\/+$/, "");
123
+ if (!URL.canParse(base))
124
+ throw refused("SANOMA_WAKEUP_URL is not a URL");
125
+ const account = () => required("SANOMA_WAKEUP_ACCOUNT_TOKEN");
126
+ /**
127
+ * One request: its reply parsed by `reply` (none: not read), a 404 `undefined` where `absent`
128
+ * says it means no such instance, and any other answer but a 2xx a `DriverError`.
129
+ */
130
+ const send = async (method, path, token, { reply, body, absent = false } = {}) => {
131
+ const where = `${method} ${path}`;
132
+ let res;
133
+ let text;
134
+ try {
135
+ res = await fetch(`${base}${path}`, {
136
+ method,
137
+ signal: AbortSignal.timeout(timeoutMs),
138
+ // A redirect is no answer of the service's, and would carry the token elsewhere.
139
+ redirect: "manual",
140
+ headers: {
141
+ authorization: `Bearer ${token}`,
142
+ accept: "application/json",
143
+ ...(body !== undefined && { "content-type": "application/json" }),
144
+ },
145
+ ...(body !== undefined && { body: JSON.stringify(body) }),
146
+ });
147
+ text = await res.text();
148
+ }
149
+ catch (cause) {
150
+ // No answer: the request may or may not have reached the service.
151
+ const why = cause.name === "TimeoutError" ? `no reply in ${timeoutMs} ms` : "the request failed";
152
+ throw new DriverError(`sanoma.wakeup: ${where}: ${why}`, { retryable: true, cause });
153
+ }
154
+ const { status } = res;
155
+ let json;
156
+ try {
157
+ json = text ? JSON.parse(text) : undefined;
158
+ }
159
+ catch {
160
+ // A proxy's HTML page, say: no body to read.
161
+ }
162
+ // The service's own 404 (its `{ error }`), not another server's at that URL.
163
+ if (status === 404 && absent && Problem.safeParse(json).success)
164
+ return undefined;
165
+ if (status < 200 || status >= 300)
166
+ throw fail(`${where}: ${Problem.safeParse(json).data?.error ?? `HTTP ${status}`}`, status);
167
+ if (!reply)
168
+ return undefined;
169
+ const parsed = reply.safeParse(json);
170
+ if (!parsed.success) {
171
+ throw new DriverError(`sanoma.wakeup: ${where}: the reply is not a wakeup service's; is SANOMA_WAKEUP_URL right?`, {
172
+ retryable: false,
173
+ status,
174
+ cause: parsed.error,
175
+ });
176
+ }
177
+ return parsed.data;
178
+ };
179
+ return {
180
+ put: async (url, token) => {
181
+ try {
182
+ return (await send("POST", "/wakeup/instances", account(), { reply: Posted, body: { url, token } }));
183
+ }
184
+ catch (error) {
185
+ // Another account's instance's token: the advice is the company's, so it is here, not the service's.
186
+ if (!(error instanceof DriverError) || error.status !== 409)
187
+ throw error;
188
+ throw new DriverError(`${error.message}: a new account needs a new instance token (store the new account's token in /setup, which mints one)`, { retryable: false, status: 409, cause: error });
189
+ }
190
+ },
191
+ get: (id) => send("GET", instance(id), account(), { reply: instanceSchema, absent: true }),
192
+ async remove(id) {
193
+ await send("DELETE", instance(id), account(), { absent: true });
194
+ },
195
+ async wake({ at }, token) {
196
+ await send("PUT", "/wakeup/wake", token, { body: { at } });
197
+ },
198
+ };
199
+ }
200
+ /**
201
+ * The real wakeup service at `SANOMA_WAKEUP_URL`: instances created, read and deleted with
202
+ * `SANOMA_WAKEUP_ACCOUNT_TOKEN`, each named by its `SANOMA_WAKEUP_TOKEN` (which `create` and
203
+ * `register` send). `timeoutMs` is how long one request may take: 10 s by default.
204
+ */
205
+ export function sanomaWakeupDriver({ timeoutMs = 10_000 } = {}) {
206
+ return defineDriver(wakeupOps, { wakeup: wakeupCalls(() => serviceApi(timeoutMs)) }, { env });
207
+ }
208
+ /** The wakeup's step for Gherkin tests: an instance at the service before the run, named `wakeup` (`$wakeup.id`). */
209
+ export const wakeupSteps = defineSteps("sanoma", ({ given }) => {
210
+ given("a sanoma wakeup for {string}", (host) => ({
211
+ op: wakeupOps.wakeup.create,
212
+ input: { desired: { host } },
213
+ as: "wakeup",
214
+ }));
215
+ });
216
+ //# sourceMappingURL=wakeup-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wakeup-driver.js","sourceRoot":"","sources":["../src/wakeup-driver.ts"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ export declare const WAKEUP_TOKEN = "SANOMA_WAKEUP_TOKEN";
48
48
  export declare const INSTANCE_TOKEN: RegExp;
49
49
  /**
50
50
  * An instance's URL as it is stored, without a trailing slash, or why it is refused: `http(s)`, no
51
- * user or password, no query, no fragment (`/wake?generation=N` is added to it).
51
+ * user or password, no query, no fragment (`/wake` is added to it).
52
52
  */
53
53
  export declare function instanceUrl(value: unknown): {
54
54
  url: string;
@@ -72,10 +72,10 @@ export declare function mintWakeupAccount(databaseUrl: string, label: string): P
72
72
  * token, 200 `{ id }` for one the account registered already, its URL now the given one (a lost
73
73
  * reply, or a host that moved; its registered wake kept only when the URL is the same), 409 for
74
74
  * another account's
75
- * - `GET /wakeup/instances/{id}`, its account's token → `{ id, url, at, generation, calledAt, attempts, lastError }`
75
+ * - `GET /wakeup/instances/{id}`, its account's token → `{ id, url, at, calledAt, attempts, lastError }`
76
76
  * - `DELETE /wakeup/instances/{id}`, its account's token → 204
77
- * - `PUT /wakeup/wake { at, generation }`, an instance's own token, which names the instance → 204,
78
- * applied only when `generation` is newer than the one it has, and waking the loop
77
+ * - `PUT /wakeup/wake { at }`, an instance's own token, which names the instance → 204, replacing
78
+ * the wake it had, and waking the loop
79
79
  *
80
80
  * 401 without a token or with an unknown one, 403 for another account's instance, 400 for a bad
81
81
  * body, 404 for an unknown id or path.