rivetkit 2.0.4 → 2.0.5
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.
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{chunk-HLLF4B4Q.js → chunk-2MD57QF4.js} +7 -5
- package/dist/tsup/chunk-2MD57QF4.js.map +1 -0
- package/dist/tsup/{chunk-SBHHJ6QS.cjs → chunk-5QGQK44L.cjs} +2 -2
- package/dist/tsup/{chunk-SBHHJ6QS.cjs.map → chunk-5QGQK44L.cjs.map} +1 -1
- package/dist/tsup/{chunk-4CXBCT26.cjs → chunk-5YTI25C3.cjs} +7 -7
- package/dist/tsup/{chunk-4CXBCT26.cjs.map → chunk-5YTI25C3.cjs.map} +1 -1
- package/dist/tsup/{chunk-TQ62L3X7.js → chunk-B2QGJGZQ.js} +18 -5
- package/dist/tsup/chunk-B2QGJGZQ.js.map +1 -0
- package/dist/tsup/{chunk-PQY7KKTL.js → chunk-CFFKMUYH.js} +32 -7
- package/dist/tsup/{chunk-PQY7KKTL.js.map → chunk-CFFKMUYH.js.map} +1 -1
- package/dist/tsup/{chunk-H26RP6GD.js → chunk-CKA54YQN.js} +2 -2
- package/dist/tsup/chunk-D7NWUCRK.cjs +20 -0
- package/dist/tsup/{chunk-4R73YDN3.cjs.map → chunk-D7NWUCRK.cjs.map} +1 -1
- package/dist/tsup/{chunk-IH6CKNDW.cjs → chunk-FGFT4FVX.cjs} +9 -9
- package/dist/tsup/{chunk-IH6CKNDW.cjs.map → chunk-FGFT4FVX.cjs.map} +1 -1
- package/dist/tsup/{chunk-HI3HWJRC.js → chunk-I5VTWPHW.js} +4 -4
- package/dist/tsup/{chunk-HI3HWJRC.js.map → chunk-I5VTWPHW.js.map} +1 -1
- package/dist/tsup/{chunk-GICQ3YCU.cjs → chunk-IRMBWX36.cjs} +39 -37
- package/dist/tsup/chunk-IRMBWX36.cjs.map +1 -0
- package/dist/tsup/{chunk-XJQHKJ4P.js → chunk-L7QRXNWP.js} +331 -62
- package/dist/tsup/chunk-L7QRXNWP.js.map +1 -0
- package/dist/tsup/{chunk-LWNKVZG5.cjs → chunk-LZIBTLEY.cjs} +12 -12
- package/dist/tsup/{chunk-LWNKVZG5.cjs.map → chunk-LZIBTLEY.cjs.map} +1 -1
- package/dist/tsup/{chunk-VO7ZRVVD.cjs → chunk-MRZS2J4X.cjs} +581 -312
- package/dist/tsup/chunk-MRZS2J4X.cjs.map +1 -0
- package/dist/tsup/{chunk-QK72M5JB.js → chunk-PG3K2LI7.js} +2 -2
- package/dist/tsup/{chunk-QNNXFOQV.cjs → chunk-PHSQJ6QI.cjs} +3 -3
- package/dist/tsup/{chunk-QNNXFOQV.cjs.map → chunk-PHSQJ6QI.cjs.map} +1 -1
- package/dist/tsup/{chunk-WHBPJNGW.cjs → chunk-RM2SVURR.cjs} +29 -16
- package/dist/tsup/chunk-RM2SVURR.cjs.map +1 -0
- package/dist/tsup/{chunk-6LJT3QRL.cjs → chunk-WADSS5X4.cjs} +37 -12
- package/dist/tsup/chunk-WADSS5X4.cjs.map +1 -0
- package/dist/tsup/{chunk-LV2S3OU3.js → chunk-WNGOBAA7.js} +2 -2
- package/dist/tsup/{chunk-NFU2BBT5.js → chunk-YPZFLUO6.js} +2 -2
- package/dist/tsup/chunk-YPZFLUO6.js.map +1 -0
- package/dist/tsup/{chunk-3F2YSRJL.js → chunk-YW6Y6VNE.js} +4 -4
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +4 -4
- package/dist/tsup/common/log.js +3 -3
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{connection-BI-6UIBJ.d.ts → connection-BvE-Oq7t.d.ts} +22 -11
- package/dist/tsup/{connection-Dyd4NLGW.d.cts → connection-DTzmWwU5.d.cts} +22 -11
- package/dist/tsup/driver-helpers/mod.cjs +6 -6
- package/dist/tsup/driver-helpers/mod.d.cts +2 -2
- package/dist/tsup/driver-helpers/mod.d.ts +2 -2
- package/dist/tsup/driver-helpers/mod.js +5 -5
- package/dist/tsup/driver-test-suite/mod.cjs +606 -140
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
- package/dist/tsup/driver-test-suite/mod.js +563 -97
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +9 -9
- package/dist/tsup/mod.d.cts +3 -3
- package/dist/tsup/mod.d.ts +3 -3
- package/dist/tsup/mod.js +8 -8
- package/dist/tsup/{router-endpoints-BTe_Rsdn.d.cts → router-endpoints-CctffZNL.d.cts} +1 -1
- package/dist/tsup/{router-endpoints-CBSrKHmo.d.ts → router-endpoints-DFm1BglJ.d.ts} +1 -1
- package/dist/tsup/test/mod.cjs +10 -10
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +9 -9
- package/dist/tsup/utils.cjs +5 -3
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +18 -1
- package/dist/tsup/utils.d.ts +18 -1
- package/dist/tsup/utils.js +4 -2
- package/package.json +4 -4
- package/src/actor/errors.ts +1 -1
- package/src/actor/router-endpoints.ts +6 -1
- package/src/actor/router.ts +2 -1
- package/src/client/mod.ts +1 -1
- package/src/client/raw-utils.ts +1 -1
- package/src/driver-test-suite/mod.ts +1 -1
- package/src/driver-test-suite/test-inline-client-driver.ts +588 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +4 -12
- package/src/driver-test-suite/tests/actor-inspector.ts +2 -1
- package/src/driver-test-suite/utils.ts +10 -9
- package/src/drivers/file-system/global-state.ts +3 -1
- package/src/drivers/file-system/manager.ts +16 -21
- package/src/manager/router.ts +373 -5
- package/src/registry/mod.ts +29 -33
- package/src/registry/run-config.ts +16 -1
- package/src/remote-manager-driver/actor-http-client.ts +3 -1
- package/src/remote-manager-driver/actor-websocket-client.ts +2 -1
- package/src/remote-manager-driver/api-utils.ts +4 -1
- package/src/remote-manager-driver/mod.ts +2 -1
- package/src/utils.ts +53 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +0 -20
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +0 -1
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +0 -1
- package/dist/tsup/chunk-HLLF4B4Q.js.map +0 -1
- package/dist/tsup/chunk-NFU2BBT5.js.map +0 -1
- package/dist/tsup/chunk-TQ62L3X7.js.map +0 -1
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +0 -1
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +0 -1
- package/dist/tsup/chunk-XJQHKJ4P.js.map +0 -1
- /package/dist/tsup/{chunk-H26RP6GD.js.map → chunk-CKA54YQN.js.map} +0 -0
- /package/dist/tsup/{chunk-QK72M5JB.js.map → chunk-PG3K2LI7.js.map} +0 -0
- /package/dist/tsup/{chunk-LV2S3OU3.js.map → chunk-WNGOBAA7.js.map} +0 -0
- /package/dist/tsup/{chunk-3F2YSRJL.js.map → chunk-YW6Y6VNE.js.map} +0 -0
|
@@ -1,33 +1,38 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getPort
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-YW6Y6VNE.js";
|
|
4
4
|
import {
|
|
5
5
|
createClient
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-I5VTWPHW.js";
|
|
7
7
|
import {
|
|
8
|
+
ActorError,
|
|
8
9
|
actor,
|
|
10
|
+
createClientWithDriver,
|
|
9
11
|
createManagerRouter
|
|
10
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-L7QRXNWP.js";
|
|
11
13
|
import {
|
|
12
14
|
createActorInspectorClient,
|
|
13
15
|
createManagerInspectorClient
|
|
14
|
-
} from "../chunk-
|
|
15
|
-
import
|
|
16
|
+
} from "../chunk-CKA54YQN.js";
|
|
17
|
+
import {
|
|
18
|
+
importWebSocket
|
|
19
|
+
} from "../chunk-PG3K2LI7.js";
|
|
16
20
|
import {
|
|
17
21
|
RunConfigSchema
|
|
18
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-B2QGJGZQ.js";
|
|
19
23
|
import {
|
|
24
|
+
HEADER_ACTOR_ID,
|
|
20
25
|
HEADER_ACTOR_QUERY,
|
|
21
26
|
assertUnreachable
|
|
22
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-2MD57QF4.js";
|
|
23
28
|
import {
|
|
24
29
|
getLogger
|
|
25
|
-
} from "../chunk-
|
|
26
|
-
import "../chunk-
|
|
30
|
+
} from "../chunk-WNGOBAA7.js";
|
|
31
|
+
import "../chunk-CFFKMUYH.js";
|
|
27
32
|
import {
|
|
28
33
|
INTERNAL_ERROR_CODE,
|
|
29
34
|
INTERNAL_ERROR_DESCRIPTION
|
|
30
|
-
} from "../chunk-
|
|
35
|
+
} from "../chunk-YPZFLUO6.js";
|
|
31
36
|
|
|
32
37
|
// src/driver-test-suite/mod.ts
|
|
33
38
|
import { serve as honoServe } from "@hono/node-server";
|
|
@@ -45,16 +50,479 @@ function logger() {
|
|
|
45
50
|
import { describe, expect, test } from "vitest";
|
|
46
51
|
|
|
47
52
|
// src/driver-test-suite/utils.ts
|
|
48
|
-
import { resolve } from "path";
|
|
49
53
|
import { vi } from "vitest";
|
|
54
|
+
|
|
55
|
+
// src/driver-test-suite/test-inline-client-driver.ts
|
|
56
|
+
import * as cbor from "cbor-x";
|
|
57
|
+
function createTestInlineClientDriver(endpoint, encoding, transport) {
|
|
58
|
+
return {
|
|
59
|
+
getForId(input) {
|
|
60
|
+
return makeInlineRequest(endpoint, encoding, transport, "getForId", [
|
|
61
|
+
input
|
|
62
|
+
]);
|
|
63
|
+
},
|
|
64
|
+
getWithKey(input) {
|
|
65
|
+
return makeInlineRequest(endpoint, encoding, transport, "getWithKey", [
|
|
66
|
+
input
|
|
67
|
+
]);
|
|
68
|
+
},
|
|
69
|
+
getOrCreateWithKey(input) {
|
|
70
|
+
return makeInlineRequest(
|
|
71
|
+
endpoint,
|
|
72
|
+
encoding,
|
|
73
|
+
transport,
|
|
74
|
+
"getOrCreateWithKey",
|
|
75
|
+
[input]
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
createActor(input) {
|
|
79
|
+
return makeInlineRequest(endpoint, encoding, transport, "createActor", [
|
|
80
|
+
input
|
|
81
|
+
]);
|
|
82
|
+
},
|
|
83
|
+
async sendRequest(actorId, actorRequest) {
|
|
84
|
+
var _a;
|
|
85
|
+
const oldUrl = new URL(actorRequest.url);
|
|
86
|
+
const normalizedPath = oldUrl.pathname.startsWith("/") ? oldUrl.pathname.slice(1) : oldUrl.pathname;
|
|
87
|
+
const pathWithQuery = normalizedPath + oldUrl.search;
|
|
88
|
+
logger().debug({
|
|
89
|
+
msg: "sending raw http request via test inline driver",
|
|
90
|
+
actorId,
|
|
91
|
+
encoding,
|
|
92
|
+
path: pathWithQuery
|
|
93
|
+
});
|
|
94
|
+
const url = `${endpoint}/.test/inline-driver/send-request/${pathWithQuery}`;
|
|
95
|
+
logger().debug({ msg: "rewriting http url", from: oldUrl, to: url });
|
|
96
|
+
const headers = new Headers(actorRequest.headers);
|
|
97
|
+
headers.set(HEADER_ACTOR_ID, actorId);
|
|
98
|
+
const response = await fetch(
|
|
99
|
+
new Request(url, {
|
|
100
|
+
method: actorRequest.method,
|
|
101
|
+
headers,
|
|
102
|
+
body: actorRequest.body,
|
|
103
|
+
signal: actorRequest.signal
|
|
104
|
+
})
|
|
105
|
+
);
|
|
106
|
+
if (!response.ok && ((_a = response.headers.get("content-type")) == null ? void 0 : _a.includes("application/json"))) {
|
|
107
|
+
try {
|
|
108
|
+
const clonedResponse = response.clone();
|
|
109
|
+
const errorData = await clonedResponse.json();
|
|
110
|
+
if (errorData.error) {
|
|
111
|
+
if (typeof errorData.error === "object") {
|
|
112
|
+
throw new ActorError(
|
|
113
|
+
errorData.error.code,
|
|
114
|
+
errorData.error.message,
|
|
115
|
+
errorData.error.metadata
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} catch (e) {
|
|
120
|
+
if (!(e instanceof ActorError)) {
|
|
121
|
+
return response;
|
|
122
|
+
}
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return response;
|
|
127
|
+
},
|
|
128
|
+
async openWebSocket(path, actorId, encoding2, params) {
|
|
129
|
+
const WebSocket2 = await importWebSocket();
|
|
130
|
+
const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
|
|
131
|
+
logger().debug({
|
|
132
|
+
msg: "creating websocket connection via test inline driver"
|
|
133
|
+
});
|
|
134
|
+
const wsUrl = new URL(
|
|
135
|
+
`${endpoint}/.test/inline-driver/connect-websocket/ws`
|
|
136
|
+
);
|
|
137
|
+
wsUrl.searchParams.set("path", normalizedPath);
|
|
138
|
+
wsUrl.searchParams.set("actorId", actorId);
|
|
139
|
+
if (params !== void 0)
|
|
140
|
+
wsUrl.searchParams.set("params", JSON.stringify(params));
|
|
141
|
+
wsUrl.searchParams.set("encodingKind", encoding2);
|
|
142
|
+
const wsProtocol = wsUrl.protocol === "https:" ? "wss:" : "ws:";
|
|
143
|
+
const finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;
|
|
144
|
+
logger().debug({ msg: "connecting to websocket", url: finalWsUrl });
|
|
145
|
+
const ws = new WebSocket2(finalWsUrl, [
|
|
146
|
+
// HACK: See packages/drivers/cloudflare-workers/src/websocket.ts
|
|
147
|
+
"rivetkit"
|
|
148
|
+
]);
|
|
149
|
+
return ws;
|
|
150
|
+
},
|
|
151
|
+
async proxyRequest(c, actorRequest, actorId) {
|
|
152
|
+
return await this.sendRequest(actorId, actorRequest);
|
|
153
|
+
},
|
|
154
|
+
proxyWebSocket(_c, _path, _actorId, _encoding, _params, _authData) {
|
|
155
|
+
throw "UNIMPLEMENTED";
|
|
156
|
+
},
|
|
157
|
+
displayInformation() {
|
|
158
|
+
return { name: "Test Inline", properties: {} };
|
|
159
|
+
}
|
|
160
|
+
// action: async <Args extends Array<unknown> = unknown[], Response = unknown>(
|
|
161
|
+
// _c: HonoContext | undefined,
|
|
162
|
+
// actorQuery: ActorQuery,
|
|
163
|
+
// encoding: Encoding,
|
|
164
|
+
// params: unknown,
|
|
165
|
+
// name: string,
|
|
166
|
+
// args: Args,
|
|
167
|
+
// ): Promise<Response> => {
|
|
168
|
+
// return makeInlineRequest<Response>(
|
|
169
|
+
// endpoint,
|
|
170
|
+
// encoding,
|
|
171
|
+
// transport,
|
|
172
|
+
// "action",
|
|
173
|
+
// [undefined, actorQuery, encoding, params, name, args],
|
|
174
|
+
// );
|
|
175
|
+
// },
|
|
176
|
+
//
|
|
177
|
+
// resolveActorId: async (
|
|
178
|
+
// _c: HonoContext | undefined,
|
|
179
|
+
// actorQuery: ActorQuery,
|
|
180
|
+
// encodingKind: Encoding,
|
|
181
|
+
// params: unknown,
|
|
182
|
+
// ): Promise<string> => {
|
|
183
|
+
// return makeInlineRequest<string>(
|
|
184
|
+
// endpoint,
|
|
185
|
+
// encodingKind,
|
|
186
|
+
// transport,
|
|
187
|
+
// "resolveActorId",
|
|
188
|
+
// [undefined, actorQuery, encodingKind, params],
|
|
189
|
+
// );
|
|
190
|
+
// },
|
|
191
|
+
//
|
|
192
|
+
// connectWebSocket: async (
|
|
193
|
+
// _c: HonoContext | undefined,
|
|
194
|
+
// actorQuery: ActorQuery,
|
|
195
|
+
// encodingKind: Encoding,
|
|
196
|
+
// params: unknown,
|
|
197
|
+
// ): Promise<WebSocket> => {
|
|
198
|
+
// const WebSocket = await importWebSocket();
|
|
199
|
+
//
|
|
200
|
+
// logger().debug({
|
|
201
|
+
// msg: "creating websocket connection via test inline driver",
|
|
202
|
+
// actorQuery,
|
|
203
|
+
// encodingKind,
|
|
204
|
+
// });
|
|
205
|
+
//
|
|
206
|
+
// // Create WebSocket connection to the test endpoint
|
|
207
|
+
// const wsUrl = new URL(
|
|
208
|
+
// `${endpoint}/registry/.test/inline-driver/connect-websocket`,
|
|
209
|
+
// );
|
|
210
|
+
// wsUrl.searchParams.set("actorQuery", JSON.stringify(actorQuery));
|
|
211
|
+
// if (params !== undefined)
|
|
212
|
+
// wsUrl.searchParams.set("params", JSON.stringify(params));
|
|
213
|
+
// wsUrl.searchParams.set("encodingKind", encodingKind);
|
|
214
|
+
//
|
|
215
|
+
// // Convert http/https to ws/wss
|
|
216
|
+
// const wsProtocol = wsUrl.protocol === "https:" ? "wss:" : "ws:";
|
|
217
|
+
// const finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;
|
|
218
|
+
//
|
|
219
|
+
// logger().debug({ msg: "connecting to websocket", url: finalWsUrl });
|
|
220
|
+
//
|
|
221
|
+
// // Create and return the WebSocket
|
|
222
|
+
// // Node & browser WebSocket types are incompatible
|
|
223
|
+
// const ws = new WebSocket(finalWsUrl, [
|
|
224
|
+
// // HACK: See packages/drivers/cloudflare-workers/src/websocket.ts
|
|
225
|
+
// "rivetkit",
|
|
226
|
+
// ]) as any;
|
|
227
|
+
//
|
|
228
|
+
// return ws;
|
|
229
|
+
// },
|
|
230
|
+
//
|
|
231
|
+
// connectSse: async (
|
|
232
|
+
// _c: HonoContext | undefined,
|
|
233
|
+
// actorQuery: ActorQuery,
|
|
234
|
+
// encodingKind: Encoding,
|
|
235
|
+
// params: unknown,
|
|
236
|
+
// ): Promise<UniversalEventSource> => {
|
|
237
|
+
// logger().debug({
|
|
238
|
+
// msg: "creating sse connection via test inline driver",
|
|
239
|
+
// actorQuery,
|
|
240
|
+
// encodingKind,
|
|
241
|
+
// params,
|
|
242
|
+
// });
|
|
243
|
+
//
|
|
244
|
+
// // Dynamically import EventSource if needed
|
|
245
|
+
// const EventSourceImport = await import("eventsource");
|
|
246
|
+
// // Handle both ES modules (default) and CommonJS export patterns
|
|
247
|
+
// const EventSourceConstructor =
|
|
248
|
+
// (EventSourceImport as any).default || EventSourceImport;
|
|
249
|
+
//
|
|
250
|
+
// // Encode parameters for the URL
|
|
251
|
+
// const actorQueryParam = encodeURIComponent(JSON.stringify(actorQuery));
|
|
252
|
+
// const encodingParam = encodeURIComponent(encodingKind);
|
|
253
|
+
// const paramsParam = params
|
|
254
|
+
// ? encodeURIComponent(JSON.stringify(params))
|
|
255
|
+
// : null;
|
|
256
|
+
//
|
|
257
|
+
// // Create SSE connection URL
|
|
258
|
+
// const sseUrl = new URL(
|
|
259
|
+
// `${endpoint}/registry/.test/inline-driver/connect-sse`,
|
|
260
|
+
// );
|
|
261
|
+
// sseUrl.searchParams.set("actorQueryRaw", actorQueryParam);
|
|
262
|
+
// sseUrl.searchParams.set("encodingKind", encodingParam);
|
|
263
|
+
// if (paramsParam) {
|
|
264
|
+
// sseUrl.searchParams.set("params", paramsParam);
|
|
265
|
+
// }
|
|
266
|
+
//
|
|
267
|
+
// logger().debug({ msg: "connecting to sse", url: sseUrl.toString() });
|
|
268
|
+
//
|
|
269
|
+
// // Create and return the EventSource
|
|
270
|
+
// const eventSource = new EventSourceConstructor(sseUrl.toString());
|
|
271
|
+
//
|
|
272
|
+
// // Wait for the connection to be established before returning
|
|
273
|
+
// await new Promise<void>((resolve, reject) => {
|
|
274
|
+
// eventSource.onopen = () => {
|
|
275
|
+
// logger().debug({ msg: "sse connection established" });
|
|
276
|
+
// resolve();
|
|
277
|
+
// };
|
|
278
|
+
//
|
|
279
|
+
// eventSource.onerror = (event: Event) => {
|
|
280
|
+
// logger().error({ msg: "sse connection failed", event });
|
|
281
|
+
// reject(new Error("Failed to establish SSE connection"));
|
|
282
|
+
// };
|
|
283
|
+
//
|
|
284
|
+
// // Set a timeout in case the connection never establishes
|
|
285
|
+
// setTimeout(() => {
|
|
286
|
+
// if (eventSource.readyState !== EventSourceConstructor.OPEN) {
|
|
287
|
+
// reject(new Error("SSE connection timed out"));
|
|
288
|
+
// }
|
|
289
|
+
// }, 10000); // 10 second timeout
|
|
290
|
+
// });
|
|
291
|
+
//
|
|
292
|
+
// return eventSource as UniversalEventSource;
|
|
293
|
+
// },
|
|
294
|
+
//
|
|
295
|
+
// sendHttpMessage: async (
|
|
296
|
+
// _c: HonoContext | undefined,
|
|
297
|
+
// actorId: string,
|
|
298
|
+
// encoding: Encoding,
|
|
299
|
+
// connectionId: string,
|
|
300
|
+
// connectionToken: string,
|
|
301
|
+
// message: protocol.ToServer,
|
|
302
|
+
// ): Promise<void> => {
|
|
303
|
+
// logger().debug({
|
|
304
|
+
// msg: "sending http message via test inline driver",
|
|
305
|
+
// actorId,
|
|
306
|
+
// encoding,
|
|
307
|
+
// connectionId,
|
|
308
|
+
// transport,
|
|
309
|
+
// });
|
|
310
|
+
//
|
|
311
|
+
// const result = await fetch(
|
|
312
|
+
// `${endpoint}/registry/.test/inline-driver/call`,
|
|
313
|
+
// {
|
|
314
|
+
// method: "POST",
|
|
315
|
+
// headers: {
|
|
316
|
+
// "Content-Type": "application/json",
|
|
317
|
+
// },
|
|
318
|
+
// body: JSON.stringify({
|
|
319
|
+
// encoding,
|
|
320
|
+
// transport,
|
|
321
|
+
// method: "sendHttpMessage",
|
|
322
|
+
// args: [
|
|
323
|
+
// undefined,
|
|
324
|
+
// actorId,
|
|
325
|
+
// encoding,
|
|
326
|
+
// connectionId,
|
|
327
|
+
// connectionToken,
|
|
328
|
+
// message,
|
|
329
|
+
// ],
|
|
330
|
+
// } satisfies TestInlineDriverCallRequest),
|
|
331
|
+
// },
|
|
332
|
+
// );
|
|
333
|
+
//
|
|
334
|
+
// if (!result.ok) {
|
|
335
|
+
// throw new Error(`Failed to send HTTP message: ${result.statusText}`);
|
|
336
|
+
// }
|
|
337
|
+
//
|
|
338
|
+
// // Discard response
|
|
339
|
+
// await result.body?.cancel();
|
|
340
|
+
// },
|
|
341
|
+
//
|
|
342
|
+
// rawHttpRequest: async (
|
|
343
|
+
// _c: HonoContext | undefined,
|
|
344
|
+
// actorQuery: ActorQuery,
|
|
345
|
+
// encoding: Encoding,
|
|
346
|
+
// params: unknown,
|
|
347
|
+
// path: string,
|
|
348
|
+
// init: RequestInit,
|
|
349
|
+
// ): Promise<Response> => {
|
|
350
|
+
// // Normalize path to match other drivers
|
|
351
|
+
// const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
|
|
352
|
+
//
|
|
353
|
+
// logger().debug({
|
|
354
|
+
// msg: "sending raw http request via test inline driver",
|
|
355
|
+
// actorQuery,
|
|
356
|
+
// encoding,
|
|
357
|
+
// path: normalizedPath,
|
|
358
|
+
// });
|
|
359
|
+
//
|
|
360
|
+
// // Use the dedicated raw HTTP endpoint
|
|
361
|
+
// const url = `${endpoint}/registry/.test/inline-driver/raw-http/${normalizedPath}`;
|
|
362
|
+
//
|
|
363
|
+
// logger().debug({ msg: "rewriting http url", from: path, to: url });
|
|
364
|
+
//
|
|
365
|
+
// // Merge headers with our metadata
|
|
366
|
+
// const headers = new Headers(init.headers);
|
|
367
|
+
// headers.set(HEADER_ACTOR_QUERY, JSON.stringify(actorQuery));
|
|
368
|
+
// headers.set(HEADER_ENCODING, encoding);
|
|
369
|
+
// if (params !== undefined) {
|
|
370
|
+
// headers.set(HEADER_CONN_PARAMS, JSON.stringify(params));
|
|
371
|
+
// }
|
|
372
|
+
//
|
|
373
|
+
// // Forward the request directly
|
|
374
|
+
// const response = await fetch(url, {
|
|
375
|
+
// ...init,
|
|
376
|
+
// headers,
|
|
377
|
+
// });
|
|
378
|
+
//
|
|
379
|
+
// // Check if it's an error response from our handler
|
|
380
|
+
// if (
|
|
381
|
+
// !response.ok &&
|
|
382
|
+
// response.headers.get("content-type")?.includes("application/json")
|
|
383
|
+
// ) {
|
|
384
|
+
// try {
|
|
385
|
+
// // Clone the response to avoid consuming the body
|
|
386
|
+
// const clonedResponse = response.clone();
|
|
387
|
+
// const errorData = (await clonedResponse.json()) as any;
|
|
388
|
+
// if (errorData.error) {
|
|
389
|
+
// // Handle both error formats:
|
|
390
|
+
// // 1. { error: { code, message, metadata } } - structured format
|
|
391
|
+
// // 2. { error: "message" } - simple string format (from custom onFetch handlers)
|
|
392
|
+
// if (typeof errorData.error === "object") {
|
|
393
|
+
// throw new ClientActorError(
|
|
394
|
+
// errorData.error.code,
|
|
395
|
+
// errorData.error.message,
|
|
396
|
+
// errorData.error.metadata,
|
|
397
|
+
// );
|
|
398
|
+
// }
|
|
399
|
+
// // For simple string errors, just return the response as-is
|
|
400
|
+
// // This allows custom onFetch handlers to return their own error formats
|
|
401
|
+
// }
|
|
402
|
+
// } catch (e) {
|
|
403
|
+
// // If it's not our error format, just return the response as-is
|
|
404
|
+
// if (!(e instanceof ClientActorError)) {
|
|
405
|
+
// return response;
|
|
406
|
+
// }
|
|
407
|
+
// throw e;
|
|
408
|
+
// }
|
|
409
|
+
// }
|
|
410
|
+
//
|
|
411
|
+
// return response;
|
|
412
|
+
// },
|
|
413
|
+
//
|
|
414
|
+
// rawWebSocket: async (
|
|
415
|
+
// _c: HonoContext | undefined,
|
|
416
|
+
// actorQuery: ActorQuery,
|
|
417
|
+
// encoding: Encoding,
|
|
418
|
+
// params: unknown,
|
|
419
|
+
// path: string,
|
|
420
|
+
// protocols: string | string[] | undefined,
|
|
421
|
+
// ): Promise<WebSocket> => {
|
|
422
|
+
// logger().debug({ msg: "test inline driver rawWebSocket called" });
|
|
423
|
+
// const WebSocket = await importWebSocket();
|
|
424
|
+
//
|
|
425
|
+
// // Normalize path to match other drivers
|
|
426
|
+
// const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
|
|
427
|
+
//
|
|
428
|
+
// logger().debug({
|
|
429
|
+
// msg: "creating raw websocket connection via test inline driver",
|
|
430
|
+
// actorQuery,
|
|
431
|
+
// encoding,
|
|
432
|
+
// path: normalizedPath,
|
|
433
|
+
// protocols,
|
|
434
|
+
// });
|
|
435
|
+
//
|
|
436
|
+
// // Create WebSocket connection to the test endpoint
|
|
437
|
+
// const wsUrl = new URL(
|
|
438
|
+
// `${endpoint}/registry/.test/inline-driver/raw-websocket`,
|
|
439
|
+
// );
|
|
440
|
+
// wsUrl.searchParams.set("actorQuery", JSON.stringify(actorQuery));
|
|
441
|
+
// if (params !== undefined)
|
|
442
|
+
// wsUrl.searchParams.set("params", JSON.stringify(params));
|
|
443
|
+
// wsUrl.searchParams.set("encodingKind", encoding);
|
|
444
|
+
// wsUrl.searchParams.set("path", normalizedPath);
|
|
445
|
+
// if (protocols !== undefined)
|
|
446
|
+
// wsUrl.searchParams.set("protocols", JSON.stringify(protocols));
|
|
447
|
+
//
|
|
448
|
+
// // Convert http/https to ws/wss
|
|
449
|
+
// const wsProtocol = wsUrl.protocol === "https:" ? "wss:" : "ws:";
|
|
450
|
+
// const finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;
|
|
451
|
+
//
|
|
452
|
+
// logger().debug({ msg: "connecting to raw websocket", url: finalWsUrl });
|
|
453
|
+
//
|
|
454
|
+
// logger().debug({
|
|
455
|
+
// msg: "rewriting websocket url",
|
|
456
|
+
// from: path,
|
|
457
|
+
// to: finalWsUrl,
|
|
458
|
+
// });
|
|
459
|
+
//
|
|
460
|
+
// // Create and return the WebSocket
|
|
461
|
+
// // Node & browser WebSocket types are incompatible
|
|
462
|
+
// const ws = new WebSocket(finalWsUrl, [
|
|
463
|
+
// // HACK: See packages/drivers/cloudflare-workers/src/websocket.ts
|
|
464
|
+
// "rivetkit",
|
|
465
|
+
// ]) as any;
|
|
466
|
+
//
|
|
467
|
+
// logger().debug({
|
|
468
|
+
// msg: "test inline driver created websocket",
|
|
469
|
+
// readyState: ws.readyState,
|
|
470
|
+
// url: ws.url,
|
|
471
|
+
// });
|
|
472
|
+
//
|
|
473
|
+
// return ws;
|
|
474
|
+
// },
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
async function makeInlineRequest(endpoint, encoding, transport, method, args) {
|
|
478
|
+
logger().debug({
|
|
479
|
+
msg: "sending inline request",
|
|
480
|
+
encoding,
|
|
481
|
+
transport,
|
|
482
|
+
method,
|
|
483
|
+
args
|
|
484
|
+
});
|
|
485
|
+
const response = await fetch(`${endpoint}/.test/inline-driver/call`, {
|
|
486
|
+
method: "POST",
|
|
487
|
+
headers: {
|
|
488
|
+
"Content-Type": "application/json"
|
|
489
|
+
},
|
|
490
|
+
body: cbor.encode({
|
|
491
|
+
encoding,
|
|
492
|
+
transport,
|
|
493
|
+
method,
|
|
494
|
+
args
|
|
495
|
+
})
|
|
496
|
+
});
|
|
497
|
+
if (!response.ok) {
|
|
498
|
+
throw new Error(`Failed to call inline ${method}: ${response.statusText}`);
|
|
499
|
+
}
|
|
500
|
+
const buffer = await response.arrayBuffer();
|
|
501
|
+
const callResponse = cbor.decode(
|
|
502
|
+
new Uint8Array(buffer)
|
|
503
|
+
);
|
|
504
|
+
if ("ok" in callResponse) {
|
|
505
|
+
return callResponse.ok;
|
|
506
|
+
} else if ("err" in callResponse) {
|
|
507
|
+
throw new ActorError(
|
|
508
|
+
callResponse.err.group,
|
|
509
|
+
callResponse.err.code,
|
|
510
|
+
callResponse.err.message,
|
|
511
|
+
callResponse.err.metadata
|
|
512
|
+
);
|
|
513
|
+
} else {
|
|
514
|
+
assertUnreachable(callResponse);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// src/driver-test-suite/utils.ts
|
|
50
519
|
var FAKE_TIME = /* @__PURE__ */ new Date("2024-01-01T00:00:00.000Z");
|
|
51
520
|
async function setupDriverTest(c, driverTestConfig) {
|
|
52
521
|
if (!driverTestConfig.useRealTimers) {
|
|
53
522
|
vi.useFakeTimers();
|
|
54
523
|
vi.setSystemTime(FAKE_TIME);
|
|
55
524
|
}
|
|
56
|
-
const
|
|
57
|
-
const { endpoint, namespace, runnerName, cleanup } = await driverTestConfig.start(projectPath);
|
|
525
|
+
const { endpoint, namespace, runnerName, cleanup } = await driverTestConfig.start();
|
|
58
526
|
c.onTestFinished(cleanup);
|
|
59
527
|
let client;
|
|
60
528
|
if (driverTestConfig.clientType === "http") {
|
|
@@ -65,7 +533,12 @@ async function setupDriverTest(c, driverTestConfig) {
|
|
|
65
533
|
transport: driverTestConfig.transport
|
|
66
534
|
});
|
|
67
535
|
} else if (driverTestConfig.clientType === "inline") {
|
|
68
|
-
|
|
536
|
+
const managerDriver = createTestInlineClientDriver(
|
|
537
|
+
endpoint,
|
|
538
|
+
"bare",
|
|
539
|
+
driverTestConfig.transport ?? "websocket"
|
|
540
|
+
);
|
|
541
|
+
client = createClientWithDriver(managerDriver);
|
|
69
542
|
} else {
|
|
70
543
|
assertUnreachable(driverTestConfig.clientType);
|
|
71
544
|
}
|
|
@@ -79,7 +552,7 @@ async function setupDriverTest(c, driverTestConfig) {
|
|
|
79
552
|
}
|
|
80
553
|
async function waitFor(driverTestConfig, ms) {
|
|
81
554
|
if (driverTestConfig.useRealTimers) {
|
|
82
|
-
return new Promise((
|
|
555
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
83
556
|
} else {
|
|
84
557
|
vi.advanceTimersByTime(ms);
|
|
85
558
|
return Promise.resolve();
|
|
@@ -215,11 +688,11 @@ function runActorConnTests(driverTestConfig) {
|
|
|
215
688
|
const handle = client.counter.getOrCreate(["test-mixed-rpc-ws"]);
|
|
216
689
|
const connection = handle.connect();
|
|
217
690
|
const receivedEvents = [];
|
|
218
|
-
const receivedEventsPromise = new Promise((
|
|
691
|
+
const receivedEventsPromise = new Promise((resolve) => {
|
|
219
692
|
connection.on("newCount", (count) => {
|
|
220
693
|
receivedEvents.push(count);
|
|
221
694
|
if (receivedEvents.includes(1) && receivedEvents.includes(6) && receivedEvents.includes(9))
|
|
222
|
-
|
|
695
|
+
resolve(void 0);
|
|
223
696
|
});
|
|
224
697
|
});
|
|
225
698
|
await connection.increment(1);
|
|
@@ -667,7 +1140,7 @@ var sleepWithRawHttp = actor({
|
|
|
667
1140
|
if (url.pathname === "/long-request") {
|
|
668
1141
|
const duration = parseInt(url.searchParams.get("duration") || "1000");
|
|
669
1142
|
c.log.info({ msg: "starting long fetch request", duration });
|
|
670
|
-
await new Promise((
|
|
1143
|
+
await new Promise((resolve) => setTimeout(resolve, duration));
|
|
671
1144
|
c.log.info("finished long fetch request");
|
|
672
1145
|
return new Response(JSON.stringify({ completed: true }), {
|
|
673
1146
|
headers: { "Content-Type": "application/json" }
|
|
@@ -908,7 +1381,7 @@ function runActorSleepTests(driverTestConfig) {
|
|
|
908
1381
|
expect5(startCount).toBe(1);
|
|
909
1382
|
}
|
|
910
1383
|
const waitPromise = new Promise(
|
|
911
|
-
(
|
|
1384
|
+
(resolve) => sleepActor.once("waiting", resolve)
|
|
912
1385
|
);
|
|
913
1386
|
const longRunningPromise = sleepActor.longRunningRpc();
|
|
914
1387
|
await waitPromise;
|
|
@@ -941,32 +1414,32 @@ function runActorSleepTests(driverTestConfig) {
|
|
|
941
1414
|
expect5(startCount).toBe(1);
|
|
942
1415
|
}
|
|
943
1416
|
const ws = await sleepActor.websocket();
|
|
944
|
-
await new Promise((
|
|
945
|
-
ws.onopen = () =>
|
|
1417
|
+
await new Promise((resolve, reject) => {
|
|
1418
|
+
ws.onopen = () => resolve();
|
|
946
1419
|
ws.onerror = reject;
|
|
947
1420
|
});
|
|
948
|
-
await new Promise((
|
|
1421
|
+
await new Promise((resolve) => {
|
|
949
1422
|
ws.onmessage = (event) => {
|
|
950
1423
|
const data = JSON.parse(event.data);
|
|
951
1424
|
if (data.type === "connected") {
|
|
952
|
-
|
|
1425
|
+
resolve();
|
|
953
1426
|
}
|
|
954
1427
|
};
|
|
955
1428
|
});
|
|
956
1429
|
await waitFor(driverTestConfig, SLEEP_TIMEOUT + 100);
|
|
957
1430
|
ws.send(JSON.stringify({ type: "getCounts" }));
|
|
958
|
-
const counts = await new Promise((
|
|
1431
|
+
const counts = await new Promise((resolve) => {
|
|
959
1432
|
ws.onmessage = (event) => {
|
|
960
1433
|
const data = JSON.parse(event.data);
|
|
961
1434
|
if (data.type === "counts") {
|
|
962
|
-
|
|
1435
|
+
resolve(data);
|
|
963
1436
|
}
|
|
964
1437
|
};
|
|
965
1438
|
});
|
|
966
1439
|
expect5(counts.sleepCount).toBe(0);
|
|
967
1440
|
expect5(counts.startCount).toBe(1);
|
|
968
1441
|
ws.close();
|
|
969
|
-
await new Promise((
|
|
1442
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
970
1443
|
await waitFor(driverTestConfig, SLEEP_TIMEOUT + 100);
|
|
971
1444
|
{
|
|
972
1445
|
const { startCount, sleepCount } = await sleepActor.getCounts();
|
|
@@ -1119,15 +1592,8 @@ function runActorErrorHandlingTests(driverTestConfig) {
|
|
|
1119
1592
|
await handle.throwInternalError();
|
|
1120
1593
|
expect7(true).toBe(false);
|
|
1121
1594
|
} catch (error) {
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
expect7(error.message).toBe(INTERNAL_ERROR_DESCRIPTION);
|
|
1125
|
-
} else if (driverTestConfig.clientType === "inline") {
|
|
1126
|
-
expect7(error.code).toBe(INTERNAL_ERROR_CODE);
|
|
1127
|
-
expect7(error.message).toBe("This is an internal error");
|
|
1128
|
-
} else {
|
|
1129
|
-
assertUnreachable(driverTestConfig.clientType);
|
|
1130
|
-
}
|
|
1595
|
+
expect7(error.code).toBe(INTERNAL_ERROR_CODE);
|
|
1596
|
+
expect7(error.message).toBe(INTERNAL_ERROR_DESCRIPTION);
|
|
1131
1597
|
}
|
|
1132
1598
|
});
|
|
1133
1599
|
});
|
|
@@ -1465,7 +1931,7 @@ function runActorInlineClientTests(driverTestConfig) {
|
|
|
1465
1931
|
// src/driver-test-suite/tests/actor-inspector.ts
|
|
1466
1932
|
import { describe as describe11, expect as expect10, test as test10 } from "vitest";
|
|
1467
1933
|
function runActorInspectorTests(driverTestConfig) {
|
|
1468
|
-
describe11("Actor Inspector Tests", () => {
|
|
1934
|
+
describe11.skip("Actor Inspector Tests", () => {
|
|
1469
1935
|
describe11("Manager Inspector", () => {
|
|
1470
1936
|
test10("should respond to ping", async (c) => {
|
|
1471
1937
|
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
@@ -2887,24 +3353,24 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
2887
3353
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
2888
3354
|
const actor2 = client.rawWebSocketActor.getOrCreate(["basic"]);
|
|
2889
3355
|
const ws = await actor2.websocket();
|
|
2890
|
-
await new Promise((
|
|
3356
|
+
await new Promise((resolve) => {
|
|
2891
3357
|
if (ws.readyState === WebSocket.OPEN) {
|
|
2892
|
-
|
|
3358
|
+
resolve();
|
|
2893
3359
|
} else {
|
|
2894
3360
|
ws.addEventListener(
|
|
2895
3361
|
"open",
|
|
2896
3362
|
() => {
|
|
2897
|
-
|
|
3363
|
+
resolve();
|
|
2898
3364
|
},
|
|
2899
3365
|
{ once: true }
|
|
2900
3366
|
);
|
|
2901
3367
|
}
|
|
2902
3368
|
});
|
|
2903
|
-
const welcomeMessage = await new Promise((
|
|
3369
|
+
const welcomeMessage = await new Promise((resolve, reject) => {
|
|
2904
3370
|
ws.addEventListener(
|
|
2905
3371
|
"message",
|
|
2906
3372
|
(event) => {
|
|
2907
|
-
|
|
3373
|
+
resolve(JSON.parse(event.data));
|
|
2908
3374
|
},
|
|
2909
3375
|
{ once: true }
|
|
2910
3376
|
);
|
|
@@ -2919,22 +3385,22 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
2919
3385
|
const actor2 = client.rawWebSocketActor.getOrCreate(["echo"]);
|
|
2920
3386
|
const ws = await actor2.websocket();
|
|
2921
3387
|
if (ws.readyState !== WebSocket.OPEN) {
|
|
2922
|
-
await new Promise((
|
|
2923
|
-
ws.addEventListener("open", () =>
|
|
3388
|
+
await new Promise((resolve, reject) => {
|
|
3389
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
2924
3390
|
ws.addEventListener("close", reject);
|
|
2925
3391
|
});
|
|
2926
3392
|
}
|
|
2927
|
-
await new Promise((
|
|
2928
|
-
ws.addEventListener("message", () =>
|
|
3393
|
+
await new Promise((resolve, reject) => {
|
|
3394
|
+
ws.addEventListener("message", () => resolve(), { once: true });
|
|
2929
3395
|
ws.addEventListener("close", reject);
|
|
2930
3396
|
});
|
|
2931
3397
|
const testMessage = { test: "data", timestamp: Date.now() };
|
|
2932
3398
|
ws.send(JSON.stringify(testMessage));
|
|
2933
|
-
const echoMessage = await new Promise((
|
|
3399
|
+
const echoMessage = await new Promise((resolve, reject) => {
|
|
2934
3400
|
ws.addEventListener(
|
|
2935
3401
|
"message",
|
|
2936
3402
|
(event) => {
|
|
2937
|
-
|
|
3403
|
+
resolve(JSON.parse(event.data));
|
|
2938
3404
|
},
|
|
2939
3405
|
{ once: true }
|
|
2940
3406
|
);
|
|
@@ -2948,21 +3414,21 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
2948
3414
|
const actor2 = client.rawWebSocketActor.getOrCreate(["ping"]);
|
|
2949
3415
|
const ws = await actor2.websocket();
|
|
2950
3416
|
if (ws.readyState !== WebSocket.OPEN) {
|
|
2951
|
-
await new Promise((
|
|
2952
|
-
ws.addEventListener("open", () =>
|
|
3417
|
+
await new Promise((resolve, reject) => {
|
|
3418
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
2953
3419
|
ws.addEventListener("close", reject);
|
|
2954
3420
|
});
|
|
2955
3421
|
}
|
|
2956
|
-
await new Promise((
|
|
2957
|
-
ws.addEventListener("message", () =>
|
|
3422
|
+
await new Promise((resolve, reject) => {
|
|
3423
|
+
ws.addEventListener("message", () => resolve(), { once: true });
|
|
2958
3424
|
ws.addEventListener("close", reject);
|
|
2959
3425
|
});
|
|
2960
3426
|
ws.send(JSON.stringify({ type: "ping" }));
|
|
2961
|
-
const pongMessage = await new Promise((
|
|
3427
|
+
const pongMessage = await new Promise((resolve, reject) => {
|
|
2962
3428
|
ws.addEventListener("message", (event) => {
|
|
2963
3429
|
const data = JSON.parse(event.data);
|
|
2964
3430
|
if (data.type === "pong") {
|
|
2965
|
-
|
|
3431
|
+
resolve(data);
|
|
2966
3432
|
}
|
|
2967
3433
|
});
|
|
2968
3434
|
ws.addEventListener("close", reject);
|
|
@@ -2975,23 +3441,23 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
2975
3441
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
2976
3442
|
const actor1 = client.rawWebSocketActor.getOrCreate(["stats"]);
|
|
2977
3443
|
const ws1 = await actor1.websocket();
|
|
2978
|
-
const ws1MessagePromise = new Promise((
|
|
2979
|
-
ws1.addEventListener("message", () =>
|
|
3444
|
+
const ws1MessagePromise = new Promise((resolve, reject) => {
|
|
3445
|
+
ws1.addEventListener("message", () => resolve(), { once: true });
|
|
2980
3446
|
ws1.addEventListener("close", reject);
|
|
2981
3447
|
});
|
|
2982
3448
|
await ws1MessagePromise;
|
|
2983
3449
|
const actor2 = client.rawWebSocketActor.get(["stats"]);
|
|
2984
3450
|
const ws2 = await actor2.websocket();
|
|
2985
|
-
const ws2MessagePromise = new Promise((
|
|
2986
|
-
ws2.addEventListener("message", () =>
|
|
3451
|
+
const ws2MessagePromise = new Promise((resolve, reject) => {
|
|
3452
|
+
ws2.addEventListener("message", () => resolve(), { once: true });
|
|
2987
3453
|
ws2.addEventListener("close", reject);
|
|
2988
3454
|
});
|
|
2989
3455
|
await Promise.all([ws1MessagePromise, ws2MessagePromise]);
|
|
2990
|
-
const pingPromise = new Promise((
|
|
3456
|
+
const pingPromise = new Promise((resolve, reject) => {
|
|
2991
3457
|
ws2.addEventListener("message", (event) => {
|
|
2992
3458
|
const data = JSON.parse(event.data);
|
|
2993
3459
|
if (data.type === "pong") {
|
|
2994
|
-
|
|
3460
|
+
resolve(void 0);
|
|
2995
3461
|
}
|
|
2996
3462
|
});
|
|
2997
3463
|
ws2.addEventListener("close", reject);
|
|
@@ -3000,11 +3466,11 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3000
3466
|
ws1.send(JSON.stringify({ data: "test3" }));
|
|
3001
3467
|
ws2.send(JSON.stringify({ type: "ping" }));
|
|
3002
3468
|
await pingPromise;
|
|
3003
|
-
const statsPromise = new Promise((
|
|
3469
|
+
const statsPromise = new Promise((resolve, reject) => {
|
|
3004
3470
|
ws1.addEventListener("message", (event) => {
|
|
3005
3471
|
const data = JSON.parse(event.data);
|
|
3006
3472
|
if (data.type === "stats") {
|
|
3007
|
-
|
|
3473
|
+
resolve(data);
|
|
3008
3474
|
}
|
|
3009
3475
|
});
|
|
3010
3476
|
ws1.addEventListener("close", reject);
|
|
@@ -3024,18 +3490,18 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3024
3490
|
const actor2 = client.rawWebSocketBinaryActor.getOrCreate(["binary"]);
|
|
3025
3491
|
const ws = await actor2.websocket();
|
|
3026
3492
|
if (ws.readyState !== WebSocket.OPEN) {
|
|
3027
|
-
await new Promise((
|
|
3028
|
-
ws.addEventListener("open", () =>
|
|
3493
|
+
await new Promise((resolve, reject) => {
|
|
3494
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
3029
3495
|
ws.addEventListener("close", reject);
|
|
3030
3496
|
});
|
|
3031
3497
|
}
|
|
3032
3498
|
const receiveBinaryMessage = async () => {
|
|
3033
3499
|
const response = await new Promise(
|
|
3034
|
-
(
|
|
3500
|
+
(resolve, reject) => {
|
|
3035
3501
|
ws.addEventListener(
|
|
3036
3502
|
"message",
|
|
3037
3503
|
(event) => {
|
|
3038
|
-
|
|
3504
|
+
resolve(event.data);
|
|
3039
3505
|
},
|
|
3040
3506
|
{ once: true }
|
|
3041
3507
|
);
|
|
@@ -3064,18 +3530,18 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3064
3530
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
3065
3531
|
const actor2 = client.rawWebSocketActor.getOrCreate(["paths"]);
|
|
3066
3532
|
const ws = await actor2.websocket("custom/path");
|
|
3067
|
-
await new Promise((
|
|
3533
|
+
await new Promise((resolve, reject) => {
|
|
3068
3534
|
ws.addEventListener("open", () => {
|
|
3069
|
-
|
|
3535
|
+
resolve();
|
|
3070
3536
|
});
|
|
3071
3537
|
ws.addEventListener("error", reject);
|
|
3072
3538
|
ws.addEventListener("close", reject);
|
|
3073
3539
|
});
|
|
3074
|
-
const welcomeMessage = await new Promise((
|
|
3540
|
+
const welcomeMessage = await new Promise((resolve) => {
|
|
3075
3541
|
ws.addEventListener(
|
|
3076
3542
|
"message",
|
|
3077
3543
|
(event) => {
|
|
3078
|
-
|
|
3544
|
+
resolve(JSON.parse(event.data));
|
|
3079
3545
|
},
|
|
3080
3546
|
{ once: true }
|
|
3081
3547
|
);
|
|
@@ -3090,15 +3556,15 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3090
3556
|
params: testParams
|
|
3091
3557
|
});
|
|
3092
3558
|
const ws = await actor2.websocket();
|
|
3093
|
-
await new Promise((
|
|
3094
|
-
ws.addEventListener("open", () =>
|
|
3559
|
+
await new Promise((resolve) => {
|
|
3560
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
3095
3561
|
});
|
|
3096
3562
|
ws.send(JSON.stringify({ type: "getAuthData" }));
|
|
3097
|
-
const response = await new Promise((
|
|
3563
|
+
const response = await new Promise((resolve, reject) => {
|
|
3098
3564
|
ws.addEventListener("message", (event) => {
|
|
3099
3565
|
const data = JSON.parse(event.data);
|
|
3100
3566
|
if (data.type === "authData") {
|
|
3101
|
-
|
|
3567
|
+
resolve(data);
|
|
3102
3568
|
}
|
|
3103
3569
|
});
|
|
3104
3570
|
ws.addEventListener("close", reject);
|
|
@@ -3111,15 +3577,15 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3111
3577
|
const actor2 = client.rawWebSocketActor.getOrCreate(["close-test"]);
|
|
3112
3578
|
const ws = await actor2.websocket();
|
|
3113
3579
|
if (ws.readyState !== WebSocket.OPEN) {
|
|
3114
|
-
await new Promise((
|
|
3115
|
-
ws.addEventListener("open", () =>
|
|
3580
|
+
await new Promise((resolve, reject) => {
|
|
3581
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
3116
3582
|
ws.addEventListener("close", reject);
|
|
3117
3583
|
});
|
|
3118
3584
|
}
|
|
3119
3585
|
const initialStats = await actor2.getStats();
|
|
3120
3586
|
expect17(initialStats.connectionCount).toBe(1);
|
|
3121
|
-
const closePromise = new Promise((
|
|
3122
|
-
ws.addEventListener("close", () =>
|
|
3587
|
+
const closePromise = new Promise((resolve) => {
|
|
3588
|
+
ws.addEventListener("close", () => resolve(), { once: true });
|
|
3123
3589
|
});
|
|
3124
3590
|
ws.close();
|
|
3125
3591
|
await closePromise;
|
|
@@ -3129,7 +3595,7 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3129
3595
|
if (finalStats.connectionCount === 0) {
|
|
3130
3596
|
break;
|
|
3131
3597
|
}
|
|
3132
|
-
await new Promise((
|
|
3598
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
3133
3599
|
}
|
|
3134
3600
|
expect17(finalStats == null ? void 0 : finalStats.connectionCount).toBe(0);
|
|
3135
3601
|
});
|
|
@@ -3137,15 +3603,15 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3137
3603
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
3138
3604
|
const actor2 = client.rawWebSocketActor.getOrCreate(["open-close-test"]);
|
|
3139
3605
|
const ws1 = await actor2.websocket();
|
|
3140
|
-
await new Promise((
|
|
3141
|
-
ws1.addEventListener("open", () =>
|
|
3606
|
+
await new Promise((resolve, reject) => {
|
|
3607
|
+
ws1.addEventListener("open", () => resolve(), { once: true });
|
|
3142
3608
|
ws1.addEventListener("close", reject);
|
|
3143
3609
|
});
|
|
3144
|
-
const welcome1 = await new Promise((
|
|
3610
|
+
const welcome1 = await new Promise((resolve, reject) => {
|
|
3145
3611
|
ws1.addEventListener(
|
|
3146
3612
|
"message",
|
|
3147
3613
|
(event) => {
|
|
3148
|
-
|
|
3614
|
+
resolve(JSON.parse(event.data));
|
|
3149
3615
|
},
|
|
3150
3616
|
{ once: true }
|
|
3151
3617
|
);
|
|
@@ -3154,15 +3620,15 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3154
3620
|
expect17(welcome1.type).toBe("welcome");
|
|
3155
3621
|
expect17(welcome1.connectionCount).toBe(1);
|
|
3156
3622
|
const ws2 = await actor2.websocket();
|
|
3157
|
-
await new Promise((
|
|
3158
|
-
ws2.addEventListener("open", () =>
|
|
3623
|
+
await new Promise((resolve, reject) => {
|
|
3624
|
+
ws2.addEventListener("open", () => resolve(), { once: true });
|
|
3159
3625
|
ws2.addEventListener("close", reject);
|
|
3160
3626
|
});
|
|
3161
|
-
const welcome2 = await new Promise((
|
|
3627
|
+
const welcome2 = await new Promise((resolve, reject) => {
|
|
3162
3628
|
ws2.addEventListener(
|
|
3163
3629
|
"message",
|
|
3164
3630
|
(event) => {
|
|
3165
|
-
|
|
3631
|
+
resolve(JSON.parse(event.data));
|
|
3166
3632
|
},
|
|
3167
3633
|
{ once: true }
|
|
3168
3634
|
);
|
|
@@ -3173,8 +3639,8 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3173
3639
|
const midStats = await actor2.getStats();
|
|
3174
3640
|
expect17(midStats.connectionCount).toBe(2);
|
|
3175
3641
|
ws1.close();
|
|
3176
|
-
await new Promise((
|
|
3177
|
-
ws1.addEventListener("close", () =>
|
|
3642
|
+
await new Promise((resolve) => {
|
|
3643
|
+
ws1.addEventListener("close", () => resolve(), { once: true });
|
|
3178
3644
|
});
|
|
3179
3645
|
let afterFirstClose;
|
|
3180
3646
|
for (let i = 0; i < 20; i++) {
|
|
@@ -3182,12 +3648,12 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3182
3648
|
if (afterFirstClose.connectionCount === 1) {
|
|
3183
3649
|
break;
|
|
3184
3650
|
}
|
|
3185
|
-
await new Promise((
|
|
3651
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
3186
3652
|
}
|
|
3187
3653
|
expect17(afterFirstClose == null ? void 0 : afterFirstClose.connectionCount).toBe(1);
|
|
3188
3654
|
ws2.close();
|
|
3189
|
-
await new Promise((
|
|
3190
|
-
ws2.addEventListener("close", () =>
|
|
3655
|
+
await new Promise((resolve) => {
|
|
3656
|
+
ws2.addEventListener("close", () => resolve(), { once: true });
|
|
3191
3657
|
});
|
|
3192
3658
|
let finalStats;
|
|
3193
3659
|
for (let i = 0; i < 20; i++) {
|
|
@@ -3195,7 +3661,7 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3195
3661
|
if (finalStats.connectionCount === 0) {
|
|
3196
3662
|
break;
|
|
3197
3663
|
}
|
|
3198
|
-
await new Promise((
|
|
3664
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
3199
3665
|
}
|
|
3200
3666
|
expect17(finalStats == null ? void 0 : finalStats.connectionCount).toBe(0);
|
|
3201
3667
|
});
|
|
@@ -3203,15 +3669,15 @@ function runRawWebSocketTests(driverTestConfig) {
|
|
|
3203
3669
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
3204
3670
|
const actor2 = client.rawWebSocketActor.getOrCreate(["query-params"]);
|
|
3205
3671
|
const ws = await actor2.websocket("api/v1/stream?token=abc123&user=test");
|
|
3206
|
-
await new Promise((
|
|
3207
|
-
ws.addEventListener("open", () =>
|
|
3672
|
+
await new Promise((resolve, reject) => {
|
|
3673
|
+
ws.addEventListener("open", () => resolve(), { once: true });
|
|
3208
3674
|
ws.addEventListener("error", reject);
|
|
3209
3675
|
});
|
|
3210
|
-
const requestInfoPromise = new Promise((
|
|
3676
|
+
const requestInfoPromise = new Promise((resolve, reject) => {
|
|
3211
3677
|
ws.addEventListener("message", (event) => {
|
|
3212
3678
|
const data = JSON.parse(event.data);
|
|
3213
3679
|
if (data.type === "requestInfo") {
|
|
3214
|
-
|
|
3680
|
+
resolve(data);
|
|
3215
3681
|
}
|
|
3216
3682
|
});
|
|
3217
3683
|
ws.addEventListener("close", reject);
|
|
@@ -3393,7 +3859,7 @@ async function createTestRuntime(registryPath, driverFactory) {
|
|
|
3393
3859
|
const serverEndpoint = `http://127.0.0.1:${port}`;
|
|
3394
3860
|
logger().info({ msg: "test serer listening", port });
|
|
3395
3861
|
const cleanup = async () => {
|
|
3396
|
-
await new Promise((
|
|
3862
|
+
await new Promise((resolve) => server.close(() => resolve(void 0)));
|
|
3397
3863
|
await (driverCleanup == null ? void 0 : driverCleanup());
|
|
3398
3864
|
};
|
|
3399
3865
|
return {
|