@highstate/designer 0.7.2 → 0.7.4
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/0cvrggvQ.js +6 -0
- package/.output/public/_nuxt/25W9uPmb.js +6 -0
- package/.output/public/_nuxt/4Ik7cdeQ.js +8 -0
- package/.output/public/_nuxt/5Rap-vPy.js +6 -0
- package/.output/public/_nuxt/B03wrqEc.js +6 -0
- package/.output/public/_nuxt/B5zXfXm9.js +6 -0
- package/.output/public/_nuxt/B9Xyijhd.js +6 -0
- package/.output/public/_nuxt/BFG1Mk7z.js +6 -0
- package/.output/public/_nuxt/BIHI7g3E.js +1 -0
- package/.output/public/_nuxt/BKlk5iyT.js +6 -0
- package/.output/public/_nuxt/BSkB5QuD.js +6 -0
- package/.output/public/_nuxt/BWmkvLm_.js +9 -0
- package/.output/public/_nuxt/BY4ic99o.js +1 -0
- package/.output/public/_nuxt/B_c3zf-v.js +6 -0
- package/.output/public/_nuxt/B_fMsGYe.js +6 -0
- package/.output/public/_nuxt/BaJupSGV.js +6 -0
- package/.output/public/_nuxt/BaLxmfj-.js +6 -0
- package/.output/public/_nuxt/BaiHcgzs.js +6 -0
- package/.output/public/_nuxt/Bc-ZgV77.js +6 -0
- package/.output/public/_nuxt/BfEKNvv3.js +7 -0
- package/.output/public/_nuxt/Bhzvs7bI.js +6 -0
- package/.output/public/_nuxt/Bio4gycK.js +6 -0
- package/.output/public/_nuxt/BoFRg7Ot.js +6 -0
- package/.output/public/_nuxt/Bqgm2twL.js +6 -0
- package/.output/public/_nuxt/BrdhNivz.js +1 -0
- package/.output/public/_nuxt/BrgZPUOV.js +6 -0
- package/.output/public/_nuxt/BsTHnhdd.js +7 -0
- package/.output/public/_nuxt/C5WLch3f.js +6 -0
- package/.output/public/_nuxt/C7NrX02N.js +6 -0
- package/.output/public/_nuxt/CCSDG5nI.js +6 -0
- package/.output/public/_nuxt/CDGzqUPQ.js +6 -0
- package/.output/public/_nuxt/CDntyWJ8.js +6 -0
- package/.output/public/_nuxt/CFKIUWau.js +6 -0
- package/.output/public/_nuxt/CFOPXBzS.js +6 -0
- package/.output/public/_nuxt/CLLBncYj.js +6 -0
- package/.output/public/_nuxt/COyEY5Pt.js +7 -0
- package/.output/public/_nuxt/CPajHgWi.js +6 -0
- package/.output/public/_nuxt/CVwtpugi.js +6 -0
- package/.output/public/_nuxt/CWsALi_N.js +6 -0
- package/.output/public/_nuxt/CX-rkNHf.js +6 -0
- package/.output/public/_nuxt/CXOwvkN_.js +6 -0
- package/.output/public/_nuxt/CdQndTaG.js +6 -0
- package/.output/public/_nuxt/Ce3n6wWz.js +6 -0
- package/.output/public/_nuxt/Cg7bfA9N.js +6 -0
- package/.output/public/_nuxt/Ch4PGxFq.js +6 -0
- package/.output/public/_nuxt/Cp1zYvxS.js +6 -0
- package/.output/public/_nuxt/CpIb_Oan.js +6 -0
- package/.output/public/_nuxt/Cpb6xl2v.js +6 -0
- package/.output/public/_nuxt/Cphgjts3.js +6 -0
- package/.output/public/_nuxt/{CmGpyJTe.js → CrUIUSRQ.js} +1 -1
- package/.output/public/_nuxt/CwNk8-XU.js +6 -0
- package/.output/public/_nuxt/CxQiO5cn.js +8 -0
- package/.output/public/_nuxt/CzKuDChf.js +6 -0
- package/.output/public/_nuxt/D-MeaMDU.js +6 -0
- package/.output/public/_nuxt/D0A5LTnE.js +9 -0
- package/.output/public/_nuxt/D3h14YRZ.js +8 -0
- package/.output/public/_nuxt/D5C2fndG.js +6 -0
- package/.output/public/_nuxt/DDwshQtU.js +6 -0
- package/.output/public/_nuxt/DFGrbNda.js +16 -0
- package/.output/public/_nuxt/DGinXpNd.js +6 -0
- package/.output/public/_nuxt/DHaeiCBh.js +6 -0
- package/.output/public/_nuxt/DHbdnjwW.js +6 -0
- package/.output/public/_nuxt/DSZPf7rp.js +6 -0
- package/.output/public/_nuxt/DTECt2xU.js +6 -0
- package/.output/public/_nuxt/DXyYeYxl.js +6 -0
- package/.output/public/_nuxt/DYQUnd45.js +303 -0
- package/.output/public/_nuxt/Dd3NCNK9.js +6 -0
- package/.output/public/_nuxt/DfzH4Xui.js +6 -0
- package/.output/public/_nuxt/DgpMLyT9.js +6 -0
- package/.output/public/_nuxt/DgyLZaXg.js +6 -0
- package/.output/public/_nuxt/DnHyzjbg.js +6 -0
- package/.output/public/_nuxt/DqxlV1Dz.js +6 -0
- package/.output/public/_nuxt/DrQuvNYM.js +6 -0
- package/.output/public/_nuxt/Drc7WvVn.js +6 -0
- package/.output/public/_nuxt/DtSS2RIy.js +6 -0
- package/.output/public/_nuxt/DwJ7jVG9.js +8 -0
- package/.output/public/_nuxt/DwN8ib1V.js +1111 -0
- package/.output/public/_nuxt/DyP6w7ZV.js +6 -0
- package/.output/public/_nuxt/Tw7wswEv.js +6 -0
- package/.output/public/_nuxt/YWi4-JPR.js +6 -0
- package/.output/public/_nuxt/Zznr-cwX.js +6 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/3c52625f-fbe1-4d7a-b238-1f1c3696fd48.json +1 -0
- package/.output/public/_nuxt/codicon.DCmgc-ay.ttf +0 -0
- package/.output/public/_nuxt/dUCx_-0o.js +6 -0
- package/.output/public/_nuxt/deUWdS0T.js +6 -0
- package/.output/public/_nuxt/edge-router-BFNVMcBx.js +4 -0
- package/.output/public/_nuxt/editor.worker-B6Jl4jUd.js +12 -0
- package/.output/public/_nuxt/entry.BD0Qz9HR.css +5 -0
- package/.output/public/_nuxt/error-404.D7tj2jQK.css +1 -0
- package/.output/public/_nuxt/gYnoVL96.js +6 -0
- package/.output/public/_nuxt/graph-resolver-Y9hmyS-J.js +8 -0
- package/.output/public/_nuxt/i9-g7ZhI.js +6 -0
- package/.output/public/_nuxt/jDosRYr7.js +15 -0
- package/.output/public/_nuxt/nf6ki56Z.js +6 -0
- package/.output/public/_nuxt/pnP8ivHi.js +6 -0
- package/.output/public/_nuxt/rUNN04Wq.js +6 -0
- package/.output/public/_nuxt/tGk8EFnU.js +6 -0
- package/.output/public/_nuxt/yaml.worker-B8S0iqeR.js +411 -0
- package/.output/server/index.mjs +3298 -1536
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/@trpc/server/dist/adapters/ws.mjs +521 -0
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/procedure.mjs +7 -0
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/rpc/parseTRPCMessage.mjs +61 -0
- package/.output/server/node_modules/ws/lib/buffer-util.js +131 -0
- package/.output/server/node_modules/ws/lib/constants.js +18 -0
- package/.output/server/node_modules/ws/lib/event-target.js +292 -0
- package/.output/server/node_modules/ws/lib/extension.js +203 -0
- package/.output/server/node_modules/ws/lib/limiter.js +55 -0
- package/.output/server/node_modules/ws/lib/permessage-deflate.js +514 -0
- package/.output/server/node_modules/ws/lib/receiver.js +706 -0
- package/.output/server/node_modules/ws/lib/sender.js +602 -0
- package/.output/server/node_modules/ws/lib/stream.js +161 -0
- package/.output/server/node_modules/ws/lib/subprotocol.js +62 -0
- package/.output/server/node_modules/ws/lib/validation.js +152 -0
- package/.output/server/node_modules/ws/lib/websocket-server.js +540 -0
- package/.output/server/node_modules/ws/lib/websocket.js +1388 -0
- package/.output/server/node_modules/ws/package.json +69 -0
- package/.output/server/node_modules/ws/wrapper.mjs +8 -0
- package/.output/server/package.json +1 -1
- package/package.json +14 -7
- package/.output/public/_nuxt/1_b4y8eQ.js +0 -1
- package/.output/public/_nuxt/BjOhMR1f.js +0 -242
- package/.output/public/_nuxt/CPAAHz3G.js +0 -1
- package/.output/public/_nuxt/builds/meta/f777d22c-e958-4e7c-865d-11bb8a560858.json +0 -1
- package/.output/public/_nuxt/entry.Vs8IncyG.css +0 -5
- package/.output/public/_nuxt/error-404.BJkSn6RI.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../node_modules/uncrypto/dist/crypto.node.mjs","../../../node_modules/crossws/dist/shared/crossws.BS81iGZK.mjs","../../../node_modules/crossws/dist/shared/crossws.D9ehKjSh.mjs","../../../node_modules/crossws/dist/shared/crossws.By9qWDAI.mjs","../../../node_modules/crossws/dist/shared/crossws.DelSCW9g.mjs","../../../node_modules/crossws/dist/adapters/node.mjs","../../../node_modules/destr/dist/index.mjs","../../../node_modules/ufo/dist/index.mjs","../../../node_modules/radix3/dist/index.mjs","../../../node_modules/defu/dist/defu.mjs","../../../node_modules/node-mock-http/dist/index.mjs","../../../node_modules/h3/dist/index.mjs","../../../node_modules/hookable/dist/index.mjs","../../../node_modules/node-fetch-native/dist/native.mjs","../../../node_modules/ofetch/dist/shared/ofetch.03887fc3.mjs","../../../node_modules/ofetch/dist/node.mjs","../../../node_modules/unstorage/dist/shared/unstorage.mNKHTF5Y.mjs","../../../node_modules/unstorage/dist/index.mjs","../../../node_modules/unstorage/drivers/utils/index.mjs","../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../node_modules/klona/dist/index.mjs","../../../node_modules/scule/dist/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../node_modules/unctx/dist/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../node_modules/nuxt/dist/core/runtime/nitro/utils/error.js","../../../node_modules/nuxt/dist/core/runtime/nitro/handlers/error.js","../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs","../../../node_modules/nuxt/dist/core/runtime/nitro/templates/error-500.js","../../../node_modules/trpc-nuxt/dist/chunk-MM6UCDX3.js","../../../node_modules/trpc-nuxt/dist/chunk-LKZQEGDV.js","../../server/trpc.ts","../../server/
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../node_modules/uncrypto/dist/crypto.node.mjs","../../../node_modules/crossws/dist/shared/crossws.BS81iGZK.mjs","../../../node_modules/crossws/dist/shared/crossws.D9ehKjSh.mjs","../../../node_modules/crossws/dist/shared/crossws.By9qWDAI.mjs","../../../node_modules/crossws/dist/shared/crossws.DelSCW9g.mjs","../../../node_modules/crossws/dist/adapters/node.mjs","../../../node_modules/destr/dist/index.mjs","../../../node_modules/ufo/dist/index.mjs","../../../node_modules/radix3/dist/index.mjs","../../../node_modules/defu/dist/defu.mjs","../../../node_modules/node-mock-http/dist/index.mjs","../../../node_modules/h3/dist/index.mjs","../../../node_modules/hookable/dist/index.mjs","../../../node_modules/node-fetch-native/dist/native.mjs","../../../node_modules/ofetch/dist/shared/ofetch.03887fc3.mjs","../../../node_modules/ofetch/dist/node.mjs","../../../node_modules/unstorage/dist/shared/unstorage.mNKHTF5Y.mjs","../../../node_modules/unstorage/dist/index.mjs","../../../node_modules/unstorage/drivers/utils/index.mjs","../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../node_modules/klona/dist/index.mjs","../../../node_modules/scule/dist/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../node_modules/unctx/dist/index.mjs","../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../node_modules/nuxt/dist/core/runtime/nitro/utils/error.js","../../../node_modules/nuxt/dist/core/runtime/nitro/handlers/error.js","../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../server/trpc.ts","../../server/routers/state.ts","../../server/routers/secret.ts","../../server/routers/project.ts","../../server/routers/library.ts","../../server/routers/workspace.ts","../../server/routers/terminal.ts","../../server/routers/operation.ts","../../server/routers/logs.ts","../../server/router.ts","../../server/plugins/events.ts","../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs","../../../node_modules/nuxt/dist/core/runtime/nitro/templates/error-500.js","../../../node_modules/trpc-nuxt/dist/chunk-MM6UCDX3.js","../../../node_modules/trpc-nuxt/dist/chunk-LKZQEGDV.js","../../server/api/[trpc].ts","../../server/api/projects/[projectId]/instances/[instanceId]/files/[name].ts","../../server/api/projects/[projectId]/instances/[instanceId]/terminalSessions/[id].ts","../../../node_modules/@unhead/vue/dist/shared/vue.N9zWjxoK.mjs","../../../node_modules/@unhead/vue/dist/shared/vue.BYLJNEcq.mjs","../../../node_modules/@unhead/vue/dist/server.mjs","../../../node_modules/nuxt/dist/core/runtime/nitro/utils/paths.js","../../../node_modules/nuxt/dist/core/runtime/nitro/utils/build-files.js","../../../node_modules/nuxt/dist/core/runtime/nitro/utils/payload.js","../../../node_modules/nuxt/dist/core/runtime/nitro/handlers/renderer.js","../../.nuxt/dist/server/client.manifest.mjs"],"sourcesContent":null,"names":["isPlainObject","getQuery","createRouter","f","h","i","l","createError","mergeHeaders","s","nodeFetch","Headers","Headers$1","AbortController","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","_inlineAppConfig","createRadixRouter","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer","wsAdapter","template","file","stringify"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,49,50,51,52,53,54,55,56,57,58,62,63,64,65,66,67,68]}
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { getErrorShape } from '../unstable-core-do-not-import/error/getErrorShape.mjs';
|
|
2
|
+
import { TRPCError, getTRPCErrorFromUnknown } from '../unstable-core-do-not-import/error/TRPCError.mjs';
|
|
3
|
+
import { callProcedure } from '../unstable-core-do-not-import/router.mjs';
|
|
4
|
+
import { run, isObject, isAsyncIterable } from '../unstable-core-do-not-import/utils.mjs';
|
|
5
|
+
import { parseConnectionParamsFromUnknown } from '../unstable-core-do-not-import/http/parseConnectionParams.mjs';
|
|
6
|
+
import { parseTRPCMessage } from '../unstable-core-do-not-import/rpc/parseTRPCMessage.mjs';
|
|
7
|
+
import { isObservable, observableToAsyncIterable } from '../observable/observable.mjs';
|
|
8
|
+
import { iteratorResource } from '../unstable-core-do-not-import/stream/utils/asyncIterable.mjs';
|
|
9
|
+
import '../unstable-core-do-not-import/stream/utils/disposable.mjs';
|
|
10
|
+
import { Unpromise } from '../vendor/unpromise/unpromise.mjs';
|
|
11
|
+
import { isTrackedEnvelope } from '../unstable-core-do-not-import/stream/tracked.mjs';
|
|
12
|
+
import { transformTRPCResponse } from '../unstable-core-do-not-import/transformer.mjs';
|
|
13
|
+
import '../unstable-core-do-not-import/rootConfig.mjs';
|
|
14
|
+
import { createURL } from './node-http/incomingMessageToRequest.mjs';
|
|
15
|
+
|
|
16
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
17
|
+
if (value !== null && value !== void 0) {
|
|
18
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
19
|
+
var dispose, inner;
|
|
20
|
+
{
|
|
21
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
22
|
+
dispose = value[Symbol.asyncDispose];
|
|
23
|
+
}
|
|
24
|
+
if (dispose === void 0) {
|
|
25
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
26
|
+
dispose = value[Symbol.dispose];
|
|
27
|
+
inner = dispose;
|
|
28
|
+
}
|
|
29
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
30
|
+
if (inner) dispose = function() {
|
|
31
|
+
try {
|
|
32
|
+
inner.call(this);
|
|
33
|
+
} catch (e) {
|
|
34
|
+
return Promise.reject(e);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
env.stack.push({
|
|
38
|
+
value: value,
|
|
39
|
+
dispose: dispose,
|
|
40
|
+
async: async
|
|
41
|
+
});
|
|
42
|
+
} else {
|
|
43
|
+
env.stack.push({
|
|
44
|
+
async: true
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function _ts_dispose_resources(env) {
|
|
50
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
51
|
+
var e = new Error(message);
|
|
52
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
53
|
+
};
|
|
54
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
55
|
+
function fail(e) {
|
|
56
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
57
|
+
env.hasError = true;
|
|
58
|
+
}
|
|
59
|
+
var r, s = 0;
|
|
60
|
+
function next() {
|
|
61
|
+
while(r = env.stack.pop()){
|
|
62
|
+
try {
|
|
63
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
64
|
+
if (r.dispose) {
|
|
65
|
+
var result = r.dispose.call(r.value);
|
|
66
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
67
|
+
fail(e);
|
|
68
|
+
return next();
|
|
69
|
+
});
|
|
70
|
+
} else s |= 1;
|
|
71
|
+
} catch (e) {
|
|
72
|
+
fail(e);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
76
|
+
if (env.hasError) throw env.error;
|
|
77
|
+
}
|
|
78
|
+
return next();
|
|
79
|
+
})(env);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Importing ws causes a build error
|
|
83
|
+
* @see https://github.com/trpc/trpc/pull/5279
|
|
84
|
+
*/ const WEBSOCKET_OPEN = 1; /* ws.WebSocket.OPEN */
|
|
85
|
+
const unsetContextPromiseSymbol = Symbol('unsetContextPromise');
|
|
86
|
+
function getWSConnectionHandler(opts) {
|
|
87
|
+
const { createContext, router } = opts;
|
|
88
|
+
const { transformer } = router._def._config;
|
|
89
|
+
return async (client, req)=>{
|
|
90
|
+
const clientSubscriptions = new Map();
|
|
91
|
+
const abortController = new AbortController();
|
|
92
|
+
if (opts.keepAlive?.enabled) {
|
|
93
|
+
const { pingMs, pongWaitMs } = opts.keepAlive;
|
|
94
|
+
handleKeepAlive(client, pingMs, pongWaitMs);
|
|
95
|
+
}
|
|
96
|
+
function respond(untransformedJSON) {
|
|
97
|
+
client.send(JSON.stringify(transformTRPCResponse(router._def._config, untransformedJSON)));
|
|
98
|
+
}
|
|
99
|
+
function createCtxPromise(getConnectionParams) {
|
|
100
|
+
return run(async ()=>{
|
|
101
|
+
ctx = await createContext?.({
|
|
102
|
+
req,
|
|
103
|
+
res: client,
|
|
104
|
+
info: {
|
|
105
|
+
connectionParams: getConnectionParams(),
|
|
106
|
+
calls: [],
|
|
107
|
+
isBatchCall: false,
|
|
108
|
+
accept: null,
|
|
109
|
+
type: 'unknown',
|
|
110
|
+
signal: abortController.signal,
|
|
111
|
+
url: null
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return ctx;
|
|
115
|
+
}).catch((cause)=>{
|
|
116
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
117
|
+
opts.onError?.({
|
|
118
|
+
error,
|
|
119
|
+
path: undefined,
|
|
120
|
+
type: 'unknown',
|
|
121
|
+
ctx,
|
|
122
|
+
req,
|
|
123
|
+
input: undefined
|
|
124
|
+
});
|
|
125
|
+
respond({
|
|
126
|
+
id: null,
|
|
127
|
+
error: getErrorShape({
|
|
128
|
+
config: router._def._config,
|
|
129
|
+
error,
|
|
130
|
+
type: 'unknown',
|
|
131
|
+
path: undefined,
|
|
132
|
+
input: undefined,
|
|
133
|
+
ctx
|
|
134
|
+
})
|
|
135
|
+
});
|
|
136
|
+
// close in next tick
|
|
137
|
+
(globalThis.setImmediate ?? globalThis.setTimeout)(()=>{
|
|
138
|
+
client.close();
|
|
139
|
+
});
|
|
140
|
+
throw error;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
let ctx = undefined;
|
|
144
|
+
/**
|
|
145
|
+
* promise for initializing the context
|
|
146
|
+
*
|
|
147
|
+
* - the context promise will be created immediately on connection if no connectionParams are expected
|
|
148
|
+
* - if connection params are expected, they will be created once received
|
|
149
|
+
*/ let ctxPromise = createURL(req).searchParams.get('connectionParams') === '1' ? unsetContextPromiseSymbol : createCtxPromise(()=>null);
|
|
150
|
+
async function handleRequest(msg) {
|
|
151
|
+
const { id, jsonrpc } = msg;
|
|
152
|
+
/* istanbul ignore next -- @preserve */ if (id === null) {
|
|
153
|
+
throw new TRPCError({
|
|
154
|
+
code: 'BAD_REQUEST',
|
|
155
|
+
message: '`id` is required'
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (msg.method === 'subscription.stop') {
|
|
159
|
+
clientSubscriptions.get(id)?.abort();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const { path, lastEventId } = msg.params;
|
|
163
|
+
let { input } = msg.params;
|
|
164
|
+
const type = msg.method;
|
|
165
|
+
try {
|
|
166
|
+
if (lastEventId !== undefined) {
|
|
167
|
+
if (isObject(input)) {
|
|
168
|
+
input = {
|
|
169
|
+
...input,
|
|
170
|
+
lastEventId: lastEventId
|
|
171
|
+
};
|
|
172
|
+
} else {
|
|
173
|
+
input ?? (input = {
|
|
174
|
+
lastEventId: lastEventId
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
await ctxPromise; // asserts context has been set
|
|
179
|
+
const abortController = new AbortController();
|
|
180
|
+
const result = await callProcedure({
|
|
181
|
+
router,
|
|
182
|
+
path,
|
|
183
|
+
getRawInput: async ()=>input,
|
|
184
|
+
ctx,
|
|
185
|
+
type,
|
|
186
|
+
signal: abortController.signal
|
|
187
|
+
});
|
|
188
|
+
const isIterableResult = isAsyncIterable(result) || isObservable(result);
|
|
189
|
+
if (type !== 'subscription') {
|
|
190
|
+
if (isIterableResult) {
|
|
191
|
+
throw new TRPCError({
|
|
192
|
+
code: 'UNSUPPORTED_MEDIA_TYPE',
|
|
193
|
+
message: `Cannot return an async iterable or observable from a ${type} procedure with WebSockets`
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// send the value as data if the method is not a subscription
|
|
197
|
+
respond({
|
|
198
|
+
id,
|
|
199
|
+
jsonrpc,
|
|
200
|
+
result: {
|
|
201
|
+
type: 'data',
|
|
202
|
+
data: result
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (!isIterableResult) {
|
|
208
|
+
throw new TRPCError({
|
|
209
|
+
message: `Subscription ${path} did not return an observable or a AsyncGenerator`,
|
|
210
|
+
code: 'INTERNAL_SERVER_ERROR'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/* istanbul ignore next -- @preserve */ if (client.readyState !== WEBSOCKET_OPEN) {
|
|
214
|
+
// if the client got disconnected whilst initializing the subscription
|
|
215
|
+
// no need to send stopped message if the client is disconnected
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
/* istanbul ignore next -- @preserve */ if (clientSubscriptions.has(id)) {
|
|
219
|
+
// duplicate request ids for client
|
|
220
|
+
throw new TRPCError({
|
|
221
|
+
message: `Duplicate id ${id}`,
|
|
222
|
+
code: 'BAD_REQUEST'
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const iterable = isObservable(result) ? observableToAsyncIterable(result, abortController.signal) : result;
|
|
226
|
+
run(async ()=>{
|
|
227
|
+
const env = {
|
|
228
|
+
stack: [],
|
|
229
|
+
error: void 0,
|
|
230
|
+
hasError: false
|
|
231
|
+
};
|
|
232
|
+
try {
|
|
233
|
+
const iterator = _ts_add_disposable_resource(env, iteratorResource(iterable), true);
|
|
234
|
+
;
|
|
235
|
+
const abortPromise = new Promise((resolve)=>{
|
|
236
|
+
abortController.signal.onabort = ()=>resolve('abort');
|
|
237
|
+
});
|
|
238
|
+
// We need those declarations outside the loop for garbage collection reasons. If they
|
|
239
|
+
// were declared inside, they would not be freed until the next value is present.
|
|
240
|
+
let next;
|
|
241
|
+
let result;
|
|
242
|
+
while(true){
|
|
243
|
+
next = await Unpromise.race([
|
|
244
|
+
iterator.next().catch(getTRPCErrorFromUnknown),
|
|
245
|
+
abortPromise
|
|
246
|
+
]);
|
|
247
|
+
if (next === 'abort') {
|
|
248
|
+
await iterator.return?.();
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
if (next instanceof Error) {
|
|
252
|
+
const error = getTRPCErrorFromUnknown(next);
|
|
253
|
+
opts.onError?.({
|
|
254
|
+
error,
|
|
255
|
+
path,
|
|
256
|
+
type,
|
|
257
|
+
ctx,
|
|
258
|
+
req,
|
|
259
|
+
input
|
|
260
|
+
});
|
|
261
|
+
respond({
|
|
262
|
+
id,
|
|
263
|
+
jsonrpc,
|
|
264
|
+
error: getErrorShape({
|
|
265
|
+
config: router._def._config,
|
|
266
|
+
error,
|
|
267
|
+
type,
|
|
268
|
+
path,
|
|
269
|
+
input,
|
|
270
|
+
ctx
|
|
271
|
+
})
|
|
272
|
+
});
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
if (next.done) {
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
result = {
|
|
279
|
+
type: 'data',
|
|
280
|
+
data: next.value
|
|
281
|
+
};
|
|
282
|
+
if (isTrackedEnvelope(next.value)) {
|
|
283
|
+
const [id, data] = next.value;
|
|
284
|
+
result.id = id;
|
|
285
|
+
result.data = {
|
|
286
|
+
id,
|
|
287
|
+
data
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
respond({
|
|
291
|
+
id,
|
|
292
|
+
jsonrpc,
|
|
293
|
+
result
|
|
294
|
+
});
|
|
295
|
+
// free up references for garbage collection
|
|
296
|
+
next = null;
|
|
297
|
+
result = null;
|
|
298
|
+
}
|
|
299
|
+
respond({
|
|
300
|
+
id,
|
|
301
|
+
jsonrpc,
|
|
302
|
+
result: {
|
|
303
|
+
type: 'stopped'
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
clientSubscriptions.delete(id);
|
|
307
|
+
} catch (e) {
|
|
308
|
+
env.error = e;
|
|
309
|
+
env.hasError = true;
|
|
310
|
+
} finally{
|
|
311
|
+
const result = _ts_dispose_resources(env);
|
|
312
|
+
if (result) await result;
|
|
313
|
+
}
|
|
314
|
+
}).catch((cause)=>{
|
|
315
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
316
|
+
opts.onError?.({
|
|
317
|
+
error,
|
|
318
|
+
path,
|
|
319
|
+
type,
|
|
320
|
+
ctx,
|
|
321
|
+
req,
|
|
322
|
+
input
|
|
323
|
+
});
|
|
324
|
+
respond({
|
|
325
|
+
id,
|
|
326
|
+
jsonrpc,
|
|
327
|
+
error: getErrorShape({
|
|
328
|
+
config: router._def._config,
|
|
329
|
+
error,
|
|
330
|
+
type,
|
|
331
|
+
path,
|
|
332
|
+
input,
|
|
333
|
+
ctx
|
|
334
|
+
})
|
|
335
|
+
});
|
|
336
|
+
abortController.abort();
|
|
337
|
+
});
|
|
338
|
+
clientSubscriptions.set(id, abortController);
|
|
339
|
+
respond({
|
|
340
|
+
id,
|
|
341
|
+
jsonrpc,
|
|
342
|
+
result: {
|
|
343
|
+
type: 'started'
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
} catch (cause) /* istanbul ignore next -- @preserve */ {
|
|
347
|
+
// procedure threw an error
|
|
348
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
349
|
+
opts.onError?.({
|
|
350
|
+
error,
|
|
351
|
+
path,
|
|
352
|
+
type,
|
|
353
|
+
ctx,
|
|
354
|
+
req,
|
|
355
|
+
input
|
|
356
|
+
});
|
|
357
|
+
respond({
|
|
358
|
+
id,
|
|
359
|
+
jsonrpc,
|
|
360
|
+
error: getErrorShape({
|
|
361
|
+
config: router._def._config,
|
|
362
|
+
error,
|
|
363
|
+
type,
|
|
364
|
+
path,
|
|
365
|
+
input,
|
|
366
|
+
ctx
|
|
367
|
+
})
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
client.on('message', async (rawData)=>{
|
|
372
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
373
|
+
const msgStr = rawData.toString();
|
|
374
|
+
if (msgStr === 'PONG') {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
if (msgStr === 'PING') {
|
|
378
|
+
if (!opts.dangerouslyDisablePong) {
|
|
379
|
+
client.send('PONG');
|
|
380
|
+
}
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (ctxPromise === unsetContextPromiseSymbol) {
|
|
384
|
+
// If the ctxPromise wasn't created immediately, we're expecting the first message to be a TRPCConnectionParamsMessage
|
|
385
|
+
ctxPromise = createCtxPromise(()=>{
|
|
386
|
+
let msg;
|
|
387
|
+
try {
|
|
388
|
+
msg = JSON.parse(msgStr);
|
|
389
|
+
if (!isObject(msg)) {
|
|
390
|
+
throw new Error('Message was not an object');
|
|
391
|
+
}
|
|
392
|
+
} catch (cause) {
|
|
393
|
+
throw new TRPCError({
|
|
394
|
+
code: 'PARSE_ERROR',
|
|
395
|
+
message: `Malformed TRPCConnectionParamsMessage`,
|
|
396
|
+
cause
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
const connectionParams = parseConnectionParamsFromUnknown(msg.data);
|
|
400
|
+
return connectionParams;
|
|
401
|
+
});
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
try {
|
|
405
|
+
const msgJSON = JSON.parse(msgStr);
|
|
406
|
+
const msgs = Array.isArray(msgJSON) ? msgJSON : [
|
|
407
|
+
msgJSON
|
|
408
|
+
];
|
|
409
|
+
const promises = msgs.map((raw)=>parseTRPCMessage(raw, transformer)).map(handleRequest);
|
|
410
|
+
await Promise.all(promises);
|
|
411
|
+
} catch (cause) {
|
|
412
|
+
const error = new TRPCError({
|
|
413
|
+
code: 'PARSE_ERROR',
|
|
414
|
+
cause
|
|
415
|
+
});
|
|
416
|
+
respond({
|
|
417
|
+
id: null,
|
|
418
|
+
error: getErrorShape({
|
|
419
|
+
config: router._def._config,
|
|
420
|
+
error,
|
|
421
|
+
type: 'unknown',
|
|
422
|
+
path: undefined,
|
|
423
|
+
input: undefined,
|
|
424
|
+
ctx: undefined
|
|
425
|
+
})
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
// WebSocket errors should be handled, as otherwise unhandled exceptions will crash Node.js.
|
|
430
|
+
// This line was introduced after the following error brought down production systems:
|
|
431
|
+
// "RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear"
|
|
432
|
+
// Here is the relevant discussion: https://github.com/websockets/ws/issues/1354#issuecomment-774616962
|
|
433
|
+
client.on('error', (cause)=>{
|
|
434
|
+
opts.onError?.({
|
|
435
|
+
ctx,
|
|
436
|
+
error: getTRPCErrorFromUnknown(cause),
|
|
437
|
+
input: undefined,
|
|
438
|
+
path: undefined,
|
|
439
|
+
type: 'unknown',
|
|
440
|
+
req
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
client.once('close', ()=>{
|
|
444
|
+
for (const sub of clientSubscriptions.values()){
|
|
445
|
+
sub.abort();
|
|
446
|
+
}
|
|
447
|
+
clientSubscriptions.clear();
|
|
448
|
+
abortController.abort();
|
|
449
|
+
});
|
|
450
|
+
if (ctxPromise !== unsetContextPromiseSymbol) {
|
|
451
|
+
await ctxPromise;
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Handle WebSocket keep-alive messages
|
|
457
|
+
*/ function handleKeepAlive(client, pingMs = 30000, pongWaitMs = 5000) {
|
|
458
|
+
let timeout = undefined;
|
|
459
|
+
let ping = undefined;
|
|
460
|
+
const schedulePing = ()=>{
|
|
461
|
+
const scheduleTimeout = ()=>{
|
|
462
|
+
timeout = setTimeout(()=>{
|
|
463
|
+
client.terminate();
|
|
464
|
+
}, pongWaitMs);
|
|
465
|
+
};
|
|
466
|
+
ping = setTimeout(()=>{
|
|
467
|
+
client.send('PING');
|
|
468
|
+
scheduleTimeout();
|
|
469
|
+
}, pingMs);
|
|
470
|
+
};
|
|
471
|
+
const onMessage = ()=>{
|
|
472
|
+
clearTimeout(ping);
|
|
473
|
+
clearTimeout(timeout);
|
|
474
|
+
schedulePing();
|
|
475
|
+
};
|
|
476
|
+
client.on('message', onMessage);
|
|
477
|
+
client.on('close', ()=>{
|
|
478
|
+
clearTimeout(ping);
|
|
479
|
+
clearTimeout(timeout);
|
|
480
|
+
});
|
|
481
|
+
schedulePing();
|
|
482
|
+
}
|
|
483
|
+
function applyWSSHandler(opts) {
|
|
484
|
+
const onConnection = getWSConnectionHandler(opts);
|
|
485
|
+
opts.wss.on('connection', (client, req)=>{
|
|
486
|
+
if (opts.prefix && !req.url?.startsWith(opts.prefix)) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
onConnection(client, req).catch((cause)=>{
|
|
490
|
+
opts.onError?.({
|
|
491
|
+
error: new TRPCError({
|
|
492
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
493
|
+
cause,
|
|
494
|
+
message: 'Failed to handle WebSocket connection'
|
|
495
|
+
}),
|
|
496
|
+
req: req,
|
|
497
|
+
path: undefined,
|
|
498
|
+
type: 'unknown',
|
|
499
|
+
ctx: undefined,
|
|
500
|
+
input: undefined
|
|
501
|
+
});
|
|
502
|
+
client.close();
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
return {
|
|
506
|
+
broadcastReconnectNotification: ()=>{
|
|
507
|
+
const response = {
|
|
508
|
+
id: null,
|
|
509
|
+
method: 'reconnect'
|
|
510
|
+
};
|
|
511
|
+
const data = JSON.stringify(response);
|
|
512
|
+
for (const client of opts.wss.clients){
|
|
513
|
+
if (client.readyState === WEBSOCKET_OPEN) {
|
|
514
|
+
client.send(data);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
export { applyWSSHandler, getWSConnectionHandler, handleKeepAlive };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { procedureTypes } from '../procedure.mjs';
|
|
2
|
+
import { isObject } from '../utils.mjs';
|
|
3
|
+
|
|
4
|
+
/* istanbul ignore next -- @preserve */ function assertIsObject(obj) {
|
|
5
|
+
if (!isObject(obj)) {
|
|
6
|
+
throw new Error('Not an object');
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/* istanbul ignore next -- @preserve */ function assertIsProcedureType(obj) {
|
|
10
|
+
if (!procedureTypes.includes(obj)) {
|
|
11
|
+
throw new Error('Invalid procedure type');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/* istanbul ignore next -- @preserve */ function assertIsRequestId(obj) {
|
|
15
|
+
if (obj !== null && typeof obj === 'number' && isNaN(obj) && typeof obj !== 'string') {
|
|
16
|
+
throw new Error('Invalid request id');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/* istanbul ignore next -- @preserve */ function assertIsString(obj) {
|
|
20
|
+
if (typeof obj !== 'string') {
|
|
21
|
+
throw new Error('Invalid string');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/* istanbul ignore next -- @preserve */ function assertIsJSONRPC2OrUndefined(obj) {
|
|
25
|
+
if (typeof obj !== 'undefined' && obj !== '2.0') {
|
|
26
|
+
throw new Error('Must be JSONRPC 2.0');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** @public */ function parseTRPCMessage(obj, transformer) {
|
|
30
|
+
assertIsObject(obj);
|
|
31
|
+
const { id, jsonrpc, method, params } = obj;
|
|
32
|
+
assertIsRequestId(id);
|
|
33
|
+
assertIsJSONRPC2OrUndefined(jsonrpc);
|
|
34
|
+
if (method === 'subscription.stop') {
|
|
35
|
+
return {
|
|
36
|
+
id,
|
|
37
|
+
jsonrpc,
|
|
38
|
+
method
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
assertIsProcedureType(method);
|
|
42
|
+
assertIsObject(params);
|
|
43
|
+
const { input: rawInput, path, lastEventId } = params;
|
|
44
|
+
assertIsString(path);
|
|
45
|
+
if (lastEventId !== undefined) {
|
|
46
|
+
assertIsString(lastEventId);
|
|
47
|
+
}
|
|
48
|
+
const input = transformer.input.deserialize(rawInput);
|
|
49
|
+
return {
|
|
50
|
+
id,
|
|
51
|
+
jsonrpc,
|
|
52
|
+
method,
|
|
53
|
+
params: {
|
|
54
|
+
input,
|
|
55
|
+
path,
|
|
56
|
+
lastEventId
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { parseTRPCMessage };
|