@superblocksteam/sdk 1.14.2 → 1.99.99-next.2

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 (155) hide show
  1. package/.mocharc.json +7 -0
  2. package/.prettierrc +18 -0
  3. package/dist/cli-replacement/automatic-upgrades.d.ts +4 -0
  4. package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -0
  5. package/dist/cli-replacement/automatic-upgrades.js +246 -0
  6. package/dist/cli-replacement/automatic-upgrades.js.map +1 -0
  7. package/dist/cli-replacement/dev.d.mts +14 -0
  8. package/dist/cli-replacement/dev.d.mts.map +1 -0
  9. package/dist/cli-replacement/dev.mjs +195 -0
  10. package/dist/cli-replacement/dev.mjs.map +1 -0
  11. package/dist/cli-replacement/init.d.ts +14 -0
  12. package/dist/cli-replacement/init.d.ts.map +1 -0
  13. package/dist/cli-replacement/init.js +26 -0
  14. package/dist/cli-replacement/init.js.map +1 -0
  15. package/dist/client.d.ts +31 -17
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +137 -155
  18. package/dist/client.js.map +1 -0
  19. package/dist/dbfs/client.d.ts +6 -0
  20. package/dist/dbfs/client.d.ts.map +1 -0
  21. package/dist/dbfs/client.js +117 -0
  22. package/dist/dbfs/client.js.map +1 -0
  23. package/dist/dbfs/local.d.ts +15 -0
  24. package/dist/dbfs/local.d.ts.map +1 -0
  25. package/dist/dbfs/local.js +126 -0
  26. package/dist/dbfs/local.js.map +1 -0
  27. package/dist/dev-utils/custom-build.d.mts +4 -0
  28. package/dist/dev-utils/custom-build.d.mts.map +1 -0
  29. package/dist/dev-utils/custom-build.mjs +99 -0
  30. package/dist/dev-utils/custom-build.mjs.map +1 -0
  31. package/dist/dev-utils/custom-config.d.mts +2 -0
  32. package/dist/dev-utils/custom-config.d.mts.map +1 -0
  33. package/dist/dev-utils/custom-config.mjs +57 -0
  34. package/dist/dev-utils/custom-config.mjs.map +1 -0
  35. package/dist/dev-utils/dev-logger.d.mts +8 -0
  36. package/dist/dev-utils/dev-logger.d.mts.map +1 -0
  37. package/dist/dev-utils/dev-logger.mjs +25 -0
  38. package/dist/dev-utils/dev-logger.mjs.map +1 -0
  39. package/dist/dev-utils/dev-server.d.mts +18 -0
  40. package/dist/dev-utils/dev-server.d.mts.map +1 -0
  41. package/dist/dev-utils/dev-server.mjs +283 -0
  42. package/dist/dev-utils/dev-server.mjs.map +1 -0
  43. package/dist/dev-utils/dev-tracer.d.ts +3 -0
  44. package/dist/dev-utils/dev-tracer.d.ts.map +1 -0
  45. package/dist/dev-utils/dev-tracer.js +38 -0
  46. package/dist/dev-utils/dev-tracer.js.map +1 -0
  47. package/dist/dev-utils/vite-plugin-dd-rum.d.mts +10 -0
  48. package/dist/dev-utils/vite-plugin-dd-rum.d.mts.map +1 -0
  49. package/dist/dev-utils/vite-plugin-dd-rum.mjs +34 -0
  50. package/dist/dev-utils/vite-plugin-dd-rum.mjs.map +1 -0
  51. package/dist/dev-utils/vite-plugin-react-transform.d.mts +7 -0
  52. package/dist/dev-utils/vite-plugin-react-transform.d.mts.map +1 -0
  53. package/dist/dev-utils/vite-plugin-react-transform.mjs +110 -0
  54. package/dist/dev-utils/vite-plugin-react-transform.mjs.map +1 -0
  55. package/dist/dev-utils/vite-plugin-sb-cdn.d.mts +34 -0
  56. package/dist/dev-utils/vite-plugin-sb-cdn.d.mts.map +1 -0
  57. package/dist/dev-utils/vite-plugin-sb-cdn.mjs +720 -0
  58. package/dist/dev-utils/vite-plugin-sb-cdn.mjs.map +1 -0
  59. package/dist/errors.d.ts +1 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +4 -9
  62. package/dist/errors.js.map +1 -0
  63. package/dist/flag.d.ts +2 -2
  64. package/dist/flag.d.ts.map +1 -0
  65. package/dist/flag.js +5 -9
  66. package/dist/flag.js.map +1 -0
  67. package/dist/index.d.ts +10 -4
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +10 -20
  70. package/dist/index.js.map +1 -0
  71. package/dist/sdk.d.ts +42 -18
  72. package/dist/sdk.d.ts.map +1 -0
  73. package/dist/sdk.js +47 -43
  74. package/dist/sdk.js.map +1 -0
  75. package/dist/socket/handlers.d.ts +3 -128
  76. package/dist/socket/handlers.d.ts.map +1 -0
  77. package/dist/socket/handlers.js +7 -9
  78. package/dist/socket/handlers.js.map +1 -0
  79. package/dist/socket/index.d.ts +4 -3
  80. package/dist/socket/index.d.ts.map +1 -0
  81. package/dist/socket/index.js +12 -21
  82. package/dist/socket/index.js.map +1 -0
  83. package/dist/socket/signing.d.ts +3 -1
  84. package/dist/socket/signing.d.ts.map +1 -0
  85. package/dist/socket/signing.js +8 -17
  86. package/dist/socket/signing.js.map +1 -0
  87. package/dist/types/common.d.ts +8 -103
  88. package/dist/types/common.d.ts.map +1 -0
  89. package/dist/types/common.js +8 -24
  90. package/dist/types/common.js.map +1 -0
  91. package/dist/types/index.d.ts +5 -4
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/index.js +5 -20
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/types/plugin.d.ts +1 -0
  96. package/dist/types/plugin.d.ts.map +1 -0
  97. package/dist/types/plugin.js +3 -5
  98. package/dist/types/plugin.js.map +1 -0
  99. package/dist/types/signing.d.ts +2 -1
  100. package/dist/types/signing.d.ts.map +1 -0
  101. package/dist/types/signing.js +2 -2
  102. package/dist/types/signing.js.map +1 -0
  103. package/dist/types/socket.d.ts +1 -0
  104. package/dist/types/socket.d.ts.map +1 -0
  105. package/dist/types/socket.js +2 -5
  106. package/dist/types/socket.js.map +1 -0
  107. package/dist/utils.d.ts +3 -1
  108. package/dist/utils.d.ts.map +1 -0
  109. package/dist/utils.js +14 -23
  110. package/dist/utils.js.map +1 -0
  111. package/dist/version-control.d.mts +59 -0
  112. package/dist/version-control.d.mts.map +1 -0
  113. package/dist/version-control.mjs +899 -0
  114. package/dist/version-control.mjs.map +1 -0
  115. package/eslint.config.js +85 -0
  116. package/package.json +85 -30
  117. package/src/cli-replacement/automatic-upgrades.ts +335 -0
  118. package/src/cli-replacement/dev.mts +276 -0
  119. package/src/cli-replacement/init.ts +47 -0
  120. package/src/client.ts +114 -38
  121. package/src/dbfs/client.ts +162 -0
  122. package/src/dbfs/local.ts +163 -0
  123. package/src/dev-utils/custom-build.mts +113 -0
  124. package/src/dev-utils/custom-config.mts +66 -0
  125. package/src/dev-utils/dev-logger.mts +39 -0
  126. package/src/dev-utils/dev-server.mts +371 -0
  127. package/src/dev-utils/dev-tracer.ts +42 -0
  128. package/src/dev-utils/vite-plugin-dd-rum.mts +47 -0
  129. package/src/dev-utils/vite-plugin-react-transform.mts +130 -0
  130. package/src/dev-utils/vite-plugin-sb-cdn.mts +988 -0
  131. package/src/flag.ts +2 -3
  132. package/src/index.ts +120 -4
  133. package/src/sdk.ts +91 -17
  134. package/src/socket/handlers.ts +9 -147
  135. package/src/socket/index.ts +6 -9
  136. package/src/socket/signing.ts +7 -8
  137. package/src/types/common.ts +9 -119
  138. package/src/types/index.ts +4 -4
  139. package/src/types/signing.ts +1 -1
  140. package/src/types/socket.ts +1 -1
  141. package/src/utils.ts +5 -6
  142. package/src/version-control.mts +1351 -0
  143. package/test/dev-utils/fixture/index.html +12 -0
  144. package/test/dev-utils/fixture/main.jsx +22 -0
  145. package/test/dev-utils/fixture/package-lock.json +25 -0
  146. package/test/dev-utils/fixture/package.json +9 -0
  147. package/test/dev-utils/vite-plugin-sb-cdn.test.mts +74 -0
  148. package/test/tsconfig.json +9 -0
  149. package/test/version-control.test.mts +1412 -0
  150. package/tsconfig.json +15 -4
  151. package/tsconfig.tsbuildinfo +1 -1
  152. package/.eslintrc.json +0 -55
  153. package/dist/socket/socket.d.ts +0 -60
  154. package/dist/socket/socket.js +0 -261
  155. package/src/socket/socket.ts +0 -400
