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