@restatedev/restate-sdk 0.7.3-worker → 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 (231) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +29 -51
  3. package/dist/clients/workflow_client.d.ts +77 -0
  4. package/dist/clients/workflow_client.d.ts.map +1 -0
  5. package/dist/clients/workflow_client.js +172 -0
  6. package/dist/clients/workflow_client.js.map +1 -0
  7. package/dist/connection/buffered_connection.js +44 -0
  8. package/dist/connection/buffered_connection.js.map +1 -0
  9. package/dist/connection/connection.js +13 -0
  10. package/dist/connection/connection.js.map +1 -0
  11. package/dist/connection/embedded_connection.js +59 -0
  12. package/dist/connection/embedded_connection.js.map +1 -0
  13. package/dist/connection/http_connection.js +203 -0
  14. package/dist/connection/http_connection.js.map +1 -0
  15. package/dist/connection/lambda_connection.js +58 -0
  16. package/dist/connection/lambda_connection.js.map +1 -0
  17. package/dist/{restate_context.d.ts → context.d.ts} +239 -170
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +113 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/{restate_context_impl.d.ts → context_impl.d.ts} +26 -30
  22. package/dist/context_impl.d.ts.map +1 -0
  23. package/dist/context_impl.js +439 -0
  24. package/dist/context_impl.js.map +1 -0
  25. package/dist/embedded/api.d.ts +2 -2
  26. package/dist/embedded/api.d.ts.map +1 -1
  27. package/dist/embedded/api.js +35 -0
  28. package/dist/embedded/api.js.map +1 -0
  29. package/dist/embedded/handler.d.ts +2 -2
  30. package/dist/embedded/handler.d.ts.map +1 -1
  31. package/dist/embedded/handler.js +26 -0
  32. package/dist/embedded/handler.js.map +1 -0
  33. package/dist/embedded/http2_remote.js +91 -0
  34. package/dist/embedded/http2_remote.js.map +1 -0
  35. package/dist/embedded/invocation.d.ts.map +1 -1
  36. package/dist/embedded/invocation.js +94 -0
  37. package/dist/embedded/invocation.js.map +1 -0
  38. package/dist/endpoint/endpoint_impl.d.ts +35 -0
  39. package/dist/endpoint/endpoint_impl.d.ts.map +1 -0
  40. package/dist/endpoint/endpoint_impl.js +405 -0
  41. package/dist/endpoint/endpoint_impl.js.map +1 -0
  42. package/dist/endpoint/http2_handler.d.ts +11 -0
  43. package/dist/endpoint/http2_handler.d.ts.map +1 -0
  44. package/dist/endpoint/http2_handler.js +119 -0
  45. package/dist/endpoint/http2_handler.js.map +1 -0
  46. package/dist/endpoint/lambda_handler.d.ts +15 -0
  47. package/dist/endpoint/lambda_handler.d.ts.map +1 -0
  48. package/dist/endpoint/lambda_handler.js +144 -0
  49. package/dist/endpoint/lambda_handler.js.map +1 -0
  50. package/dist/endpoint.d.ts +161 -0
  51. package/dist/endpoint.d.ts.map +1 -0
  52. package/dist/endpoint.js +22 -0
  53. package/dist/endpoint.js.map +1 -0
  54. package/dist/generated/dev/restate/events.js +371 -0
  55. package/dist/generated/dev/restate/events.js.map +1 -0
  56. package/dist/generated/dev/restate/ext.js +215 -0
  57. package/dist/generated/dev/restate/ext.js.map +1 -0
  58. package/dist/generated/google/protobuf/descriptor.js +6676 -0
  59. package/dist/generated/google/protobuf/descriptor.js.map +1 -0
  60. package/dist/generated/google/protobuf/empty.js +107 -0
  61. package/dist/generated/google/protobuf/empty.js.map +1 -0
  62. package/dist/generated/google/protobuf/struct.js +754 -0
  63. package/dist/generated/google/protobuf/struct.js.map +1 -0
  64. package/dist/generated/proto/discovery.js +364 -0
  65. package/dist/generated/proto/discovery.js.map +1 -0
  66. package/dist/generated/proto/dynrpc.js +668 -0
  67. package/dist/generated/proto/dynrpc.js.map +1 -0
  68. package/dist/generated/proto/javascript.d.ts +13 -0
  69. package/dist/generated/proto/javascript.d.ts.map +1 -1
  70. package/dist/generated/proto/javascript.js +416 -0
  71. package/dist/generated/proto/javascript.js.map +1 -0
  72. package/dist/generated/proto/protocol.d.ts +43 -0
  73. package/dist/generated/proto/protocol.d.ts.map +1 -1
  74. package/dist/generated/proto/protocol.js +2641 -0
  75. package/dist/generated/proto/protocol.js.map +1 -0
  76. package/dist/generated/proto/services.js +1535 -0
  77. package/dist/generated/proto/services.js.map +1 -0
  78. package/dist/generated/proto/test.js +321 -0
  79. package/dist/generated/proto/test.js.map +1 -0
  80. package/dist/invocation.d.ts +4 -1
  81. package/dist/invocation.d.ts.map +1 -1
  82. package/dist/invocation.js +157 -0
  83. package/dist/invocation.js.map +1 -0
  84. package/dist/io/decoder.d.ts +1 -0
  85. package/dist/io/decoder.d.ts.map +1 -1
  86. package/dist/io/decoder.js +140 -0
  87. package/dist/io/decoder.js.map +1 -0
  88. package/dist/io/encoder.d.ts +1 -2
  89. package/dist/io/encoder.d.ts.map +1 -1
  90. package/dist/io/encoder.js +68 -0
  91. package/dist/io/encoder.js.map +1 -0
  92. package/dist/journal.d.ts +13 -4
  93. package/dist/journal.d.ts.map +1 -1
  94. package/dist/journal.js +405 -0
  95. package/dist/journal.js.map +1 -0
  96. package/dist/local_state_store.d.ts +5 -3
  97. package/dist/local_state_store.d.ts.map +1 -1
  98. package/dist/local_state_store.js +82 -0
  99. package/dist/local_state_store.js.map +1 -0
  100. package/dist/logger.d.ts +19 -0
  101. package/dist/logger.d.ts.map +1 -0
  102. package/dist/logger.js +90 -0
  103. package/dist/logger.js.map +1 -0
  104. package/dist/promise_combinator_tracker.d.ts +29 -0
  105. package/dist/promise_combinator_tracker.d.ts.map +1 -0
  106. package/dist/promise_combinator_tracker.js +128 -0
  107. package/dist/promise_combinator_tracker.js.map +1 -0
  108. package/dist/public_api.d.ts +5 -5
  109. package/dist/public_api.d.ts.map +1 -1
  110. package/dist/public_api.js +60 -0
  111. package/dist/public_api.js.map +1 -0
  112. package/dist/state_machine.d.ts +19 -12
  113. package/dist/state_machine.d.ts.map +1 -1
  114. package/dist/state_machine.js +437 -0
  115. package/dist/state_machine.js.map +1 -0
  116. package/dist/types/errors.d.ts +12 -3
  117. package/dist/types/errors.d.ts.map +1 -1
  118. package/dist/types/errors.js +273 -0
  119. package/dist/types/errors.js.map +1 -0
  120. package/dist/types/grpc.d.ts +6 -4
  121. package/dist/types/grpc.d.ts.map +1 -1
  122. package/dist/types/grpc.js +81 -0
  123. package/dist/types/grpc.js.map +1 -0
  124. package/dist/types/protocol.d.ts +9 -5
  125. package/dist/types/protocol.d.ts.map +1 -1
  126. package/dist/types/protocol.js +147 -0
  127. package/dist/types/protocol.js.map +1 -0
  128. package/dist/types/router.d.ts +8 -8
  129. package/dist/types/router.d.ts.map +1 -1
  130. package/dist/types/router.js +36 -0
  131. package/dist/types/router.js.map +1 -0
  132. package/dist/types/types.d.ts +1 -0
  133. package/dist/types/types.d.ts.map +1 -1
  134. package/dist/types/types.js +138 -0
  135. package/dist/types/types.js.map +1 -0
  136. package/dist/utils/{assumpsions.d.ts → assumptions.d.ts} +1 -1
  137. package/dist/utils/{assumpsions.d.ts.map → assumptions.d.ts.map} +1 -1
  138. package/dist/utils/assumptions.js +101 -0
  139. package/dist/utils/assumptions.js.map +1 -0
  140. package/dist/utils/message_logger.d.ts +28 -0
  141. package/dist/utils/message_logger.d.ts.map +1 -0
  142. package/dist/utils/message_logger.js +88 -0
  143. package/dist/utils/message_logger.js.map +1 -0
  144. package/dist/utils/promises.d.ts +15 -0
  145. package/dist/utils/promises.d.ts.map +1 -0
  146. package/dist/utils/promises.js +67 -0
  147. package/dist/utils/promises.js.map +1 -0
  148. package/dist/utils/public_utils.js +49 -0
  149. package/dist/utils/public_utils.js.map +1 -0
  150. package/dist/utils/rand.d.ts +1 -1
  151. package/dist/utils/rand.d.ts.map +1 -1
  152. package/dist/utils/rand.js +114 -0
  153. package/dist/utils/rand.js.map +1 -0
  154. package/dist/utils/utils.d.ts +1 -10
  155. package/dist/utils/utils.d.ts.map +1 -1
  156. package/dist/utils/utils.js +122 -0
  157. package/dist/utils/utils.js.map +1 -0
  158. package/dist/workflows/workflow.d.ts +101 -0
  159. package/dist/workflows/workflow.d.ts.map +1 -0
  160. package/dist/workflows/workflow.js +80 -0
  161. package/dist/workflows/workflow.js.map +1 -0
  162. package/dist/workflows/workflow_state_service.d.ts +35 -0
  163. package/dist/workflows/workflow_state_service.d.ts.map +1 -0
  164. package/dist/workflows/workflow_state_service.js +201 -0
  165. package/dist/workflows/workflow_state_service.js.map +1 -0
  166. package/dist/workflows/workflow_wrapper_service.d.ts +10 -0
  167. package/dist/workflows/workflow_wrapper_service.d.ts.map +1 -0
  168. package/dist/workflows/workflow_wrapper_service.js +264 -0
  169. package/dist/workflows/workflow_wrapper_service.js.map +1 -0
  170. package/package.json +38 -39
  171. package/src/clients/workflow_client.ts +290 -0
  172. package/src/connection/buffered_connection.ts +47 -0
  173. package/src/connection/connection.ts +34 -0
  174. package/src/connection/embedded_connection.ts +62 -0
  175. package/src/connection/http_connection.ts +228 -0
  176. package/src/connection/lambda_connection.ts +69 -0
  177. package/src/context.ts +633 -0
  178. package/src/context_impl.ts +721 -0
  179. package/src/embedded/api.ts +57 -0
  180. package/src/embedded/handler.ts +36 -0
  181. package/src/embedded/http2_remote.ts +103 -0
  182. package/src/embedded/invocation.ts +126 -0
  183. package/src/endpoint/endpoint_impl.ts +623 -0
  184. package/src/endpoint/http2_handler.ts +151 -0
  185. package/src/endpoint/lambda_handler.ts +181 -0
  186. package/src/endpoint.ts +187 -0
  187. package/src/generated/dev/restate/events.ts +430 -0
  188. package/src/generated/dev/restate/ext.ts +238 -0
  189. package/src/generated/google/protobuf/descriptor.ts +7889 -0
  190. package/src/generated/google/protobuf/empty.ts +150 -0
  191. package/src/generated/google/protobuf/struct.ts +878 -0
  192. package/src/generated/proto/discovery.ts +423 -0
  193. package/src/generated/proto/dynrpc.ts +768 -0
  194. package/src/generated/proto/javascript.ts +488 -0
  195. package/src/generated/proto/protocol.ts +3091 -0
  196. package/src/generated/proto/services.ts +1834 -0
  197. package/src/generated/proto/test.ts +387 -0
  198. package/src/invocation.ts +212 -0
  199. package/src/io/decoder.ts +171 -0
  200. package/src/io/encoder.ts +72 -0
  201. package/src/journal.ts +537 -0
  202. package/src/local_state_store.ts +94 -0
  203. package/src/logger.ts +121 -0
  204. package/src/promise_combinator_tracker.ts +191 -0
  205. package/src/public_api.ts +53 -0
  206. package/src/state_machine.ts +635 -0
  207. package/src/types/errors.ts +297 -0
  208. package/src/types/grpc.ts +97 -0
  209. package/src/types/protocol.ts +201 -0
  210. package/src/types/router.ts +118 -0
  211. package/src/types/types.ts +160 -0
  212. package/src/utils/assumptions.ts +131 -0
  213. package/src/utils/message_logger.ts +112 -0
  214. package/src/utils/promises.ts +118 -0
  215. package/src/utils/public_utils.ts +91 -0
  216. package/src/utils/rand.ts +142 -0
  217. package/src/utils/utils.ts +178 -0
  218. package/src/workflows/workflow.ts +178 -0
  219. package/src/workflows/workflow_state_service.ts +299 -0
  220. package/src/workflows/workflow_wrapper_service.ts +314 -0
  221. package/dist/cloudflare_bundle.js +0 -27387
  222. package/dist/restate_context.d.ts.map +0 -1
  223. package/dist/restate_context_impl.d.ts.map +0 -1
  224. package/dist/server/base_restate_server.d.ts +0 -32
  225. package/dist/server/base_restate_server.d.ts.map +0 -1
  226. package/dist/server/restate_lambda_handler.d.ts +0 -104
  227. package/dist/server/restate_lambda_handler.d.ts.map +0 -1
  228. package/dist/server/restate_server.d.ts +0 -97
  229. package/dist/server/restate_server.d.ts.map +0 -1
  230. package/dist/utils/logger.d.ts +0 -60
  231. package/dist/utils/logger.d.ts.map +0 -1