@@ -1,400 +0,0 @@
1
- import WebSocket from "ws";
2
- import {
3
- ISocketClient,
4
- MethodHandler,
5
- MethodHandlers,
6
- RequestContextBase,
7
- SocketTimeouts,
8
- SocketErrorException,
9
- GenericMiddleware,
10
- NonEmptyArray,
11
- } from "../types";
12
-
13
- interface SocketRequest<Payload = unknown> {
14
- method: string;
15
- payload: Payload;
16
- id: number;
17
- setAuthorization?: string;
18
- }
19
-
20
- interface SocketResponse<Payload = unknown> {
21
- id: number;
22
- payload: Payload;
23
- error: SocketError | null;
24
- }
25
-
26
- export interface SocketMessage<
27
- RequestPayload = unknown,
28
- ResponsePayload = unknown,
29
- > {
30
- request?: SocketRequest<RequestPayload>;
31
- response?: SocketResponse<ResponsePayload>;
32
- }
33
-
34
- export interface SocketError {
35
- message: string;
36
- code: number;
37
- }
38
-
39
- /**
40
- * ISocket is a class that wraps a WebSocket connection and provides a simple interface for sending and receiving messages.
41
- * ISocket is initialized by both server and client and request/response is called symmetrically.
42
- *
43
- * ISocket handles has two timeout actions:
44
- * 1. Connection timeout: If the connection is not closed after a certain time, the connection is closed.
45
- * - This is useful to prevent a connection from being open indefinitely. This is mainly used in the server side since
46
- * the client side manages connection lifecycle manually.
47
- * 2. No response timeout: If the response is not received after a certain time, the request is timed out.
48
- * - This is mainly used by CLI to handle the case where the server is not responding.
49
- *
50
- * It is expected that timeouts should be relatively sorted in the order of connection timeout > request timeout > no response timeout.
51
- */
52
- export class ISocket<
53
- ImplementedMethods,
54
- CallableMethods,
55
- RequestContext extends RequestContextBase,
56
- > {
57
- private readonly ws: WebSocket;
58
- private readonly requestHandlers: MethodHandlers<
59
- ImplementedMethods,
60
- CallableMethods,
61
- RequestContext
62
- >;
63
- private readonly globalMiddlewares: GenericMiddleware<
64
- CallableMethods,
65
- RequestContext
66
- >[];
67
- private readonly responseHandler = new Map<
68
- number,
69
- {
70
- resolve: (data: unknown) => void;
71
- reject: (error: SocketError) => void;
72
- timeout?: NodeJS.Timeout;
73
- }
74
- >();
75
- private peerAuthorization?: string;
76
- protected nxtRequestId: number;
77
- private connectionTimeout?: NodeJS.Timeout;
78
- // pino library not available in shared
79
- private logger: { error: (message?: string) => void };
80
- private timeouts?: SocketTimeouts;
81
-
82
- constructor(
83
- ws: WebSocket,
84
- requestHandlers: MethodHandlers<
85
- ImplementedMethods,
86
- CallableMethods,
87
- RequestContext
88
- >,
89
- globalMiddlewares: GenericMiddleware<CallableMethods, RequestContext>[],
90
- timeouts?: SocketTimeouts,
91
- logger?: { error: (message?: string) => void },
92
- ) {
93
- this.ws = ws;
94
- this.requestHandlers = requestHandlers;
95
- this.globalMiddlewares = globalMiddlewares;
96
- this.nxtRequestId = 0;
97
- this.logger = logger ?? { error: console.error };
98
- this.timeouts = timeouts;
99
- // reset connection timeout in each message received. It means connection still active
100
- this.resetConnectionTimeout();
101
-
102
- this.ws.addEventListener(
103
- "message",
104
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
105
- async (event: WebSocket.MessageEvent) => {
106
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
107
- const eventData: SocketMessage = JSON.parse(event.data.toString());
108
- return this.handleMessage(eventData);
109
- },
110
- );
111
- }
112
-
113
- protected async handleMessage(message: SocketMessage): Promise<void> {
114
- this.resetConnectionTimeout();
115
- if (message.request) {
116
- // Split the method string into parts
117
- const parts = message.request.method.split(".");
118
- let handlers = this.requestHandlers as Record<string, unknown>;
119
- for (const part of parts) {
120
- handlers = handlers[part] as Record<string, unknown>;
121
- if (!handlers) {
122
- return this.respondError(message.request.id, {
123
- code: 2,
124
- message: `unknown method ${message.request.method}`,
125
- });
126
- }
127
- }
128
-
129
- if (!Array.isArray(handlers)) {
130
- return this.respondError(message.request.id, {
131
- code: 2,
132
- message: "unknown method",
133
- });
134
- }
135
- handlers = [...this.globalMiddlewares, ...handlers] as MethodHandlers<
136
- ImplementedMethods,
137
- CallableMethods,
138
- RequestContext
139
- >;
140
- if (message.request.setAuthorization) {
141
- this.peerAuthorization = message.request.setAuthorization;
142
- }
143
- const reqCtx = {
144
- peerAuthorization: this.peerAuthorization,
145
- method: message.request.method,
146
- requestId: message.request.id,
147
- } as RequestContext;
148
- const client = createISocketClient(this);
149
- const payload = message.request.payload;
150
- let alreadyResponded = false;
151
- const generateNextFn = (idx: number): (() => Promise<unknown>) => {
152
- let wasCalled = false;
153
- return async () => {
154
- if (alreadyResponded) {
155
- throw new SocketErrorException(
156
- 4,
157
- "next() was called after the response was sent",
158
- );
159
- }
160
- const handler = (
161
- handlers as unknown as NonEmptyArray<
162
- MethodHandler<unknown, unknown, CallableMethods, RequestContext>
163
- >
164
- )[idx];
165
- if (!handler) {
166
- throw new SocketErrorException(
167
- 5,
168
- "cannot call past the last handler in the chain",
169
- );
170
- }
171
- if (wasCalled) {
172
- throw new SocketErrorException(
173
- 6,
174
- "next() was called multiple times",
175
- );
176
- }
177
- wasCalled = true;
178
- return this.callHandler(
179
- handler,
180
- payload,
181
- reqCtx,
182
- client,
183
- generateNextFn(idx + 1),
184
- );
185
- };
186
- };
187
- let response: unknown;
188
- try {
189
- // call the first handler in the chain
190
- response = await generateNextFn(0)();
191
- } catch (error) {
192
- const socketError =
193
- error instanceof SocketErrorException
194
- ? { code: error.code, message: error.message }
195
- : { code: 3, message: (error as Error).toString() };
196
- return this.respondError(message.request.id, socketError);
197
- }
198
- this.respond(message.request.id, response);
199
- alreadyResponded = true;
200
- } else if (message.response && message.response.id) {
201
- const responseHandler = this.responseHandler.get(message.response.id);
202
- if (!responseHandler) {
203
- return;
204
- }
205
- if (message.response.error) {
206
- responseHandler.reject(message.response.error);
207
- }
208
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
- responseHandler.resolve(message.response.payload as any);
210
- clearTimeout(responseHandler.timeout);
211
- this.responseHandler.delete(message.response.id);
212
- } else {
213
- return this.respondError(-1, {
214
- code: 3,
215
- message: "unknown request id",
216
- });
217
- }
218
- }
219
-
220
- protected async callHandler<
221
- Params,
222
- Result,
223
- CallableMethods,
224
- RequestContext extends RequestContextBase,
225
- >(
226
- handler: MethodHandler<Params, Result, CallableMethods, RequestContext>,
227
- params: Params,
228
- ctx: RequestContext,
229
- client: ISocketClient<CallableMethods>,
230
- next: () => Promise<Result>,
231
- ): Promise<Result> {
232
- return handler(params, ctx, client, next);
233
- }
234
-
235
- public request<Params, Result>(
236
- method: string,
237
- params: Params,
238
- authorization?: string,
239
- ): Promise<Result> {
240
- return new Promise<Result>((resolve, reject) => {
241
- const requestId = ++this.nxtRequestId;
242
- this.responseHandler.set(requestId, {
243
- resolve: (result) => resolve(result as Result),
244
- // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
245
- reject: (error: SocketError) => reject(error),
246
- });
247
- const toSend: SocketMessage = {
248
- request: {
249
- method,
250
- payload: params,
251
- id: requestId,
252
- setAuthorization: authorization,
253
- },
254
- };
255
- this.ws.send(JSON.stringify(toSend));
256
- this.resetNoResponseTimeout(requestId);
257
- });
258
- }
259
-
260
- protected respond<Result>(requestId: number, result: Result): void {
261
- const toSend: SocketMessage = {
262
- response: {
263
- payload: result,
264
- id: requestId,
265
- error: null,
266
- },
267
- };
268
- return this.ws.send(JSON.stringify(toSend));
269
- }
270
-
271
- protected respondError(requestId: number, error: SocketError): void {
272
- const toSend: SocketMessage = {
273
- response: {
274
- payload: null,
275
- id: requestId,
276
- error: error,
277
- },
278
- };
279
- return this.ws.send(JSON.stringify(toSend));
280
- }
281
-
282
- private resetConnectionTimeout(): void {
283
- if (!this.timeouts?.connectionTimeoutInSeconds) {
284
- return;
285
- }
286
- if (this.connectionTimeout) {
287
- clearTimeout(this.connectionTimeout);
288
- }
289
- // Set a new timeout for the next message
290
- this.connectionTimeout = setTimeout(
291
- this.handleConnectionTimeout(),
292
- this.timeouts?.connectionTimeoutInSeconds * 1000,
293
- );
294
- }
295
-
296
- private handleConnectionTimeout() {
297
- return () => {
298
- this.logger.error(
299
- `Connection timed out after ${this.timeouts?.connectionTimeoutInSeconds} seconds`,
300
- );
301
- this.close();
302
- };
303
- }
304
-
305
- private resetNoResponseTimeout(requestId: number): void {
306
- if (!this.timeouts?.noResponseTimeoutInSeconds) {
307
- return;
308
- }
309
- const responseHandler = this.responseHandler.get(requestId);
310
- if (!responseHandler) {
311
- return;
312
- }
313
- const noResponseTimeout = responseHandler.timeout;
314
- const reject = responseHandler.reject;
315
- if (responseHandler.timeout) {
316
- clearTimeout(noResponseTimeout);
317
- }
318
- // Set a new timeout for the next message
319
- responseHandler.timeout = setTimeout(
320
- this.handleNoResponseTimeout(reject),
321
- this.timeouts?.noResponseTimeoutInSeconds * 1000,
322
- );
323
- }
324
-
325
- private handleNoResponseTimeout(reject: (error: SocketError) => void) {
326
- return () => {
327
- const message = `Request timed out after ${this.timeouts?.noResponseTimeoutInSeconds} seconds`;
328
- this.logger.error(message);
329
- reject({ code: 7, message });
330
- };
331
- }
332
-
333
- public close(): void {
334
- clearTimeout(this.connectionTimeout);
335
- this.responseHandler.forEach((handler, key) => {
336
- clearTimeout(handler.timeout);
337
- this.logger.error(
338
- `Rejecting pending requestId ${key} due to connection close`,
339
- );
340
- handler.reject({ code: 8, message: "Connection closed" });
341
- });
342
- this.ws.close();
343
- }
344
- }
345
-
346
- const proxyTarget = Object.freeze(() => {
347
- /* return nothing */
348
- });
349
-
350
- function createIsocketProxy<
351
- ImplementedMethods,
352
- CallableMethods,
353
- RequestContext extends RequestContextBase,
354
- >(
355
- socket: ISocket<ImplementedMethods, CallableMethods, RequestContext>,
356
- // if path is undefined, it means the current object is the root object
357
- path: string | undefined,
358
- ): unknown {
359
- return new Proxy(proxyTarget, {
360
- get(_target, prop: string) {
361
- const childPath = path ? `${path}.${prop}` : prop;
362
- // sometimes, when `createISocketClient` is called from an async function, JS will implicitly call the `then` method on
363
- // its return value, because promises can be arbitrarily nested
364
- // so return undefined for the `then` method to avoid this
365
- if (childPath === "then") {
366
- return undefined;
367
- }
368
- return createIsocketProxy(socket, childPath);
369
- },
370
-
371
- apply(_target, _thisArg, args: unknown[]) {
372
- if (path === undefined) {
373
- throw new Error("The root object is not callable");
374
- }
375
- if (
376
- path.endsWith(".apply") &&
377
- args.length === 2 &&
378
- Array.isArray(args[1])
379
- ) {
380
- path = path.slice(0, -".apply".length);
381
- args = args[1];
382
- }
383
- return socket.request(path, args[0]);
384
- },
385
- });
386
- }
387
-
388
- export function createISocketClient<
389
- CallableMethods,
390
- ImplementedMethods,
391
- RequestContext extends RequestContextBase,
392
- >(
393
- socket: ISocket<ImplementedMethods, CallableMethods, RequestContext>,
394
- ): ISocketClient<CallableMethods> {
395
- return {
396
- close: () => socket.close(),
397
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
398
- call: createIsocketProxy(socket, undefined) as any,
399
- };
400
- }