@resonatehq/sdk 0.9.6 → 0.10.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 (234) hide show
  1. package/README.md +84 -12
  2. package/dist/clock.d.ts.map +1 -0
  3. package/dist/clock.js +12 -0
  4. package/dist/clock.js.map +1 -0
  5. package/dist/codec.d.ts +11 -0
  6. package/dist/codec.d.ts.map +1 -0
  7. package/dist/codec.js +115 -0
  8. package/dist/codec.js.map +1 -0
  9. package/dist/computation.d.ts +40 -0
  10. package/dist/computation.d.ts.map +1 -0
  11. package/dist/computation.js +152 -0
  12. package/dist/computation.js.map +1 -0
  13. package/dist/{src/context.d.ts → context.d.ts} +65 -40
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/{src/context.js → context.js} +131 -153
  16. package/dist/context.js.map +1 -0
  17. package/dist/core.d.ts +45 -0
  18. package/dist/core.d.ts.map +1 -0
  19. package/dist/core.js +140 -0
  20. package/dist/core.js.map +1 -0
  21. package/dist/coroutine.d.ts +37 -0
  22. package/dist/coroutine.d.ts.map +1 -0
  23. package/dist/coroutine.js +258 -0
  24. package/dist/coroutine.js.map +1 -0
  25. package/dist/{src/decorator.d.ts → decorator.d.ts} +8 -8
  26. package/dist/decorator.d.ts.map +1 -0
  27. package/dist/decorator.js +149 -0
  28. package/dist/decorator.js.map +1 -0
  29. package/dist/encryptor.d.ts +10 -0
  30. package/dist/encryptor.d.ts.map +1 -0
  31. package/dist/encryptor.js +9 -0
  32. package/dist/encryptor.js.map +1 -0
  33. package/dist/{src/exceptions.d.ts → exceptions.d.ts} +4 -1
  34. package/dist/exceptions.d.ts.map +1 -0
  35. package/dist/{src/exceptions.js → exceptions.js} +11 -11
  36. package/dist/exceptions.js.map +1 -0
  37. package/dist/{src/heartbeat.d.ts → heartbeat.d.ts} +5 -3
  38. package/dist/heartbeat.d.ts.map +1 -0
  39. package/dist/heartbeat.js +50 -0
  40. package/dist/heartbeat.js.map +1 -0
  41. package/dist/index.d.ts +21 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +15 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/logger.d.ts +33 -0
  46. package/dist/logger.d.ts.map +1 -0
  47. package/dist/logger.js +54 -0
  48. package/dist/logger.js.map +1 -0
  49. package/dist/network/http.d.ts +82 -0
  50. package/dist/network/http.d.ts.map +1 -0
  51. package/dist/network/http.js +339 -0
  52. package/dist/network/http.js.map +1 -0
  53. package/dist/network/local.d.ts +179 -0
  54. package/dist/network/local.d.ts.map +1 -0
  55. package/dist/network/local.js +1232 -0
  56. package/dist/network/local.js.map +1 -0
  57. package/dist/network/network.d.ts +16 -0
  58. package/dist/network/network.d.ts.map +1 -0
  59. package/dist/network/network.js +2 -0
  60. package/dist/network/network.js.map +1 -0
  61. package/dist/network/types.d.ts +1279 -0
  62. package/dist/network/types.d.ts.map +1 -0
  63. package/dist/network/types.js +919 -0
  64. package/dist/network/types.js.map +1 -0
  65. package/dist/{src/options.d.ts → options.d.ts} +10 -4
  66. package/dist/options.d.ts.map +1 -0
  67. package/dist/options.js +32 -0
  68. package/dist/options.js.map +1 -0
  69. package/dist/promises.d.ts +41 -0
  70. package/dist/promises.d.ts.map +1 -0
  71. package/dist/promises.js +113 -0
  72. package/dist/promises.js.map +1 -0
  73. package/dist/{src/registry.d.ts → registry.d.ts} +1 -1
  74. package/dist/registry.d.ts.map +1 -0
  75. package/dist/{src/registry.js → registry.js} +6 -13
  76. package/dist/registry.js.map +1 -0
  77. package/dist/resonate.d.ts +168 -0
  78. package/dist/resonate.d.ts.map +1 -0
  79. package/dist/resonate.js +488 -0
  80. package/dist/resonate.js.map +1 -0
  81. package/dist/retries.d.ts.map +1 -0
  82. package/dist/{src/retries.js → retries.js} +4 -11
  83. package/dist/retries.js.map +1 -0
  84. package/dist/schedules.d.ts +22 -0
  85. package/dist/schedules.d.ts.map +1 -0
  86. package/dist/schedules.js +65 -0
  87. package/dist/schedules.js.map +1 -0
  88. package/dist/trace.d.ts +79 -0
  89. package/dist/trace.d.ts.map +1 -0
  90. package/dist/trace.js +224 -0
  91. package/dist/trace.js.map +1 -0
  92. package/dist/types.d.ts +21 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +2 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/{src/util.d.ts → util.d.ts} +10 -6
  97. package/dist/util.d.ts.map +1 -0
  98. package/dist/util.js +156 -0
  99. package/dist/util.js.map +1 -0
  100. package/package.json +18 -10
  101. package/dist/dev/network.d.ts +0 -34
  102. package/dist/dev/network.d.ts.map +0 -1
  103. package/dist/dev/network.js +0 -115
  104. package/dist/dev/network.js.map +0 -1
  105. package/dist/dev/server.d.ts +0 -89
  106. package/dist/dev/server.d.ts.map +0 -1
  107. package/dist/dev/server.js +0 -890
  108. package/dist/dev/server.js.map +0 -1
  109. package/dist/sim/example-1.d.ts +0 -2
  110. package/dist/sim/example-1.d.ts.map +0 -1
  111. package/dist/sim/example-1.js +0 -95
  112. package/dist/sim/example-1.js.map +0 -1
  113. package/dist/sim/example-2.d.ts +0 -2
  114. package/dist/sim/example-2.d.ts.map +0 -1
  115. package/dist/sim/example-2.js +0 -97
  116. package/dist/sim/example-2.js.map +0 -1
  117. package/dist/sim/example-3.d.ts +0 -2
  118. package/dist/sim/example-3.d.ts.map +0 -1
  119. package/dist/sim/example-3.js +0 -97
  120. package/dist/sim/example-3.js.map +0 -1
  121. package/dist/sim/main.d.ts +0 -14
  122. package/dist/sim/main.d.ts.map +0 -1
  123. package/dist/sim/main.js +0 -207
  124. package/dist/sim/main.js.map +0 -1
  125. package/dist/sim/src/server.d.ts +0 -15
  126. package/dist/sim/src/server.d.ts.map +0 -1
  127. package/dist/sim/src/server.js +0 -85
  128. package/dist/sim/src/server.js.map +0 -1
  129. package/dist/sim/src/simulator.d.ts +0 -65
  130. package/dist/sim/src/simulator.d.ts.map +0 -1
  131. package/dist/sim/src/simulator.js +0 -236
  132. package/dist/sim/src/simulator.js.map +0 -1
  133. package/dist/sim/src/worker.d.ts +0 -23
  134. package/dist/sim/src/worker.d.ts.map +0 -1
  135. package/dist/sim/src/worker.js +0 -217
  136. package/dist/sim/src/worker.js.map +0 -1
  137. package/dist/src/clock.d.ts.map +0 -1
  138. package/dist/src/clock.js +0 -17
  139. package/dist/src/clock.js.map +0 -1
  140. package/dist/src/computation.d.ts +0 -49
  141. package/dist/src/computation.d.ts.map +0 -1
  142. package/dist/src/computation.js +0 -314
  143. package/dist/src/computation.js.map +0 -1
  144. package/dist/src/context.d.ts.map +0 -1
  145. package/dist/src/context.js.map +0 -1
  146. package/dist/src/core.d.ts +0 -12
  147. package/dist/src/core.d.ts.map +0 -1
  148. package/dist/src/core.js +0 -28
  149. package/dist/src/core.js.map +0 -1
  150. package/dist/src/coroutine.d.ts +0 -42
  151. package/dist/src/coroutine.d.ts.map +0 -1
  152. package/dist/src/coroutine.js +0 -364
  153. package/dist/src/coroutine.js.map +0 -1
  154. package/dist/src/decorator.d.ts.map +0 -1
  155. package/dist/src/decorator.js +0 -220
  156. package/dist/src/decorator.js.map +0 -1
  157. package/dist/src/encoder.d.ts +0 -12
  158. package/dist/src/encoder.d.ts.map +0 -1
  159. package/dist/src/encoder.js +0 -101
  160. package/dist/src/encoder.js.map +0 -1
  161. package/dist/src/encryptor.d.ts +0 -10
  162. package/dist/src/encryptor.d.ts.map +0 -1
  163. package/dist/src/encryptor.js +0 -13
  164. package/dist/src/encryptor.js.map +0 -1
  165. package/dist/src/exceptions.d.ts.map +0 -1
  166. package/dist/src/exceptions.js.map +0 -1
  167. package/dist/src/handler.d.ts +0 -49
  168. package/dist/src/handler.d.ts.map +0 -1
  169. package/dist/src/handler.js +0 -316
  170. package/dist/src/handler.js.map +0 -1
  171. package/dist/src/heartbeat.d.ts.map +0 -1
  172. package/dist/src/heartbeat.js +0 -87
  173. package/dist/src/heartbeat.js.map +0 -1
  174. package/dist/src/index.d.ts +0 -15
  175. package/dist/src/index.d.ts.map +0 -1
  176. package/dist/src/index.js +0 -61
  177. package/dist/src/index.js.map +0 -1
  178. package/dist/src/network/network.d.ts +0 -254
  179. package/dist/src/network/network.d.ts.map +0 -1
  180. package/dist/src/network/network.js +0 -4
  181. package/dist/src/network/network.js.map +0 -1
  182. package/dist/src/network/remote.d.ts +0 -85
  183. package/dist/src/network/remote.d.ts.map +0 -1
  184. package/dist/src/network/remote.js +0 -523
  185. package/dist/src/network/remote.js.map +0 -1
  186. package/dist/src/nursery.d.ts +0 -19
  187. package/dist/src/nursery.d.ts.map +0 -1
  188. package/dist/src/nursery.js +0 -102
  189. package/dist/src/nursery.js.map +0 -1
  190. package/dist/src/options.d.ts.map +0 -1
  191. package/dist/src/options.js +0 -70
  192. package/dist/src/options.js.map +0 -1
  193. package/dist/src/processor/processor.d.ts +0 -12
  194. package/dist/src/processor/processor.d.ts.map +0 -1
  195. package/dist/src/processor/processor.js +0 -43
  196. package/dist/src/processor/processor.js.map +0 -1
  197. package/dist/src/promises.d.ts +0 -54
  198. package/dist/src/promises.d.ts.map +0 -1
  199. package/dist/src/promises.js +0 -169
  200. package/dist/src/promises.js.map +0 -1
  201. package/dist/src/registry.d.ts.map +0 -1
  202. package/dist/src/registry.js.map +0 -1
  203. package/dist/src/resonate-inner.d.ts +0 -60
  204. package/dist/src/resonate-inner.d.ts.map +0 -1
  205. package/dist/src/resonate-inner.js +0 -97
  206. package/dist/src/resonate-inner.js.map +0 -1
  207. package/dist/src/resonate.d.ts +0 -341
  208. package/dist/src/resonate.d.ts.map +0 -1
  209. package/dist/src/resonate.js +0 -591
  210. package/dist/src/resonate.js.map +0 -1
  211. package/dist/src/retries.d.ts.map +0 -1
  212. package/dist/src/retries.js.map +0 -1
  213. package/dist/src/schedules.d.ts +0 -19
  214. package/dist/src/schedules.d.ts.map +0 -1
  215. package/dist/src/schedules.js +0 -85
  216. package/dist/src/schedules.js.map +0 -1
  217. package/dist/src/tasks.d.ts +0 -9
  218. package/dist/src/tasks.d.ts.map +0 -1
  219. package/dist/src/tasks.js +0 -61
  220. package/dist/src/tasks.js.map +0 -1
  221. package/dist/src/tracer.d.ts +0 -23
  222. package/dist/src/tracer.d.ts.map +0 -1
  223. package/dist/src/tracer.js +0 -25
  224. package/dist/src/tracer.js.map +0 -1
  225. package/dist/src/types.d.ts +0 -28
  226. package/dist/src/types.d.ts.map +0 -1
  227. package/dist/src/types.js +0 -11
  228. package/dist/src/types.js.map +0 -1
  229. package/dist/src/util.d.ts.map +0 -1
  230. package/dist/src/util.js +0 -120
  231. package/dist/src/util.js.map +0 -1
  232. package/dist/tsconfig.build.tsbuildinfo +0 -1
  233. /package/dist/{src/clock.d.ts → clock.d.ts} +0 -0
  234. /package/dist/{src/retries.d.ts → retries.d.ts} +0 -0
