trpc-uwebsockets 11.0.2 → 11.0.4-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/___testHelpers.js +234 -0
- package/dist/___testHelpers.js.map +1 -0
- package/dist/fetchCompat.js +35 -23
- package/dist/fetchCompat.js.map +1 -1
- package/dist/websockets.js +89 -95
- package/dist/websockets.js.map +1 -1
- package/package.json +7 -7
- package/src/___testHelpers.ts +312 -0
- package/src/fetchCompat.ts +44 -30
- package/src/fetchRequest.spec.ts +92 -11
- package/src/readme.spec.ts +1 -1
- package/src/server.spec.ts +287 -597
- package/src/websockets.ts +135 -130
- package/types/___testHelpers.d.ts +44 -0
- package/types/fetchCompat.d.ts +1 -0
- package/types/websockets.d.ts +31 -20
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
CreateContextOptions,
|
|
26
26
|
} from 'trpc-uwebsockets';
|
|
27
27
|
|
|
28
|
-
/* Define context.
|
|
28
|
+
/* Define context. During websocket connection do not use `res`, use `client` instead */
|
|
29
29
|
function createContext({ req, res, info, client }: CreateContextOptions) {
|
|
30
30
|
const user = { name: req.headers.get('username') || 'anonymous' };
|
|
31
31
|
return { req, res, user, info, client };
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.testFactory = testFactory;
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const websockets_1 = require("./websockets");
|
|
9
|
+
const observable_1 = require("@trpc/server/observable");
|
|
10
|
+
const uWebSockets_js_1 = __importDefault(require("uWebSockets.js"));
|
|
11
|
+
const requestHandler_1 = require("./requestHandler");
|
|
12
|
+
const client_1 = require("@trpc/client");
|
|
13
|
+
const event_source_polyfill_1 = require("event-source-polyfill");
|
|
14
|
+
global.EventSource = event_source_polyfill_1.EventSourcePolyfill;
|
|
15
|
+
function createServer(opts) {
|
|
16
|
+
const prefix = opts.prefix ?? '/trpc';
|
|
17
|
+
const instance = uWebSockets_js_1.default.App();
|
|
18
|
+
const router = opts.appRouter;
|
|
19
|
+
const onServerErrorSpy = vitest_1.vi.fn();
|
|
20
|
+
(0, requestHandler_1.applyRequestHandler)(instance, {
|
|
21
|
+
prefix,
|
|
22
|
+
ssl: false,
|
|
23
|
+
trpcOptions: {
|
|
24
|
+
router,
|
|
25
|
+
createContext: opts.createContext ?? (() => ({})),
|
|
26
|
+
onError(data) {
|
|
27
|
+
onServerErrorSpy(data);
|
|
28
|
+
},
|
|
29
|
+
responseMeta() {
|
|
30
|
+
return {
|
|
31
|
+
headers: {
|
|
32
|
+
'Access-Control-Allow-Origin': '*',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
(0, websockets_1.applyWebsocketHandler)(instance, {
|
|
39
|
+
prefix,
|
|
40
|
+
ssl: false,
|
|
41
|
+
router,
|
|
42
|
+
createContext: opts.createContext ?? (() => ({})),
|
|
43
|
+
onError(data) {
|
|
44
|
+
onServerErrorSpy(data);
|
|
45
|
+
},
|
|
46
|
+
uWsBehaviorOptions: opts.uWsBehaviorOptions,
|
|
47
|
+
keepAlive: opts.keepAlive,
|
|
48
|
+
});
|
|
49
|
+
instance.get('/hello', async (res) => {
|
|
50
|
+
res.end('Hello world');
|
|
51
|
+
});
|
|
52
|
+
instance.post('/hello', async (res) => {
|
|
53
|
+
res.end(JSON.stringify({ hello: 'POST', body: 'TODO, why?' }));
|
|
54
|
+
});
|
|
55
|
+
instance.ws('/ws', {
|
|
56
|
+
message: (client, rawMsg) => {
|
|
57
|
+
client.send(rawMsg);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
instance.ws('/pubsub', {
|
|
61
|
+
open: (client) => {
|
|
62
|
+
const ok = client.subscribe('topic');
|
|
63
|
+
if (!ok) {
|
|
64
|
+
throw new Error("assertion: failed to subscribe to 'topic'");
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
instance.any('/*', (res) => {
|
|
69
|
+
res.writeStatus('404 NOT FOUND');
|
|
70
|
+
res.end();
|
|
71
|
+
});
|
|
72
|
+
let socket = null;
|
|
73
|
+
instance.listen('0.0.0.0', 0, (token) => {
|
|
74
|
+
socket = token;
|
|
75
|
+
});
|
|
76
|
+
if (!socket) {
|
|
77
|
+
throw new Error('could not make a socket');
|
|
78
|
+
}
|
|
79
|
+
const port = uWebSockets_js_1.default.us_socket_local_port(socket);
|
|
80
|
+
return {
|
|
81
|
+
stop() {
|
|
82
|
+
if (!socket) {
|
|
83
|
+
throw new Error('could not close socket as socket is already closed');
|
|
84
|
+
}
|
|
85
|
+
uWebSockets_js_1.default.us_listen_socket_close(socket);
|
|
86
|
+
socket = null;
|
|
87
|
+
},
|
|
88
|
+
port,
|
|
89
|
+
instance,
|
|
90
|
+
onServerErrorSpy,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function makeLinkSpy() {
|
|
94
|
+
const orderedResults = [];
|
|
95
|
+
const linkSpy = () => {
|
|
96
|
+
// here we just got initialized in the app - this happens once per app
|
|
97
|
+
// useful for storing cache for instance
|
|
98
|
+
return ({ next, op }) => {
|
|
99
|
+
// this is when passing the result to the next link
|
|
100
|
+
// each link needs to return an observable which propagates results
|
|
101
|
+
return (0, observable_1.observable)((observer) => {
|
|
102
|
+
const unsubscribe = next(op).subscribe({
|
|
103
|
+
next(value) {
|
|
104
|
+
const data = value.result.data;
|
|
105
|
+
if (data !== undefined) {
|
|
106
|
+
orderedResults.push(data);
|
|
107
|
+
}
|
|
108
|
+
observer.next(value);
|
|
109
|
+
},
|
|
110
|
+
error: observer.error,
|
|
111
|
+
});
|
|
112
|
+
return unsubscribe;
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
orderedResults,
|
|
118
|
+
linkSpy,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function toQueryString(queryParams) {
|
|
122
|
+
const raw = new URLSearchParams(queryParams).toString();
|
|
123
|
+
return raw.length == 0 ? '' : `?${raw}`;
|
|
124
|
+
}
|
|
125
|
+
function createClientWs(router, opts) {
|
|
126
|
+
const prefix = opts.prefix ?? '/trpc';
|
|
127
|
+
const transformer = router._def._config.transformer;
|
|
128
|
+
const qs = toQueryString(opts.queryParams ?? {});
|
|
129
|
+
const host = `localhost:${opts.port}${prefix}${qs}`;
|
|
130
|
+
const wsClient = (0, client_1.createWSClient)({
|
|
131
|
+
retryDelayMs: () => 99999, // never retry by default
|
|
132
|
+
...opts.wsClientOptions,
|
|
133
|
+
url: `ws://${host}`,
|
|
134
|
+
});
|
|
135
|
+
const { orderedResults, linkSpy } = makeLinkSpy();
|
|
136
|
+
const client = (0, client_1.createTRPCClient)({
|
|
137
|
+
links: [linkSpy, (0, client_1.wsLink)({ client: wsClient, transformer })],
|
|
138
|
+
});
|
|
139
|
+
return { client, wsClient, orderedResults };
|
|
140
|
+
}
|
|
141
|
+
function createClientBatchStream(router, opts) {
|
|
142
|
+
const prefix = opts.prefix ?? '/trpc';
|
|
143
|
+
const transformer = router._def._config.transformer;
|
|
144
|
+
const qs = toQueryString(opts.queryParams ?? {});
|
|
145
|
+
const host = `localhost:${opts.port}${prefix}${qs}`;
|
|
146
|
+
const { orderedResults, linkSpy } = makeLinkSpy();
|
|
147
|
+
const client = (0, client_1.createTRPCClient)({
|
|
148
|
+
links: [
|
|
149
|
+
linkSpy,
|
|
150
|
+
(0, client_1.httpBatchStreamLink)({
|
|
151
|
+
url: `http://${host}`,
|
|
152
|
+
headers: opts.headers,
|
|
153
|
+
transformer,
|
|
154
|
+
}),
|
|
155
|
+
],
|
|
156
|
+
});
|
|
157
|
+
return { client, orderedResults };
|
|
158
|
+
}
|
|
159
|
+
function createClientBatch(router, opts) {
|
|
160
|
+
const prefix = opts.prefix ?? '/trpc';
|
|
161
|
+
const transformer = router._def._config.transformer;
|
|
162
|
+
const qs = toQueryString(opts.queryParams ?? {});
|
|
163
|
+
const host = `localhost:${opts.port}${prefix}${qs}`;
|
|
164
|
+
const client = (0, client_1.createTRPCClient)({
|
|
165
|
+
links: [
|
|
166
|
+
(0, client_1.httpBatchLink)({
|
|
167
|
+
url: `http://${host}`,
|
|
168
|
+
headers: opts.headers,
|
|
169
|
+
transformer,
|
|
170
|
+
}),
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
return { client };
|
|
174
|
+
}
|
|
175
|
+
function createClientSse(router, opts) {
|
|
176
|
+
const prefix = opts.prefix ?? '/trpc';
|
|
177
|
+
const transformer = router._def._config.transformer;
|
|
178
|
+
const qs = toQueryString(opts.queryParams ?? {});
|
|
179
|
+
const host = `localhost:${opts.port}${prefix}${qs}`;
|
|
180
|
+
const { orderedResults, linkSpy } = makeLinkSpy();
|
|
181
|
+
const client = (0, client_1.createTRPCClient)({
|
|
182
|
+
links: [
|
|
183
|
+
linkSpy,
|
|
184
|
+
(0, client_1.httpSubscriptionLink)({
|
|
185
|
+
url: `http://${host}`,
|
|
186
|
+
connectionParams: opts.wsClientOptions?.connectionParams,
|
|
187
|
+
// ponyfill EventSource
|
|
188
|
+
EventSource: event_source_polyfill_1.EventSourcePolyfill,
|
|
189
|
+
transformer,
|
|
190
|
+
}),
|
|
191
|
+
],
|
|
192
|
+
});
|
|
193
|
+
return { client, orderedResults };
|
|
194
|
+
}
|
|
195
|
+
function testFactory(serverOptions) {
|
|
196
|
+
const { instance, port, stop, onServerErrorSpy } = createServer({
|
|
197
|
+
...serverOptions,
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
server: instance,
|
|
201
|
+
stop,
|
|
202
|
+
onServerErrorSpy,
|
|
203
|
+
port,
|
|
204
|
+
opts: serverOptions,
|
|
205
|
+
fetch(path, opts) {
|
|
206
|
+
return fetch(`http://localhost:${port}${path}`, { ...opts });
|
|
207
|
+
},
|
|
208
|
+
clientBatchStream(clientOptions) {
|
|
209
|
+
return createClientBatchStream(serverOptions.appRouter, {
|
|
210
|
+
...clientOptions,
|
|
211
|
+
port,
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
clientBatch(clientOptions) {
|
|
215
|
+
return createClientBatch(serverOptions.appRouter, {
|
|
216
|
+
...clientOptions,
|
|
217
|
+
port,
|
|
218
|
+
});
|
|
219
|
+
},
|
|
220
|
+
clientSse(clientOptions) {
|
|
221
|
+
return createClientSse(serverOptions.appRouter, {
|
|
222
|
+
...clientOptions,
|
|
223
|
+
port,
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
clientWs(clientOptions) {
|
|
227
|
+
return createClientWs(serverOptions.appRouter, {
|
|
228
|
+
...clientOptions,
|
|
229
|
+
port,
|
|
230
|
+
});
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=___testHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"___testHelpers.js","sourceRoot":"","sources":["../src/___testHelpers.ts"],"names":[],"mappings":";;;;;AA8QA,kCAyCC;AAvTD,mCAA4B;AAG5B,6CAIsB;AACtB,wDAAqD;AAErD,oEAAiC;AACjC,qDAI0B;AAM1B,yCAOsB;AAEtB,iEAA4D;AAC5D,MAAM,CAAC,WAAW,GAAG,2CAAmB,CAAC;AAUzC,SAAS,YAAY,CACnB,IAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IAEtC,MAAM,QAAQ,GAAG,wBAAG,CAAC,GAAG,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;IAE9B,MAAM,gBAAgB,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IAEjC,IAAA,oCAAmB,EAAC,QAAQ,EAAE;QAC5B,MAAM;QACN,GAAG,EAAE,KAAK;QACV,WAAW,EAAE;YACX,MAAM;YACN,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI;gBACV,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,YAAY;gBACV,OAAO;oBACL,OAAO,EAAE;wBACP,6BAA6B,EAAE,GAAG;qBACnC;iBACF,CAAC;YACJ,CAAC;SACuD;KAC3D,CAAC,CAAC;IACH,IAAA,kCAAqB,EAAC,QAAQ,EAAE;QAC9B,MAAM;QACN,GAAG,EAAE,KAAK;QACV,MAAM;QACN,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI;YACV,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QACjB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE;QACrB,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACf,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QACjC,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAwC,IAAI,CAAC;IAEvD,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,wBAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI;YACF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,CAAC;YACD,wBAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI;QACJ,QAAQ;QACR,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,OAAO,GAAkB,GAAG,EAAE;QAClC,sEAAsE;QACtE,wCAAwC;QACxC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;YACtB,mDAAmD;YACnD,mEAAmE;YACnE,OAAO,IAAA,uBAAU,EAAC,CAAC,QAAQ,EAAE,EAAE;gBAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;oBACrC,IAAI,CAAC,KAAK;wBACR,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;wBAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;4BACvB,cAAc,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;wBACtC,CAAC;wBACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACvB,CAAC;oBACD,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACtB,CAAC,CAAC;gBACH,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,cAAc;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAUD,SAAS,aAAa,CAAC,WAAmC;IACxD,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CACrB,MAAe,EACf,IAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAkB,CAAC;IAE3D,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC;QAC9B,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,yBAAyB;QACpD,GAAG,IAAI,CAAC,eAAe;QACvB,GAAG,EAAE,QAAQ,IAAI,EAAE;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAU;QACvC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAA,eAAM,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;KAC5D,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAe,EACf,IAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAkB,CAAC;IAE3D,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IACpD,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAU;QACvC,KAAK,EAAE;YACL,OAAO;YACP,IAAA,4BAAmB,EAAC;gBAClB,GAAG,EAAE,UAAU,IAAI,EAAE;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW;aACZ,CAAC;SACH;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAe,EACf,IAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAkB,CAAC;IAE3D,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAU;QACvC,KAAK,EAAE;YACL,IAAA,sBAAa,EAAC;gBACZ,GAAG,EAAE,UAAU,IAAI,EAAE;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW;aACZ,CAAC;SACH;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CACtB,MAAe,EACf,IAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAkB,CAAC;IAE3D,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IAEpD,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAU;QACvC,KAAK,EAAE;YACL,OAAO;YACP,IAAA,6BAAoB,EAAC;gBACnB,GAAG,EAAE,UAAU,IAAI,EAAE;gBACrB,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB;gBACxD,uBAAuB;gBACvB,WAAW,EAAE,2CAA0B;gBACvC,WAAW;aACZ,CAAC;SACH;KACF,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,WAAW,CACzB,aAAuC;IAEvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAAC;QAC9D,GAAG,aAAa;KACjB,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI;QACJ,gBAAgB;QAChB,IAAI;QACJ,IAAI,EAAE,aAAa;QACnB,KAAK,CAAC,IAAY,EAAE,IAAiB;YACnC,OAAO,KAAK,CAAC,oBAAoB,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,iBAAiB,CAAC,aAAkD;YAClE,OAAO,uBAAuB,CAAC,aAAa,CAAC,SAAS,EAAE;gBACtD,GAAG,aAAa;gBAChB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,WAAW,CAAC,aAAkD;YAC5D,OAAO,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE;gBAChD,GAAG,aAAa;gBAChB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,SAAS,CAAC,aAAkD;YAC1D,OAAO,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE;gBAC9C,GAAG,aAAa;gBAChB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,aAAkD;YACzD,OAAO,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE;gBAC7C,GAAG,aAAa;gBAChB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/fetchCompat.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.decorateHttpResponse = decorateHttpResponse;
|
|
4
|
+
exports.uWsToRequestNoBody = uWsToRequestNoBody;
|
|
4
5
|
exports.uWsToRequest = uWsToRequest;
|
|
5
6
|
exports.createURL = createURL;
|
|
6
7
|
exports.uWsSendResponse = uWsSendResponse;
|
|
@@ -12,6 +13,18 @@ function decorateHttpResponse(res, ssl = false) {
|
|
|
12
13
|
resDecorated.ssl = ssl;
|
|
13
14
|
return resDecorated;
|
|
14
15
|
}
|
|
16
|
+
function uWsToRequestNoBody(req, res) {
|
|
17
|
+
const headers = createHeaders(req);
|
|
18
|
+
const method = req.getCaseSensitiveMethod().toUpperCase();
|
|
19
|
+
const isSsl = res.ssl;
|
|
20
|
+
const url = createURL(req, isSsl ? 'https' : 'http');
|
|
21
|
+
const init = {
|
|
22
|
+
headers: headers,
|
|
23
|
+
method: method,
|
|
24
|
+
};
|
|
25
|
+
const request = new Request(url, init);
|
|
26
|
+
return request;
|
|
27
|
+
}
|
|
15
28
|
function uWsToRequest(req, res, opts) {
|
|
16
29
|
const ac = new AbortController();
|
|
17
30
|
const onAbort = () => {
|
|
@@ -74,37 +87,36 @@ function createBody(res, opts) {
|
|
|
74
87
|
let hasClosed = false;
|
|
75
88
|
return new ReadableStream({
|
|
76
89
|
start(controller) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (size == 0 && ab.byteLength == 0 && isLast) {
|
|
80
|
-
onEnd();
|
|
90
|
+
res.onData((tempChunk, isLast) => {
|
|
91
|
+
if (hasClosed)
|
|
81
92
|
return;
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
// This copies the buffer *immediately* and avoids using a detached buffer
|
|
94
|
+
const chunk = new Uint8Array(tempChunk.byteLength);
|
|
95
|
+
chunk.set(new Uint8Array(tempChunk)); // must be done before enqueue
|
|
96
|
+
size += chunk.byteLength;
|
|
84
97
|
if (!opts.maxBodySize || size <= opts.maxBodySize) {
|
|
85
|
-
controller.enqueue(
|
|
98
|
+
controller.enqueue(chunk);
|
|
86
99
|
if (isLast) {
|
|
87
|
-
|
|
100
|
+
hasClosed = true;
|
|
101
|
+
controller.close();
|
|
88
102
|
}
|
|
89
|
-
return;
|
|
90
103
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
hasClosed = true;
|
|
95
|
-
};
|
|
96
|
-
const onEnd = () => {
|
|
97
|
-
if (hasClosed) {
|
|
98
|
-
return;
|
|
104
|
+
else {
|
|
105
|
+
hasClosed = true;
|
|
106
|
+
controller.error(new server_1.TRPCError({ code: 'PAYLOAD_TOO_LARGE' }));
|
|
99
107
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
});
|
|
109
|
+
res.onAborted(() => {
|
|
110
|
+
if (!hasClosed) {
|
|
111
|
+
hasClosed = true;
|
|
112
|
+
controller.error(new server_1.TRPCError({ code: 'CLIENT_CLOSED_REQUEST' }));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
105
115
|
},
|
|
106
116
|
cancel() {
|
|
107
|
-
res.
|
|
117
|
+
res.cork(() => {
|
|
118
|
+
res.close();
|
|
119
|
+
});
|
|
108
120
|
},
|
|
109
121
|
});
|
|
110
122
|
}
|
package/dist/fetchCompat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchCompat.js","sourceRoot":"","sources":["../src/fetchCompat.ts"],"names":[],"mappings":";;AAaA,oDASC;AAED,oCAsCC;AAoBD,8BAkBC;
|
|
1
|
+
{"version":3,"file":"fetchCompat.js","sourceRoot":"","sources":["../src/fetchCompat.ts"],"names":[],"mappings":"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"}
|
package/dist/websockets.js
CHANGED
|
@@ -60,8 +60,20 @@ const http_1 = require("@trpc/server/http");
|
|
|
60
60
|
const observable_1 = require("@trpc/server/observable");
|
|
61
61
|
const rpc_1 = require("@trpc/server/rpc");
|
|
62
62
|
const unstable_core_do_not_import_1 = require("@trpc/server/unstable-core-do-not-import");
|
|
63
|
-
const url_1 = require("url");
|
|
64
63
|
const fetchCompat_1 = require("./fetchCompat");
|
|
64
|
+
function createCompleter() {
|
|
65
|
+
let resolve;
|
|
66
|
+
let reject;
|
|
67
|
+
const promise = new Promise((res, rej) => {
|
|
68
|
+
resolve = res;
|
|
69
|
+
reject = rej;
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
promise,
|
|
73
|
+
resolve: resolve,
|
|
74
|
+
reject: reject,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
65
77
|
function getWSConnectionHandler(opts, allClients) {
|
|
66
78
|
const { createContext, router } = opts;
|
|
67
79
|
const { transformer } = router._def._config;
|
|
@@ -75,62 +87,23 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
75
87
|
// and server is sending keepalive messages
|
|
76
88
|
}
|
|
77
89
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// it returns false if context threw, and execution must be halted.
|
|
81
|
-
// this function will cleanup the connection
|
|
82
|
-
async function tryResolveContext(client, getConnectionParams) {
|
|
83
|
-
const data = client.getUserData();
|
|
84
|
-
data.contextResolveAttempted = true;
|
|
90
|
+
function getConnectionParams(msgStr) {
|
|
91
|
+
let msg;
|
|
85
92
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
res: undefined,
|
|
91
|
-
client,
|
|
92
|
-
info: {
|
|
93
|
-
connectionParams: getConnectionParams(),
|
|
94
|
-
calls: [],
|
|
95
|
-
isBatchCall: false,
|
|
96
|
-
accept: null,
|
|
97
|
-
type: 'unknown',
|
|
98
|
-
signal: data.abortController.signal,
|
|
99
|
-
url: data.url,
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
return true;
|
|
93
|
+
msg = JSON.parse(msgStr);
|
|
94
|
+
if (!(0, unstable_core_do_not_import_1.isObject)(msg)) {
|
|
95
|
+
throw new Error('Message was not an object');
|
|
96
|
+
}
|
|
103
97
|
}
|
|
104
98
|
catch (cause) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
path: undefined,
|
|
110
|
-
type: 'unknown',
|
|
111
|
-
ctx: data.ctx,
|
|
112
|
-
req: data.req,
|
|
113
|
-
input: undefined,
|
|
114
|
-
});
|
|
115
|
-
respond(client, {
|
|
116
|
-
id: null,
|
|
117
|
-
error: (0, server_1.getErrorShape)({
|
|
118
|
-
config: router._def._config,
|
|
119
|
-
error,
|
|
120
|
-
type: 'unknown',
|
|
121
|
-
path: undefined,
|
|
122
|
-
input: undefined,
|
|
123
|
-
ctx: data.ctx,
|
|
124
|
-
}),
|
|
125
|
-
});
|
|
126
|
-
setTimeout(() => {
|
|
127
|
-
// trpc wierd behavior:
|
|
128
|
-
// no mater whats the websocket close status code, trpc websocket still attemps to reconnect indefinitely
|
|
129
|
-
// I chose 1008 as due to https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
|
|
130
|
-
client.end(1008, 'bad context');
|
|
99
|
+
throw new server_1.TRPCError({
|
|
100
|
+
code: 'PARSE_ERROR',
|
|
101
|
+
message: `Malformed TRPCConnectionParamsMessage`,
|
|
102
|
+
cause,
|
|
131
103
|
});
|
|
132
|
-
return false;
|
|
133
104
|
}
|
|
105
|
+
const connectionParams = (0, http_1.parseConnectionParamsFromUnknown)(msg.data);
|
|
106
|
+
return connectionParams;
|
|
134
107
|
}
|
|
135
108
|
async function handleRequest(client, msg) {
|
|
136
109
|
const { clientSubscriptions, ctx, req } = client.getUserData();
|
|
@@ -223,10 +196,6 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
223
196
|
let next;
|
|
224
197
|
let result;
|
|
225
198
|
while (true) {
|
|
226
|
-
// using the Promise.race could introduce memory leaks?
|
|
227
|
-
// more on this here: https://github.com/cefn/watchable/tree/main/packages/unpromise
|
|
228
|
-
// the trpc used Unpromise to accomplish this
|
|
229
|
-
// next = await Unpromise.race([
|
|
230
199
|
next = await unstable_core_do_not_import_1.Unpromise.race([
|
|
231
200
|
iterator.next().catch(server_1.getTRPCErrorFromUnknown),
|
|
232
201
|
abortPromise,
|
|
@@ -346,14 +315,12 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
346
315
|
maxPayloadLength: opts.uWsBehaviorOptions?.maxPayloadLength,
|
|
347
316
|
maxLifetime: opts.uWsBehaviorOptions?.maxLifetime,
|
|
348
317
|
idleTimeout: opts.uWsBehaviorOptions?.idleTimeout,
|
|
349
|
-
|
|
318
|
+
upgrade(res, req, context) {
|
|
350
319
|
const resDecorated = (0, fetchCompat_1.decorateHttpResponse)(res);
|
|
351
320
|
res.onAborted(() => {
|
|
352
321
|
resDecorated.aborted = true;
|
|
353
322
|
});
|
|
354
|
-
const reqFetch = (0, fetchCompat_1.
|
|
355
|
-
maxBodySize: null,
|
|
356
|
-
});
|
|
323
|
+
const reqFetch = (0, fetchCompat_1.uWsToRequestNoBody)(req, resDecorated);
|
|
357
324
|
const secWebSocketKey = req.getHeader('sec-websocket-key');
|
|
358
325
|
const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
|
|
359
326
|
const secWebSocketExtensions = req.getHeader('sec-websocket-extensions');
|
|
@@ -363,9 +330,8 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
363
330
|
clientSubscriptions,
|
|
364
331
|
abortController,
|
|
365
332
|
req: reqFetch,
|
|
366
|
-
ctx:
|
|
367
|
-
|
|
368
|
-
useConnectionParams: false,
|
|
333
|
+
ctx: undefined,
|
|
334
|
+
ctxCompleter: null,
|
|
369
335
|
keepAlive: null,
|
|
370
336
|
url: (0, fetchCompat_1.createURL)(req, resDecorated.sll ? 'wss' : 'ws'),
|
|
371
337
|
};
|
|
@@ -373,16 +339,9 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
373
339
|
},
|
|
374
340
|
async open(client) {
|
|
375
341
|
allClients.add(client);
|
|
376
|
-
const data = client.getUserData();
|
|
377
|
-
data.useConnectionParams =
|
|
378
|
-
new url_1.URL(data.req.url).searchParams.get('connectionParams') === '1';
|
|
379
|
-
if (!data.useConnectionParams) {
|
|
380
|
-
const ok = await tryResolveContext(client, () => null);
|
|
381
|
-
if (!ok)
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
342
|
if (opts.keepAlive?.enabled) {
|
|
385
343
|
const { pingMs, pongWaitMs } = opts.keepAlive;
|
|
344
|
+
const data = client.getUserData();
|
|
386
345
|
data.keepAlive = handleKeepAlive(client, pingMs, pongWaitMs);
|
|
387
346
|
}
|
|
388
347
|
},
|
|
@@ -391,7 +350,6 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
391
350
|
if (data.keepAlive) {
|
|
392
351
|
data.keepAlive.onMessage();
|
|
393
352
|
}
|
|
394
|
-
// const msgStr = rawMsg.toString(); // or could do this ;
|
|
395
353
|
const msgStr = Buffer.from(rawMsg).toString();
|
|
396
354
|
if (msgStr === 'PONG') {
|
|
397
355
|
return;
|
|
@@ -402,31 +360,67 @@ function getWSConnectionHandler(opts, allClients) {
|
|
|
402
360
|
}
|
|
403
361
|
return;
|
|
404
362
|
}
|
|
405
|
-
if (data.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
363
|
+
if (data.ctxCompleter == null) {
|
|
364
|
+
data.ctxCompleter = createCompleter();
|
|
365
|
+
const useConnectionParams = data.url.searchParams.get('connectionParams') === '1';
|
|
366
|
+
try {
|
|
367
|
+
data.ctx = await createContext?.({
|
|
368
|
+
req: data.req,
|
|
369
|
+
res: client,
|
|
370
|
+
client: client,
|
|
371
|
+
info: {
|
|
372
|
+
connectionParams: useConnectionParams
|
|
373
|
+
? getConnectionParams(msgStr)
|
|
374
|
+
: null,
|
|
375
|
+
calls: [],
|
|
376
|
+
isBatchCall: false,
|
|
377
|
+
accept: null,
|
|
378
|
+
type: 'unknown',
|
|
379
|
+
signal: data.abortController.signal,
|
|
380
|
+
url: data.url,
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
data.ctxCompleter.resolve();
|
|
409
384
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
385
|
+
catch (cause) {
|
|
386
|
+
const error = (0, server_1.getTRPCErrorFromUnknown)(cause);
|
|
387
|
+
opts.onError?.({
|
|
388
|
+
ctx: data.ctx,
|
|
389
|
+
error: error,
|
|
390
|
+
input: undefined,
|
|
391
|
+
path: undefined,
|
|
392
|
+
type: 'unknown',
|
|
393
|
+
req: data.req,
|
|
394
|
+
});
|
|
395
|
+
respond(client, {
|
|
396
|
+
id: null,
|
|
397
|
+
error: (0, server_1.getErrorShape)({
|
|
398
|
+
config: router._def._config,
|
|
399
|
+
error,
|
|
400
|
+
type: 'unknown',
|
|
401
|
+
path: undefined,
|
|
402
|
+
input: undefined,
|
|
403
|
+
ctx: data.ctx,
|
|
404
|
+
}),
|
|
405
|
+
});
|
|
406
|
+
data.ctxCompleter.reject(error);
|
|
407
|
+
// close in next tick
|
|
408
|
+
(globalThis.setImmediate ?? globalThis.setTimeout)(() => {
|
|
409
|
+
client.end(1008);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
if (useConnectionParams) {
|
|
413
|
+
// fully consume first message
|
|
429
414
|
return;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
try {
|
|
418
|
+
await data.ctxCompleter.promise;
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// stop execution of pending requests when context could not be resolved
|
|
422
|
+
// single error message will be sent
|
|
423
|
+
return;
|
|
430
424
|
}
|
|
431
425
|
try {
|
|
432
426
|
const msgJSON = JSON.parse(msgStr);
|