@@ -0,0 +1,171 @@
1
+ /*
2
+ * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
3
+ *
4
+ * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * which is released under the MIT license.
6
+ *
7
+ * You can find a copy of the license in file LICENSE in the root
8
+ * directory of this repository or package, or at
9
+ * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
10
+ */
11
+
12
+ // This is a NodeJs stream transformer. It is used to convert a chunked stream of bytes to
13
+ // a stream of JavaScript objects of the form { header: .. , message: ..} where:
14
+ // * header has some information about the frame like, the message type, and some flags.
15
+ // * message is the Protobuf decoded message.
16
+ //
17
+ // To use this one would need to do the following:
18
+ //
19
+ // let decodedStream = stream.pipe(streamDecoder());
20
+ //
21
+ // at this point the decodedStream is a high level stream of objects {header, message}
22
+
23
+ import stream from "stream";
24
+ import { PROTOBUF_MESSAGE_BY_TYPE } from "../types/protocol";
25
+ import { Header, Message } from "../types/types";
26
+ import assert from "assert";
27
+ import { ensureError } from "../types/errors";
28
+
29
+ type Output = { push(msg: Message): void };
30
+ type DecoderState = { state: number; header: Header | undefined; buf: Buffer };
31
+
32
+ const WAITING_FOR_HEADER = 0;
33
+ const WAITING_FOR_BODY = 1;
34
+
35
+ export const SUPPORTED_PROTOCOL_VERSION = 1;
36
+
37
+ function initalDecoderState(buf: Buffer): DecoderState {
38
+ return {
39
+ state: WAITING_FOR_HEADER,
40
+ header: undefined,
41
+ buf,
42
+ };
43
+ }
44
+
45
+ function appendBufferToDecoder(state: DecoderState, chunk: Buffer) {
46
+ state.buf = Buffer.concat([state.buf, chunk]);
47
+ }
48
+
49
+ function decodeMessages(decoderState: DecoderState, out: Output): DecoderState {
50
+ let buf = decoderState.buf;
51
+
52
+ while (buf.length > 0 || decoderState.state === WAITING_FOR_BODY) {
53
+ switch (decoderState.state) {
54
+ case WAITING_FOR_HEADER: {
55
+ assert(decoderState.header === undefined);
56
+ if (buf.length < 8) {
57
+ decoderState.buf = buf;
58
+ return decoderState;
59
+ }
60
+ const h = buf.readBigUInt64BE();
61
+ buf = buf.subarray(8);
62
+ const materializedHeader = Header.fromU64be(h);
63
+ decoderState.header = materializedHeader;
64
+ decoderState.state = WAITING_FOR_BODY;
65
+
66
+ // Check protocol version
67
+ if (
68
+ materializedHeader.protocolVersion !== undefined &&
69
+ materializedHeader.protocolVersion !== SUPPORTED_PROTOCOL_VERSION
70
+ ) {
71
+ throw new Error(
72
+ `Unsupported protocol version ${materializedHeader.protocolVersion}, only version ${SUPPORTED_PROTOCOL_VERSION} is supported`
73
+ );
74
+ }
75
+
76
+ break;
77
+ }
78
+ case WAITING_FOR_BODY: {
79
+ const header = decoderState.header;
80
+ assert(header !== undefined);
81
+
82
+ if (buf.length < header.frameLength) {
83
+ decoderState.buf = buf;
84
+ return decoderState;
85
+ }
86
+ const frame = buf.subarray(0, header.frameLength);
87
+ buf = buf.subarray(header.frameLength);
88
+ decoderState.state = WAITING_FOR_HEADER;
89
+ decoderState.header = undefined;
90
+
91
+ const pbType = PROTOBUF_MESSAGE_BY_TYPE.get(header.messageType);
92
+ if (pbType === undefined) {
93
+ throw new Error("Got unknown message type " + header.messageType);
94
+ } else {
95
+ const message = pbType.decode(frame);
96
+ out.push(
97
+ new Message(
98
+ header.messageType,
99
+ message,
100
+ header.completedFlag,
101
+ header.protocolVersion,
102
+ header.requiresAckFlag
103
+ )
104
+ );
105
+ }
106
+ break;
107
+ }
108
+ }
109
+ }
110
+
111
+ decoderState.buf = buf;
112
+ return decoderState;
113
+ }
114
+
115
+ export function streamDecoder(): stream.Transform {
116
+ let decoderState = initalDecoderState(Buffer.alloc(0));
117
+
118
+ return new stream.Transform({
119
+ writableObjectMode: true,
120
+ objectMode: true,
121
+
122
+ transform(chunk, _encoding, cb) {
123
+ try {
124
+ appendBufferToDecoder(decoderState, chunk);
125
+ decoderState = decodeMessages(decoderState, this);
126
+ cb();
127
+ } catch (e) {
128
+ cb(ensureError(e), null);
129
+ }
130
+ },
131
+ });
132
+ }
133
+
134
+ // Decodes messages from Lambda requests to an array of headers + protocol messages
135
+ const base64regex =
136
+ /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
137
+
138
+ export function decodeLambdaBody(msgBase64: string): Message[] {
139
+ if (!base64regex.test(msgBase64)) {
140
+ throw new Error(
141
+ "Cannot parse the lambda request body, body was not valid base64 encoded: " +
142
+ msgBase64
143
+ );
144
+ }
145
+ const buffer = Buffer.from(msgBase64, "base64");
146
+ return decodeMessagesBuffer(buffer);
147
+ }
148
+
149
+ export function decodeMessagesBuffer(buffer: Buffer): Message[] {
150
+ const decodedEntries: Message[] = [];
151
+ let finalState;
152
+ try {
153
+ finalState = decodeMessages(initalDecoderState(buffer), decodedEntries);
154
+ } catch (e) {
155
+ const err = ensureError(e);
156
+ throw new Error(
157
+ "Cannot parse the lambda request body, message was not a valid sequence of Restate messages: " +
158
+ err.message,
159
+ { cause: err }
160
+ );
161
+ }
162
+
163
+ if (finalState.buf.length > 0) {
164
+ throw new Error(
165
+ "Cannot parse the request body: Trailing data (incomplete message) in request body: " +
166
+ finalState.buf.toString("hex")
167
+ );
168
+ }
169
+
170
+ return decodedEntries;
171
+ }
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
3
+ *
4
+ * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * which is released under the MIT license.
6
+ *
7
+ * You can find a copy of the license in file LICENSE in the root
8
+ * directory of this repository or package, or at
9
+ * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
10
+ */
11
+
12
+ import stream from "stream";
13
+ import { PROTOBUF_MESSAGE_BY_TYPE } from "../types/protocol";
14
+ import { Header, Message } from "../types/types";
15
+ import _m0 from "protobufjs/minimal";
16
+
17
+ export function streamEncoder(): stream.Transform {
18
+ return new stream.Transform({
19
+ writableObjectMode: true,
20
+ objectMode: true,
21
+
22
+ transform(msg, _encoding, cb) {
23
+ // We do not catch errors here because we want them to be handled at the Connection level,
24
+ // so we can close the state machine.
25
+ const result = encodeMessage(msg);
26
+ cb(null, result);
27
+ },
28
+ });
29
+ }
30
+
31
+ export function encodeMessage(msg: Message): Uint8Array {
32
+ return encodeMessages([msg]);
33
+ }
34
+
35
+ export function encodeMessages(messages: Message[]): Uint8Array {
36
+ const offsets = [];
37
+ const headers = [];
38
+ let off = 0;
39
+
40
+ const writer = _m0.Writer.create();
41
+ for (const message of messages) {
42
+ const pbType = PROTOBUF_MESSAGE_BY_TYPE.get(BigInt(message.messageType));
43
+ if (pbType === undefined) {
44
+ throw new Error(
45
+ "Trying to encode a message with unknown message type " +
46
+ message.messageType
47
+ );
48
+ }
49
+ offsets.push(off);
50
+ writer.fixed64(0);
51
+ pbType.encode(message.message, writer);
52
+ const messageLen = writer.len - 8 - off;
53
+ off = writer.len;
54
+
55
+ const header = new Header(
56
+ BigInt(message.messageType),
57
+ messageLen,
58
+ message.completed,
59
+ message.protocolVersion, // only set for incoming start message
60
+ message.requiresAck
61
+ );
62
+ const header64 = header.toU64be();
63
+ headers.push(header64);
64
+ }
65
+ const buffer = writer.finish() as Buffer;
66
+ for (let i = 0; i < offsets.length; i++) {
67
+ const offset = offsets[i];
68
+ const header = headers[i];
69
+ buffer.writeBigUInt64BE(header, offset);
70
+ }
71
+ return buffer;
72
+ }