package/README.md CHANGED
@@ -1,33 +1,105 @@
1
- ![resonate component banner](/assets/resonate-component.png)
1
+ ![resonate component banner](./assets/resonate-banner.png)
2
2
 
3
3
  # Resonate TypeScript SDK
4
4
 
5
5
  [![cicd](https://github.com/resonatehq/resonate-sdk-ts/actions/workflows/cicd.yaml/badge.svg)](https://github.com/resonatehq/resonate-sdk-ts/actions/workflows/cicd.yaml)
6
6
  [![codecov](https://codecov.io/gh/resonatehq/resonate-sdk-ts/branch/main/graph/badge.svg)](https://codecov.io/gh/resonatehq/resonate-sdk-ts)
7
+ [![dst](https://github.com/resonatehq/resonate-sdk-ts/actions/workflows/dst.yml/badge.svg)](https://github.com/resonatehq/resonate-sdk-ts/actions/workflows/dst.yml)
7
8
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
8
9
 
9
10
  ## About this component
10
11
 
11
12
  The Resonate TypeScript SDK enables developers to build reliable and scalable cloud applications across a wide variety of use cases.
12
13
 
13
- ### [How to contribute to this SDK](./CONTRIBUTING.md)
14
+ - [How to contribute to this SDK](./CONTRIBUTING.md)
15
+ - [Evaluate Resonate for your next project](https://docs.resonatehq.io/evaluate/)
16
+ - [Example application library](https://github.com/resonatehq-examples)
17
+ - [Join the Discord](https://resonatehq.io/discord)
18
+ - [Subscribe to the Blog](https://journal.resonatehq.io/subscribe)
19
+ - [Follow on X](https://x.com/resonatehqio)
20
+ - [Follow on LinkedIn](https://www.linkedin.com/company/resonatehqio)
21
+ - [Subscribe on YouTube](https://www.youtube.com/@resonatehqio)
14
22
 
15
- ### [How to use this SDK](https://docs.resonatehq.io/develop/typescript)
23
+ ## Quickstart
16
24
 
17
- ### [Get started with Resonate](https://docs.resonatehq.io/get-started/)
25
+ ![quickstart banner](./assets/quickstart-banner.png)
18
26
 
19
- ### [Evaluate Resonate for your next project](https://docs.resonatehq.io/evaluate/)
27
+ 1. Install the Resonate Server & CLI
20
28
 
21
- ### [Example application library](https://github.com/resonatehq-examples)
29
+ ```shell
30
+ brew install resonatehq/tap/resonate
31
+ ```
22
32
 
23
- ### [The concepts that power Resonate](https://www.distributed-async-await.io/)
33
+ 2. Install the Resonate SDK
24
34
 
25
- ### [Join the Discord](https://resonatehq.io/discord)
35
+ ```shell
36
+ npm install @resonatehq/sdk
37
+ ```
26
38
 
27
- ### [Subscribe to the Blog](https://journal.resonatehq.io/subscribe)
39
+ 3. Write your first Resonate Function
28
40
 
29
- ### [Follow on Twitter](https://twitter.com/resonatehqio)
41
+ A countdown as a loop. Simple, but the function can run for minutes, hours, or days, despite restarts.
30
42
 
31
- ### [Follow on LinkedIn](https://www.linkedin.com/company/resonatehqio)
43
+ ```typescript
44
+ import { Resonate, type Context } from "@resonatehq/sdk";
32
45
 
33
- ### [Subscribe on YouTube](https://www.youtube.com/@resonatehqio)
46
+ function* countdown(context: Context, count: number, delay: number) {
47
+ for (let i = count; i > 0; i--) {
48
+ // Run a function, persist its result
49
+ yield* context.run((context: Context) => console.log(`Countdown: ${i}`));
50
+ // Sleep
51
+ yield* context.sleep(delay * 1000);
52
+ }
53
+ console.log("Done!");
54
+ }
55
+ // Instantiate Resonate
56
+ const resonate = new Resonate({ url: "http://localhost:8001" });
57
+ // Register the function
58
+ resonate.register(countdown);
59
+ ```
60
+
61
+ [Clone a working example repo](https://github.com/resonatehq-examples/example-quickstart-ts)
62
+
63
+ 4. Start the server
64
+
65
+ ```shell
66
+ resonate dev
67
+ ```
68
+
69
+ 5. Start the worker
70
+
71
+ ```shell
72
+ npx ts-node countdown.ts
73
+ ```
74
+
75
+ 6. Run the function
76
+
77
+ Run the function with execution ID `countdown.1`:
78
+
79
+ ```shell
80
+ resonate invoke countdown.1 --func countdown --arg 5 --arg 60
81
+ ```
82
+
83
+ **Result**
84
+
85
+ You will see the countdown in the terminal
86
+
87
+ ```shell
88
+ npx ts-node countdown.ts
89
+ Countdown: 5
90
+ Countdown: 4
91
+ Countdown: 3
92
+ Countdown: 2
93
+ Countdown: 1
94
+ Done!
95
+ ```
96
+
97
+ **What to try**
98
+
99
+ After starting the function, inspect the current state of the execution using the `resonate tree` command. The tree command visualizes the call graph of the function execution as a graph of durable promises.
100
+
101
+ ```shell
102
+ resonate tree countdown.1
103
+ ```
104
+
105
+ Now try killing the worker mid-countdown and restarting. **The countdown picks up right where it left off without missing a beat.**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,GAAG,IAAI,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACpB,GAAG,IAAI,MAAM;CAGd;AAED,qBAAa,SAAS;IACb,IAAI,SAAK;IAChB,GAAG,IAAI,MAAM;CAGd"}
package/dist/clock.js ADDED
@@ -0,0 +1,12 @@
1
+ export class WallClock {
2
+ now() {
3
+ return Date.now();
4
+ }
5
+ }
6
+ export class StepClock {
7
+ time = 0;
8
+ now() {
9
+ return this.time++;
10
+ }
11
+ }
12
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,SAAS;IACpB,GAAG;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,SAAS;IACb,IAAI,GAAG,CAAC,CAAC;IAChB,GAAG;QACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { type Encryptor } from "./encryptor.js";
2
+ import type { PromiseRecord, Value } from "./network/types.js";
3
+ export declare class Codec {
4
+ private encoder;
5
+ private encryptor;
6
+ constructor(encryptor?: Encryptor);
7
+ encode(value: any): Value;
8
+ decode(value: Value | undefined): any | undefined;
9
+ decodePromise(promise: PromiseRecord): PromiseRecord;
10
+ }
11
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA8E/D,qBAAa,KAAK;IAChB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAY;gBAEjB,SAAS,GAAE,SAA+B;IAKtD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK;IAWzB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS;IAajD,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa;CAUrD"}
package/dist/codec.js ADDED
@@ -0,0 +1,115 @@
1
+ import { NoopEncryptor } from "./encryptor.js";
2
+ import exceptions from "./exceptions.js";
3
+ import * as util from "./util.js";
4
+ class JsonEncoder {
5
+ inf = "__INF__";
6
+ negInf = "__NEG_INF__";
7
+ encode(value) {
8
+ if (value === undefined) {
9
+ return { data: "", headers: {} };
10
+ }
11
+ let json;
12
+ try {
13
+ json = JSON.stringify(value, (_, v) => {
14
+ if (v === Number.POSITIVE_INFINITY)
15
+ return this.inf;
16
+ if (v === Number.NEGATIVE_INFINITY)
17
+ return this.negInf;
18
+ if (v instanceof AggregateError) {
19
+ return {
20
+ __type: "aggregate_error",
21
+ message: v.message,
22
+ stack: v.stack,
23
+ name: v.name,
24
+ errors: v.errors,
25
+ };
26
+ }
27
+ if (v instanceof Error) {
28
+ return {
29
+ __type: "error",
30
+ message: v.message,
31
+ stack: v.stack,
32
+ name: v.name,
33
+ };
34
+ }
35
+ return v;
36
+ });
37
+ return {
38
+ headers: {},
39
+ data: util.base64Encode(json),
40
+ };
41
+ }
42
+ catch (e) {
43
+ throw exceptions.ENCODING_ARGS_UNENCODEABLE("unknown", e);
44
+ }
45
+ }
46
+ decode(value) {
47
+ if (!value?.data) {
48
+ return undefined;
49
+ }
50
+ try {
51
+ const decoded = JSON.parse(util.base64Decode(value.data), (_, v) => {
52
+ if (v === this.inf)
53
+ return Number.POSITIVE_INFINITY;
54
+ if (v === this.negInf)
55
+ return Number.NEGATIVE_INFINITY;
56
+ if (v?.__type === "aggregate_error") {
57
+ return Object.assign(new AggregateError(v.errors, v.message), v);
58
+ }
59
+ if (v?.__type === "error") {
60
+ const err = new Error(v.message || "Unknown error");
61
+ if (v.name)
62
+ err.name = v.name;
63
+ if (v.stack)
64
+ err.stack = v.stack;
65
+ return err;
66
+ }
67
+ return v;
68
+ });
69
+ return decoded;
70
+ }
71
+ catch (e) {
72
+ throw exceptions.ENCODING_ARGS_UNDECODEABLE("unknown", e);
73
+ }
74
+ }
75
+ }
76
+ export class Codec {
77
+ encoder;
78
+ encryptor;
79
+ constructor(encryptor = new NoopEncryptor()) {
80
+ this.encoder = new JsonEncoder();
81
+ this.encryptor = encryptor;
82
+ }
83
+ encode(value) {
84
+ const encoded = this.encoder.encode(value);
85
+ try {
86
+ const encrypted = this.encryptor.encrypt(encoded);
87
+ return encrypted;
88
+ }
89
+ catch (e) {
90
+ throw exceptions.ENCODING_ARGS_UNENCODEABLE("unknown", e);
91
+ }
92
+ }
93
+ decode(value) {
94
+ if (!value?.data) {
95
+ return undefined;
96
+ }
97
+ try {
98
+ const decrypted = this.encryptor.decrypt(value);
99
+ return this.encoder.decode(decrypted);
100
+ }
101
+ catch (e) {
102
+ throw exceptions.ENCODING_ARGS_UNDECODEABLE("unknown", e);
103
+ }
104
+ }
105
+ decodePromise(promise) {
106
+ const param = this.decode(promise.param);
107
+ const value = this.decode(promise.value);
108
+ return {
109
+ ...promise,
110
+ param: { headers: promise.param?.headers, data: param },
111
+ value: { headers: promise.value?.headers, data: value },
112
+ };
113
+ }
114
+ }
115
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Clock } from "./clock.js";
2
+ import type { Heartbeat } from "./heartbeat.js";
3
+ import type { Logger } from "./logger.js";
4
+ import type { PromiseRecord } from "./network/types.js";
5
+ import type { OptionsBuilder } from "./options.js";
6
+ import type { Registry } from "./registry.js";
7
+ import { type RetryPolicyConstructor } from "./retries.js";
8
+ import { type Trace } from "./trace.js";
9
+ import type { Effects } from "./types.js";
10
+ export type Status = Done | Suspended;
11
+ export type Done = {
12
+ kind: "done";
13
+ id: string;
14
+ state: "resolved" | "rejected";
15
+ value: any;
16
+ trace: Trace;
17
+ };
18
+ export type Suspended = {
19
+ kind: "suspended";
20
+ awaited: string[];
21
+ trace: Trace;
22
+ };
23
+ export declare class Computation {
24
+ private id;
25
+ private clock;
26
+ private effects;
27
+ private retries;
28
+ private registry;
29
+ private dependencies;
30
+ private optsBuilder;
31
+ private logger;
32
+ private heartbeat;
33
+ private processing;
34
+ constructor(id: string, clock: Clock, effects: Effects, retries: Map<string, RetryPolicyConstructor>, registry: Registry, heartbeat: Heartbeat, dependencies: Map<string, any>, optsBuilder: OptionsBuilder, logger: Logger);
35
+ executeUntilBlocked(rootPromise: PromiseRecord): Promise<Status>;
36
+ private processAcquired;
37
+ private processGenerator;
38
+ private processFunction;
39
+ }
40
+ //# sourceMappingURL=computation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computation.d.ts","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,KAAK,KAAK,EAAkB,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtC,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/B,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AASF,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAS;gBAGzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAC5C,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,MAAM;IAaH,mBAAmB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;YAW/D,eAAe;YAqDf,gBAAgB;YAwChB,eAAe;CAoB9B"}
@@ -0,0 +1,152 @@
1
+ import { InnerContext } from "./context.js";
2
+ import { Coroutine } from "./coroutine.js";
3
+ import exceptions from "./exceptions.js";
4
+ import { Exponential, Never } from "./retries.js";
5
+ import { TraceCollector } from "./trace.js";
6
+ import * as util from "./util.js";
7
+ export class Computation {
8
+ id;
9
+ clock;
10
+ effects;
11
+ retries;
12
+ registry;
13
+ dependencies;
14
+ optsBuilder;
15
+ logger;
16
+ heartbeat;
17
+ processing = false;
18
+ constructor(id, clock, effects, retries, registry, heartbeat, dependencies, optsBuilder, logger) {
19
+ this.id = id;
20
+ this.clock = clock;
21
+ this.effects = effects;
22
+ this.retries = retries;
23
+ this.registry = registry;
24
+ this.heartbeat = heartbeat;
25
+ this.dependencies = dependencies;
26
+ this.optsBuilder = optsBuilder;
27
+ this.logger = logger;
28
+ }
29
+ async executeUntilBlocked(rootPromise) {
30
+ if (this.processing)
31
+ throw exceptions.PANIC("computation", "already processing");
32
+ this.processing = true;
33
+ try {
34
+ return await this.processAcquired(rootPromise);
35
+ }
36
+ finally {
37
+ this.processing = false;
38
+ }
39
+ }
40
+ async processAcquired(rootPromise) {
41
+ if (!isValidData(rootPromise.param?.data)) {
42
+ throw exceptions.PANIC("computation", "invalid promise data");
43
+ }
44
+ const { func, args, retry, version = 1 } = rootPromise.param.data;
45
+ const registered = this.registry.get(func, version);
46
+ // function must be registered
47
+ if (!registered) {
48
+ throw exceptions.REGISTRY_FUNCTION_NOT_REGISTERED(func, version);
49
+ }
50
+ if (version !== 0)
51
+ util.assert(version === registered.version, "versions must match");
52
+ util.assert(func === registered.name, "names must match");
53
+ // start heartbeat
54
+ this.heartbeat.start();
55
+ const retryCtor = retry ? this.retries.get(retry.type) : undefined;
56
+ const retryPolicy = retryCtor
57
+ ? new retryCtor(retry?.data)
58
+ : util.isGeneratorFunction(registered.func)
59
+ ? new Never()
60
+ : new Exponential();
61
+ if (retry && !retryCtor) {
62
+ this.logger.warn({ component: "computation", retryType: retry.type }, `Retry policy '${retry.type}' not found. Will ignore.`);
63
+ }
64
+ const ctxConfig = {
65
+ id: this.id,
66
+ oId: rootPromise.tags["resonate:origin"] ?? this.id,
67
+ func: registered.func.name,
68
+ clock: this.clock,
69
+ registry: this.registry,
70
+ dependencies: this.dependencies,
71
+ optsBuilder: this.optsBuilder,
72
+ timeout: rootPromise.timeoutAt,
73
+ version: registered.version,
74
+ retryPolicy: retryPolicy,
75
+ };
76
+ if (util.isGeneratorFunction(registered.func)) {
77
+ return this.processGenerator(registered.func, ctxConfig, args, rootPromise);
78
+ }
79
+ return this.processFunction(this.id, registered.func, new InnerContext(ctxConfig), args);
80
+ }
81
+ async processGenerator(func, ctxConfig, args, rootPromise) {
82
+ const collector = new TraceCollector();
83
+ // If boundary promise is done, short-circuit (dedup the root)
84
+ if (rootPromise.state !== "pending") {
85
+ const state = rootPromise.state === "resolved" ? "resolved" : "rejected";
86
+ collector.emit({ kind: "dedup", id: rootPromise.id, state, value: rootPromise.value });
87
+ this.logger.debug({ component: "trace", kind: "dedup", id: rootPromise.id }, "trace: dedup");
88
+ return {
89
+ kind: "done",
90
+ id: rootPromise.id,
91
+ state,
92
+ value: rootPromise.value,
93
+ trace: collector.getTrace(),
94
+ };
95
+ }
96
+ const ctx = new InnerContext(ctxConfig);
97
+ const status = await Coroutine.exec(this.logger, ctx, func, args, this.effects, collector);
98
+ const trace = collector.getTrace();
99
+ if (status.type === "done") {
100
+ return {
101
+ kind: "done",
102
+ id: this.id,
103
+ state: status.result.kind === "value" ? "resolved" : "rejected",
104
+ value: status.result.kind === "value" ? status.result.value : status.result.error,
105
+ trace,
106
+ };
107
+ }
108
+ // Only remote todos remain — locals are handled inline by the coroutine
109
+ return { kind: "suspended", awaited: status.todo.remote.map((t) => t.id), trace };
110
+ }
111
+ async processFunction(id, func, ctx, args) {
112
+ const collector = new TraceCollector();
113
+ collector.emit({ kind: "spawn", id });
114
+ this.logger.debug({ component: "trace", kind: "spawn", id }, "trace: spawn");
115
+ const result = await util.executeWithRetry(ctx, func, args, this.logger);
116
+ const state = result.kind === "value" ? "resolved" : "rejected";
117
+ const value = result.kind === "value" ? result.value : result.error;
118
+ collector.emit({ kind: "return", id, state, value });
119
+ this.logger.debug({ component: "trace", kind: "return", id }, "trace: return");
120
+ return {
121
+ kind: "done",
122
+ id,
123
+ state,
124
+ value,
125
+ trace: collector.getTrace(),
126
+ };
127
+ }
128
+ }
129
+ // Helper functions
130
+ function isValidData(data) {
131
+ if (data === null || typeof data !== "object")
132
+ return false;
133
+ const d = data;
134
+ // func must be a string
135
+ if (typeof d.func !== "string")
136
+ return false;
137
+ // args must be an array
138
+ if (!Array.isArray(d.args))
139
+ return false;
140
+ // retry (if present) must be an object with string `type` and any `data`
141
+ if (d.retry !== undefined) {
142
+ if (d.retry === null || typeof d.retry !== "object" || typeof d.retry.type !== "string" || !("data" in d.retry)) {
143
+ return false;
144
+ }
145
+ }
146
+ // version (if present) must be a number
147
+ if (d.version !== undefined && typeof d.version !== "number") {
148
+ return false;
149
+ }
150
+ return true;
151
+ }
152
+ //# sourceMappingURL=computation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computation.js","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"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"}