@powerlines/engine 0.47.3 → 0.49.1
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/api/build.cjs +66 -0
- package/dist/api/build.d.cts +14 -0
- package/dist/api/build.d.cts.map +1 -0
- package/dist/api/build.d.mts +14 -0
- package/dist/api/build.d.mts.map +1 -0
- package/dist/api/build.mjs +64 -0
- package/dist/api/build.mjs.map +1 -0
- package/dist/api/clean.cjs +28 -0
- package/dist/api/clean.d.cts +14 -0
- package/dist/api/clean.d.cts.map +1 -0
- package/dist/api/clean.d.mts +14 -0
- package/dist/api/clean.d.mts.map +1 -0
- package/dist/api/clean.mjs +28 -0
- package/dist/api/clean.mjs.map +1 -0
- package/dist/api/create.cjs +59 -0
- package/dist/api/create.d.cts +14 -0
- package/dist/api/create.d.cts.map +1 -0
- package/dist/api/create.d.mts +14 -0
- package/dist/api/create.d.mts.map +1 -0
- package/dist/api/create.mjs +57 -0
- package/dist/api/create.mjs.map +1 -0
- package/dist/api/deploy.cjs +24 -0
- package/dist/api/deploy.d.cts +17 -0
- package/dist/api/deploy.d.cts.map +1 -0
- package/dist/api/deploy.d.mts +17 -0
- package/dist/api/deploy.d.mts.map +1 -0
- package/dist/api/deploy.mjs +24 -0
- package/dist/api/deploy.mjs.map +1 -0
- package/dist/api/docs.cjs +24 -0
- package/dist/api/docs.d.cts +17 -0
- package/dist/api/docs.d.cts.map +1 -0
- package/dist/api/docs.d.mts +17 -0
- package/dist/api/docs.d.mts.map +1 -0
- package/dist/api/docs.mjs +24 -0
- package/dist/api/docs.mjs.map +1 -0
- package/dist/api/lint.cjs +27 -0
- package/dist/api/lint.d.cts +17 -0
- package/dist/api/lint.d.cts.map +1 -0
- package/dist/api/lint.d.mts +17 -0
- package/dist/api/lint.d.mts.map +1 -0
- package/dist/api/lint.mjs +27 -0
- package/dist/api/lint.mjs.map +1 -0
- package/dist/api/prepare.cjs +68 -0
- package/dist/api/prepare.d.cts +14 -0
- package/dist/api/prepare.d.cts.map +1 -0
- package/dist/api/prepare.d.mts +14 -0
- package/dist/api/prepare.d.mts.map +1 -0
- package/dist/api/prepare.mjs +68 -0
- package/dist/api/prepare.mjs.map +1 -0
- package/dist/api/test.cjs +27 -0
- package/dist/api/test.d.cts +17 -0
- package/dist/api/test.d.cts.map +1 -0
- package/dist/api/test.d.mts +17 -0
- package/dist/api/test.d.mts.map +1 -0
- package/dist/api/test.mjs +27 -0
- package/dist/api/test.mjs.map +1 -0
- package/dist/api/types.cjs +70 -0
- package/dist/api/types.d.cts +17 -0
- package/dist/api/types.d.cts.map +1 -0
- package/dist/api/types.d.mts +17 -0
- package/dist/api/types.d.mts.map +1 -0
- package/dist/api/types.mjs +70 -0
- package/dist/api/types.mjs.map +1 -0
- package/dist/api-BgyEi2hF.d.mts +138 -0
- package/dist/api-BgyEi2hF.d.mts.map +1 -0
- package/dist/api-DcHfCjQK.d.cts +138 -0
- package/dist/api-DcHfCjQK.d.cts.map +1 -0
- package/dist/api.cjs +39 -1268
- package/dist/api.d.cts +11 -300
- package/dist/api.d.cts.map +1 -1
- package/dist/api.d.mts +11 -300
- package/dist/api.d.mts.map +1 -1
- package/dist/api.mjs +31 -1264
- package/dist/api.mjs.map +1 -1
- package/dist/config-ByLyzMI0.d.mts +204 -0
- package/dist/config-ByLyzMI0.d.mts.map +1 -0
- package/dist/config-DKEmqMrh.d.cts +204 -0
- package/dist/config-DKEmqMrh.d.cts.map +1 -0
- package/dist/context/engine-context.cjs +177 -0
- package/dist/context/engine-context.d.cts +2 -0
- package/dist/context/engine-context.d.mts +2 -0
- package/dist/context/engine-context.mjs +175 -0
- package/dist/context/engine-context.mjs.map +1 -0
- package/dist/context/index.cjs +2 -9
- package/dist/context/index.d.cts +2 -150
- package/dist/context/index.d.mts +2 -150
- package/dist/context/index.mjs +2 -4
- package/dist/context-D0_a0kRO.d.cts +149 -0
- package/dist/context-D0_a0kRO.d.cts.map +1 -0
- package/dist/context-DcXV6_GL.d.mts +149 -0
- package/dist/context-DcXV6_GL.d.mts.map +1 -0
- package/dist/engine-Dz6BvkFY.cjs +590 -0
- package/dist/engine-context-B8K6Jtkk.d.cts +53 -0
- package/dist/engine-context-B8K6Jtkk.d.cts.map +1 -0
- package/dist/engine-context-DKlA5Pgu.d.mts +53 -0
- package/dist/engine-context-DKlA5Pgu.d.mts.map +1 -0
- package/dist/engine-q6YKXXcB.mjs +571 -0
- package/dist/engine-q6YKXXcB.mjs.map +1 -0
- package/dist/engine.cjs +6 -0
- package/dist/engine.d.cts +143 -0
- package/dist/engine.d.cts.map +1 -0
- package/dist/engine.d.mts +143 -0
- package/dist/engine.d.mts.map +1 -0
- package/dist/engine.mjs +3 -0
- package/dist/helpers/create-execution-host.cjs +57 -0
- package/dist/helpers/create-execution-host.d.cts +20 -0
- package/dist/helpers/create-execution-host.d.cts.map +1 -0
- package/dist/helpers/create-execution-host.d.mts +20 -0
- package/dist/helpers/create-execution-host.d.mts.map +1 -0
- package/dist/helpers/create-execution-host.mjs +57 -0
- package/dist/helpers/create-execution-host.mjs.map +1 -0
- package/dist/helpers/finalize.cjs +26 -0
- package/dist/helpers/finalize.d.cts +12 -0
- package/dist/helpers/finalize.d.cts.map +1 -0
- package/dist/helpers/finalize.d.mts +12 -0
- package/dist/helpers/finalize.d.mts.map +1 -0
- package/dist/helpers/finalize.mjs +26 -0
- package/dist/helpers/finalize.mjs.map +1 -0
- package/dist/helpers/index.cjs +12 -0
- package/dist/helpers/index.d.cts +5 -0
- package/dist/helpers/index.d.mts +5 -0
- package/dist/helpers/index.mjs +6 -0
- package/dist/helpers/rpc.cjs +139 -0
- package/dist/helpers/rpc.d.cts +7 -0
- package/dist/helpers/rpc.d.cts.map +1 -0
- package/dist/helpers/rpc.d.mts +7 -0
- package/dist/helpers/rpc.d.mts.map +1 -0
- package/dist/helpers/rpc.mjs +139 -0
- package/dist/helpers/rpc.mjs.map +1 -0
- package/dist/helpers/stream.cjs +119 -0
- package/dist/helpers/stream.d.cts +45 -0
- package/dist/helpers/stream.d.cts.map +1 -0
- package/dist/helpers/stream.d.mts +45 -0
- package/dist/helpers/stream.d.mts.map +1 -0
- package/dist/helpers/stream.mjs +117 -0
- package/dist/helpers/stream.mjs.map +1 -0
- package/dist/index-BVVgDSdq.d.cts +1 -0
- package/dist/index-BVVgDSdq.d.mts +1 -0
- package/dist/index.cjs +8 -748
- package/dist/index.d.cts +6 -140
- package/dist/index.d.mts +6 -140
- package/dist/index.mjs +4 -747
- package/package.json +102 -132
- package/dist/_internal/worker.cjs +0 -5192
- package/dist/_internal/worker.d.cts +0 -46
- package/dist/_internal/worker.d.cts.map +0 -1
- package/dist/_internal/worker.d.mts +0 -46
- package/dist/_internal/worker.d.mts.map +0 -1
- package/dist/_internal/worker.mjs +0 -5153
- package/dist/_internal/worker.mjs.map +0 -1
- package/dist/base-context-DLemGRbd.cjs +0 -322
- package/dist/base-context-DUha4Lz-.mjs +0 -315
- package/dist/base-context-DUha4Lz-.mjs.map +0 -1
- package/dist/context/index.d.cts.map +0 -1
- package/dist/context/index.d.mts.map +0 -1
- package/dist/engine-context-BfFiKN53.mjs +0 -86
- package/dist/engine-context-BfFiKN53.mjs.map +0 -1
- package/dist/engine-context-D0y88i_J.cjs +0 -91
- package/dist/execution-context-CE5H90Um.mjs +0 -2845
- package/dist/execution-context-CE5H90Um.mjs.map +0 -1
- package/dist/execution-context-CnyaM3Ul.cjs +0 -2889
- package/dist/execution-context-NyDjVZ6T.d.cts +0 -647
- package/dist/execution-context-NyDjVZ6T.d.cts.map +0 -1
- package/dist/execution-context-YrjFeD9k.d.mts +0 -647
- package/dist/execution-context-YrjFeD9k.d.mts.map +0 -1
- package/dist/fs-CeEdzPKE.cjs +0 -262
- package/dist/fs-Dcle8lUp.mjs +0 -226
- package/dist/fs-Dcle8lUp.mjs.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/rpc/client.cjs +0 -74
- package/dist/rpc/client.d.cts +0 -31
- package/dist/rpc/client.d.cts.map +0 -1
- package/dist/rpc/client.d.mts +0 -31
- package/dist/rpc/client.d.mts.map +0 -1
- package/dist/rpc/client.mjs +0 -71
- package/dist/rpc/client.mjs.map +0 -1
- package/dist/rpc/serialization.cjs +0 -82
- package/dist/rpc/serialization.d.cts +0 -46
- package/dist/rpc/serialization.d.cts.map +0 -1
- package/dist/rpc/serialization.d.mts +0 -46
- package/dist/rpc/serialization.d.mts.map +0 -1
- package/dist/rpc/serialization.mjs +0 -76
- package/dist/rpc/serialization.mjs.map +0 -1
- package/dist/rpc/server.cjs +0 -69
- package/dist/rpc/server.d.cts +0 -29
- package/dist/rpc/server.d.cts.map +0 -1
- package/dist/rpc/server.d.mts +0 -29
- package/dist/rpc/server.d.mts.map +0 -1
- package/dist/rpc/server.mjs +0 -66
- package/dist/rpc/server.mjs.map +0 -1
- package/dist/rpc/types.cjs +0 -0
- package/dist/rpc/types.d.cts +0 -70
- package/dist/rpc/types.d.cts.map +0 -1
- package/dist/rpc/types.d.mts +0 -70
- package/dist/rpc/types.d.mts.map +0 -1
- package/dist/rpc/types.mjs +0 -1
- package/dist/schemas.cjs +0 -9
- package/dist/schemas.d.cts +0 -127
- package/dist/schemas.d.cts.map +0 -1
- package/dist/schemas.d.mts +0 -127
- package/dist/schemas.d.mts.map +0 -1
- package/dist/schemas.mjs +0 -3
- package/dist/storage/base.cjs +0 -216
- package/dist/storage/base.d.cts +0 -199
- package/dist/storage/base.d.cts.map +0 -1
- package/dist/storage/base.d.mts +0 -199
- package/dist/storage/base.d.mts.map +0 -1
- package/dist/storage/base.mjs +0 -215
- package/dist/storage/base.mjs.map +0 -1
- package/dist/storage/file-system.cjs +0 -180
- package/dist/storage/file-system.d.cts +0 -127
- package/dist/storage/file-system.d.cts.map +0 -1
- package/dist/storage/file-system.d.mts +0 -127
- package/dist/storage/file-system.d.mts.map +0 -1
- package/dist/storage/file-system.mjs +0 -179
- package/dist/storage/file-system.mjs.map +0 -1
- package/dist/storage/helpers.cjs +0 -37
- package/dist/storage/helpers.d.cts +0 -25
- package/dist/storage/helpers.d.cts.map +0 -1
- package/dist/storage/helpers.d.mts +0 -25
- package/dist/storage/helpers.d.mts.map +0 -1
- package/dist/storage/helpers.mjs +0 -34
- package/dist/storage/helpers.mjs.map +0 -1
- package/dist/storage/index.cjs +0 -12
- package/dist/storage/index.d.cts +0 -5
- package/dist/storage/index.d.mts +0 -5
- package/dist/storage/index.mjs +0 -6
- package/dist/storage/virtual.cjs +0 -98
- package/dist/storage/virtual.d.cts +0 -80
- package/dist/storage/virtual.d.cts.map +0 -1
- package/dist/storage/virtual.d.mts +0 -80
- package/dist/storage/virtual.d.mts.map +0 -1
- package/dist/storage/virtual.mjs +0 -97
- package/dist/storage/virtual.mjs.map +0 -1
- package/dist/ts-morph-BbM83PT9.cjs +0 -114
- package/dist/ts-morph-C6YBNc46.mjs +0 -102
- package/dist/ts-morph-C6YBNc46.mjs.map +0 -1
- package/dist/tsconfig-DeKMGasE.cjs +0 -198
- package/dist/tsconfig-HzJsMUrr.mjs +0 -155
- package/dist/tsconfig-HzJsMUrr.mjs.map +0 -1
- package/dist/typescript/index.cjs +0 -13
- package/dist/typescript/index.d.cts +0 -106
- package/dist/typescript/index.d.cts.map +0 -1
- package/dist/typescript/index.d.mts +0 -106
- package/dist/typescript/index.d.mts.map +0 -1
- package/dist/typescript/index.mjs +0 -4
- /package/dist/{chunk-C0xms8kb.cjs → chunk-C_NdSu1c.cjs} +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ExecutionContext, ResolvedConfig } from "@powerlines/core";
|
|
2
|
+
|
|
3
|
+
//#region src/helpers/finalize.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Finalize the execution context by disposing resources and cleaning up.
|
|
6
|
+
*
|
|
7
|
+
* @param context - The execution context to finalize
|
|
8
|
+
*/
|
|
9
|
+
declare function finalize<TResolvedConfig extends ResolvedConfig = ResolvedConfig>(context: ExecutionContext<TResolvedConfig>): Promise<void>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { finalize };
|
|
12
|
+
//# sourceMappingURL=finalize.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.d.cts","names":[],"sources":["../../src/helpers/finalize.ts"],"mappings":";;;;;AA+BA;;;iBAAsB,QAAA,yBACI,cAAA,GAAiB,cAAA,CAAA,CACzC,OAAA,EAAS,gBAAA,CAAiB,eAAA,IAAgB,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ExecutionContext, ResolvedConfig } from "@powerlines/core";
|
|
2
|
+
|
|
3
|
+
//#region src/helpers/finalize.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Finalize the execution context by disposing resources and cleaning up.
|
|
6
|
+
*
|
|
7
|
+
* @param context - The execution context to finalize
|
|
8
|
+
*/
|
|
9
|
+
declare function finalize<TResolvedConfig extends ResolvedConfig = ResolvedConfig>(context: ExecutionContext<TResolvedConfig>): Promise<void>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { finalize };
|
|
12
|
+
//# sourceMappingURL=finalize.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.d.mts","names":[],"sources":["../../src/helpers/finalize.ts"],"mappings":";;;;;AA+BA;;;iBAAsB,QAAA,yBACI,cAAA,GAAiB,cAAA,CAAA,CACzC,OAAA,EAAS,gBAAA,CAAiB,eAAA,IAAgB,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { executeEnvironments } from "@powerlines/core/lib/environment";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { removeDirectory } from "@stryke/fs/helpers";
|
|
4
|
+
import { joinPaths } from "@stryke/path/join";
|
|
5
|
+
import { listFiles } from "@stryke/fs/list-files";
|
|
6
|
+
import { callHook } from "@powerlines/core/lib/hooks";
|
|
7
|
+
|
|
8
|
+
//#region src/helpers/finalize.ts
|
|
9
|
+
/**
|
|
10
|
+
* Finalize the execution context by disposing resources and cleaning up.
|
|
11
|
+
*
|
|
12
|
+
* @param context - The execution context to finalize
|
|
13
|
+
*/
|
|
14
|
+
async function finalize(context) {
|
|
15
|
+
const timer = context.timer("Finalization");
|
|
16
|
+
await executeEnvironments(context, async (env) => {
|
|
17
|
+
await callHook(context, "finalize", { environment: env });
|
|
18
|
+
await env.fs.dispose();
|
|
19
|
+
if (existsSync(env.cachePath) && !(await listFiles(joinPaths(env.cachePath, "**/*")))?.length) await removeDirectory(env.cachePath);
|
|
20
|
+
});
|
|
21
|
+
timer();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { finalize };
|
|
26
|
+
//# sourceMappingURL=finalize.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.mjs","names":[],"sources":["../../src/helpers/finalize.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { ExecutionContext, ResolvedConfig } from \"@powerlines/core\";\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { callHook } from \"@powerlines/core/lib/hooks\";\nimport { removeDirectory } from \"@stryke/fs/helpers\";\nimport { listFiles } from \"@stryke/fs/list-files\";\nimport { joinPaths } from \"@stryke/path/join\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Finalize the execution context by disposing resources and cleaning up.\n *\n * @param context - The execution context to finalize\n */\nexport async function finalize<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig\n>(context: ExecutionContext<TResolvedConfig>) {\n const timer = context.timer(\"Finalization\");\n\n await executeEnvironments(context, async env => {\n await callHook(context, \"finalize\", { environment: env });\n await env.fs.dispose();\n\n if (\n existsSync(env.cachePath) &&\n !(await listFiles(joinPaths(env.cachePath, \"**/*\")))?.length\n ) {\n await removeDirectory(env.cachePath);\n }\n });\n\n timer();\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,eAAsB,SAEpB,SAA4C;CAC5C,MAAM,QAAQ,QAAQ,MAAM,cAAc;CAE1C,MAAM,oBAAoB,SAAS,OAAM,QAAO;EAC9C,MAAM,SAAS,SAAS,YAAY,EAAE,aAAa,IAAI,CAAC;EACxD,MAAM,IAAI,GAAG,QAAQ;EAErB,IACE,WAAW,IAAI,SAAS,KACxB,EAAE,MAAM,UAAU,UAAU,IAAI,WAAW,MAAM,CAAC,IAAI,QAEtD,MAAM,gBAAgB,IAAI,SAAS;CAEvC,CAAC;CAED,MAAM;AACR"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_helpers_rpc = require('./rpc.cjs');
|
|
3
|
+
const require_helpers_stream = require('./stream.cjs');
|
|
4
|
+
const require_helpers_create_execution_host = require('./create-execution-host.cjs');
|
|
5
|
+
const require_helpers_finalize = require('./finalize.cjs');
|
|
6
|
+
|
|
7
|
+
exports.MessagePortDuplex = require_helpers_stream.MessagePortDuplex;
|
|
8
|
+
exports.MessagePortReadable = require_helpers_stream.MessagePortReadable;
|
|
9
|
+
exports.MessagePortWritable = require_helpers_stream.MessagePortWritable;
|
|
10
|
+
exports.createExecutionHost = require_helpers_create_execution_host.createExecutionHost;
|
|
11
|
+
exports.createRpcClient = require_helpers_rpc.createRpcClient;
|
|
12
|
+
exports.finalize = require_helpers_finalize.finalize;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createExecutionHost } from "./create-execution-host.cjs";
|
|
2
|
+
import { finalize } from "./finalize.cjs";
|
|
3
|
+
import { createRpcClient } from "./rpc.cjs";
|
|
4
|
+
import { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable } from "./stream.cjs";
|
|
5
|
+
export { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable, createExecutionHost, createRpcClient, finalize };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createExecutionHost } from "./create-execution-host.mjs";
|
|
2
|
+
import { finalize } from "./finalize.mjs";
|
|
3
|
+
import { createRpcClient } from "./rpc.mjs";
|
|
4
|
+
import { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable } from "./stream.mjs";
|
|
5
|
+
export { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable, createExecutionHost, createRpcClient, finalize };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRpcClient } from "./rpc.mjs";
|
|
2
|
+
import { MessagePortDuplex, MessagePortReadable, MessagePortWritable } from "./stream.mjs";
|
|
3
|
+
import { createExecutionHost } from "./create-execution-host.mjs";
|
|
4
|
+
import { finalize } from "./finalize.mjs";
|
|
5
|
+
|
|
6
|
+
export { MessagePortDuplex, MessagePortReadable, MessagePortWritable, createExecutionHost, createRpcClient, finalize };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let _powerlines_core_lib_events = require("@powerlines/core/lib/events");
|
|
3
|
+
let _stryke_type_checks_is_number = require("@stryke/type-checks/is-number");
|
|
4
|
+
let _stryke_type_checks_is_set = require("@stryke/type-checks/is-set");
|
|
5
|
+
let _stryke_url = require("@stryke/url");
|
|
6
|
+
let devframe_client = require("devframe/client");
|
|
7
|
+
let devframe_rpc = require("devframe/rpc");
|
|
8
|
+
let devframe_rpc_client = require("devframe/rpc/client");
|
|
9
|
+
let devframe_rpc_transports_ws_client = require("devframe/rpc/transports/ws-client");
|
|
10
|
+
let devframe_utils_promise = require("devframe/utils/promise");
|
|
11
|
+
let human_id = require("human-id");
|
|
12
|
+
let node_events = require("node:events");
|
|
13
|
+
|
|
14
|
+
//#region src/helpers/rpc.ts
|
|
15
|
+
function createWsRpcClientMode(baseURL, connectionMeta, events, clientRpc, authToken = (0, human_id.humanId)({
|
|
16
|
+
separator: "-",
|
|
17
|
+
capitalize: false
|
|
18
|
+
}), rpcOptions = {}, wsOptions = {}) {
|
|
19
|
+
let isTrusted = false;
|
|
20
|
+
const trustedPromise = (0, devframe_utils_promise.promiseWithResolver)();
|
|
21
|
+
const url = (0, _stryke_type_checks_is_number.isNumber)(connectionMeta.websocket) || (0, _stryke_type_checks_is_set.isSet)(connectionMeta.websocket) && `${+connectionMeta.websocket}` === `${connectionMeta.websocket}` ? `${baseURL.protocol.replace("http", "ws")}//${baseURL.hostname}:${connectionMeta.websocket}` : connectionMeta.websocket;
|
|
22
|
+
const definitions = /* @__PURE__ */ new Map();
|
|
23
|
+
for (const name of connectionMeta.jsonSerializableMethods ?? []) definitions.set(name, { jsonSerializable: true });
|
|
24
|
+
const serverRpc = (0, devframe_rpc_client.createRpcClient)(clientRpc.functions, {
|
|
25
|
+
channel: (0, devframe_rpc_transports_ws_client.createWsRpcChannel)({
|
|
26
|
+
url,
|
|
27
|
+
authToken,
|
|
28
|
+
definitions,
|
|
29
|
+
...wsOptions
|
|
30
|
+
}),
|
|
31
|
+
rpcOptions
|
|
32
|
+
});
|
|
33
|
+
clientRpc.register({
|
|
34
|
+
name: "devframe:auth:revoked",
|
|
35
|
+
type: "event",
|
|
36
|
+
handler: () => {
|
|
37
|
+
isTrusted = false;
|
|
38
|
+
events.emit("rpc:is-trusted:updated", false);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
let currentAuthToken = authToken;
|
|
42
|
+
async function requestTrustWithToken(token) {
|
|
43
|
+
currentAuthToken = token;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
async function requestTrust() {
|
|
47
|
+
if (isTrusted) return true;
|
|
48
|
+
return requestTrustWithToken(currentAuthToken);
|
|
49
|
+
}
|
|
50
|
+
async function ensureTrusted(timeout = 6e4) {
|
|
51
|
+
if (isTrusted) trustedPromise.resolve(true);
|
|
52
|
+
if (timeout <= 0) return trustedPromise.promise;
|
|
53
|
+
let clear = () => {};
|
|
54
|
+
await Promise.race([trustedPromise.promise.then(clear), new Promise((resolve, reject) => {
|
|
55
|
+
const id = setTimeout(() => {
|
|
56
|
+
reject(/* @__PURE__ */ new Error("Timeout waiting for rpc to be trusted"));
|
|
57
|
+
}, timeout);
|
|
58
|
+
clear = () => clearTimeout(id);
|
|
59
|
+
})]);
|
|
60
|
+
return isTrusted;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
get isTrusted() {
|
|
64
|
+
return isTrusted;
|
|
65
|
+
},
|
|
66
|
+
requestTrust,
|
|
67
|
+
requestTrustWithToken,
|
|
68
|
+
ensureTrusted,
|
|
69
|
+
call: (...args) => {
|
|
70
|
+
return serverRpc.$call(...args);
|
|
71
|
+
},
|
|
72
|
+
callEvent: (...args) => {
|
|
73
|
+
return serverRpc.$callEvent(...args);
|
|
74
|
+
},
|
|
75
|
+
callOptional: (...args) => {
|
|
76
|
+
return serverRpc.$callOptional(...args);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const CONNECTION_AUTH_TOKEN_KEY = "__DEVTOOLS_CONNECTION_AUTH_TOKEN__";
|
|
81
|
+
function createRpcClient(options) {
|
|
82
|
+
const baseURL = new _stryke_url.StormURL(options.baseURL);
|
|
83
|
+
const cacheManager = new devframe_rpc.RpcCacheManager({
|
|
84
|
+
functions: [],
|
|
85
|
+
...typeof options.cacheOptions === "object" ? options.cacheOptions : {}
|
|
86
|
+
});
|
|
87
|
+
const context = { rpc: void 0 };
|
|
88
|
+
const clientRpc = new devframe_rpc.RpcFunctionsCollectorBase(context);
|
|
89
|
+
node_events.EventEmitter.setMaxListeners(100);
|
|
90
|
+
const events = (0, _powerlines_core_lib_events.createEventEmitter)();
|
|
91
|
+
const mode = createWsRpcClientMode(baseURL, options.connection, events, clientRpc, void 0, {
|
|
92
|
+
...options.rpcOptions,
|
|
93
|
+
async onRequest(req, next, resolve) {
|
|
94
|
+
await options.rpcOptions?.onRequest?.call(this, req, next, resolve);
|
|
95
|
+
if (options.cacheOptions && cacheManager?.validate(req.m)) {
|
|
96
|
+
const cached = cacheManager.cached(req.m, req.a);
|
|
97
|
+
if (cached) return resolve(cached);
|
|
98
|
+
else {
|
|
99
|
+
const res = await next(req);
|
|
100
|
+
cacheManager?.apply(req, res);
|
|
101
|
+
}
|
|
102
|
+
} else await next(req);
|
|
103
|
+
}
|
|
104
|
+
}, options.wsOptions);
|
|
105
|
+
const rpc = {
|
|
106
|
+
events,
|
|
107
|
+
get isTrusted() {
|
|
108
|
+
return mode.isTrusted;
|
|
109
|
+
},
|
|
110
|
+
connectionMeta: options.connection,
|
|
111
|
+
ensureTrusted: mode.ensureTrusted,
|
|
112
|
+
requestTrust: mode.requestTrust,
|
|
113
|
+
requestTrustWithToken: async (token) => {
|
|
114
|
+
localStorage.setItem(CONNECTION_AUTH_TOKEN_KEY, token);
|
|
115
|
+
globalThis[CONNECTION_AUTH_TOKEN_KEY] = token;
|
|
116
|
+
return mode.requestTrustWithToken(token);
|
|
117
|
+
},
|
|
118
|
+
call: mode.call,
|
|
119
|
+
callEvent: mode.callEvent,
|
|
120
|
+
callOptional: mode.callOptional,
|
|
121
|
+
client: clientRpc,
|
|
122
|
+
sharedState: void 0,
|
|
123
|
+
streaming: void 0,
|
|
124
|
+
cacheManager
|
|
125
|
+
};
|
|
126
|
+
rpc.streaming = (0, devframe_client.createRpcStreamingClientHost)(rpc);
|
|
127
|
+
context.rpc = rpc;
|
|
128
|
+
mode.requestTrust();
|
|
129
|
+
try {
|
|
130
|
+
const bc = new BroadcastChannel("vite-devtools-auth");
|
|
131
|
+
bc.onmessage = (event) => {
|
|
132
|
+
if (event.data?.type === "auth-update" && event.data.authToken) rpc.requestTrustWithToken(event.data.authToken);
|
|
133
|
+
};
|
|
134
|
+
} catch {}
|
|
135
|
+
return rpc;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
//#endregion
|
|
139
|
+
exports.createRpcClient = createRpcClient;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { i as RpcClientOptions, u as RpcClient } from "../config-DKEmqMrh.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/helpers/rpc.d.ts
|
|
4
|
+
declare function createRpcClient(options: RpcClientOptions): RpcClient;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { createRpcClient };
|
|
7
|
+
//# sourceMappingURL=rpc.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.cts","names":[],"sources":["../../src/helpers/rpc.ts"],"mappings":";;;iBA0LgB,eAAA,CAAgB,OAAA,EAAS,gBAAA,GAAgB,SAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { i as RpcClientOptions, u as RpcClient } from "../config-ByLyzMI0.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/helpers/rpc.d.ts
|
|
4
|
+
declare function createRpcClient(options: RpcClientOptions): RpcClient;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { createRpcClient };
|
|
7
|
+
//# sourceMappingURL=rpc.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.mts","names":[],"sources":["../../src/helpers/rpc.ts"],"mappings":";;;iBA0LgB,eAAA,CAAgB,OAAA,EAAS,gBAAA,GAAgB,SAAA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createEventEmitter } from "@powerlines/core/lib/events";
|
|
2
|
+
import { isNumber } from "@stryke/type-checks/is-number";
|
|
3
|
+
import { isSet } from "@stryke/type-checks/is-set";
|
|
4
|
+
import { StormURL } from "@stryke/url";
|
|
5
|
+
import { createRpcStreamingClientHost } from "devframe/client";
|
|
6
|
+
import { RpcCacheManager, RpcFunctionsCollectorBase } from "devframe/rpc";
|
|
7
|
+
import { createRpcClient as createRpcClient$1 } from "devframe/rpc/client";
|
|
8
|
+
import { createWsRpcChannel } from "devframe/rpc/transports/ws-client";
|
|
9
|
+
import { promiseWithResolver } from "devframe/utils/promise";
|
|
10
|
+
import { humanId } from "human-id";
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
|
|
13
|
+
//#region src/helpers/rpc.ts
|
|
14
|
+
function createWsRpcClientMode(baseURL, connectionMeta, events, clientRpc, authToken = humanId({
|
|
15
|
+
separator: "-",
|
|
16
|
+
capitalize: false
|
|
17
|
+
}), rpcOptions = {}, wsOptions = {}) {
|
|
18
|
+
let isTrusted = false;
|
|
19
|
+
const trustedPromise = promiseWithResolver();
|
|
20
|
+
const url = isNumber(connectionMeta.websocket) || isSet(connectionMeta.websocket) && `${+connectionMeta.websocket}` === `${connectionMeta.websocket}` ? `${baseURL.protocol.replace("http", "ws")}//${baseURL.hostname}:${connectionMeta.websocket}` : connectionMeta.websocket;
|
|
21
|
+
const definitions = /* @__PURE__ */ new Map();
|
|
22
|
+
for (const name of connectionMeta.jsonSerializableMethods ?? []) definitions.set(name, { jsonSerializable: true });
|
|
23
|
+
const serverRpc = createRpcClient$1(clientRpc.functions, {
|
|
24
|
+
channel: createWsRpcChannel({
|
|
25
|
+
url,
|
|
26
|
+
authToken,
|
|
27
|
+
definitions,
|
|
28
|
+
...wsOptions
|
|
29
|
+
}),
|
|
30
|
+
rpcOptions
|
|
31
|
+
});
|
|
32
|
+
clientRpc.register({
|
|
33
|
+
name: "devframe:auth:revoked",
|
|
34
|
+
type: "event",
|
|
35
|
+
handler: () => {
|
|
36
|
+
isTrusted = false;
|
|
37
|
+
events.emit("rpc:is-trusted:updated", false);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
let currentAuthToken = authToken;
|
|
41
|
+
async function requestTrustWithToken(token) {
|
|
42
|
+
currentAuthToken = token;
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
async function requestTrust() {
|
|
46
|
+
if (isTrusted) return true;
|
|
47
|
+
return requestTrustWithToken(currentAuthToken);
|
|
48
|
+
}
|
|
49
|
+
async function ensureTrusted(timeout = 6e4) {
|
|
50
|
+
if (isTrusted) trustedPromise.resolve(true);
|
|
51
|
+
if (timeout <= 0) return trustedPromise.promise;
|
|
52
|
+
let clear = () => {};
|
|
53
|
+
await Promise.race([trustedPromise.promise.then(clear), new Promise((resolve, reject) => {
|
|
54
|
+
const id = setTimeout(() => {
|
|
55
|
+
reject(/* @__PURE__ */ new Error("Timeout waiting for rpc to be trusted"));
|
|
56
|
+
}, timeout);
|
|
57
|
+
clear = () => clearTimeout(id);
|
|
58
|
+
})]);
|
|
59
|
+
return isTrusted;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
get isTrusted() {
|
|
63
|
+
return isTrusted;
|
|
64
|
+
},
|
|
65
|
+
requestTrust,
|
|
66
|
+
requestTrustWithToken,
|
|
67
|
+
ensureTrusted,
|
|
68
|
+
call: (...args) => {
|
|
69
|
+
return serverRpc.$call(...args);
|
|
70
|
+
},
|
|
71
|
+
callEvent: (...args) => {
|
|
72
|
+
return serverRpc.$callEvent(...args);
|
|
73
|
+
},
|
|
74
|
+
callOptional: (...args) => {
|
|
75
|
+
return serverRpc.$callOptional(...args);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const CONNECTION_AUTH_TOKEN_KEY = "__DEVTOOLS_CONNECTION_AUTH_TOKEN__";
|
|
80
|
+
function createRpcClient(options) {
|
|
81
|
+
const baseURL = new StormURL(options.baseURL);
|
|
82
|
+
const cacheManager = new RpcCacheManager({
|
|
83
|
+
functions: [],
|
|
84
|
+
...typeof options.cacheOptions === "object" ? options.cacheOptions : {}
|
|
85
|
+
});
|
|
86
|
+
const context = { rpc: void 0 };
|
|
87
|
+
const clientRpc = new RpcFunctionsCollectorBase(context);
|
|
88
|
+
EventEmitter.setMaxListeners(100);
|
|
89
|
+
const events = createEventEmitter();
|
|
90
|
+
const mode = createWsRpcClientMode(baseURL, options.connection, events, clientRpc, void 0, {
|
|
91
|
+
...options.rpcOptions,
|
|
92
|
+
async onRequest(req, next, resolve) {
|
|
93
|
+
await options.rpcOptions?.onRequest?.call(this, req, next, resolve);
|
|
94
|
+
if (options.cacheOptions && cacheManager?.validate(req.m)) {
|
|
95
|
+
const cached = cacheManager.cached(req.m, req.a);
|
|
96
|
+
if (cached) return resolve(cached);
|
|
97
|
+
else {
|
|
98
|
+
const res = await next(req);
|
|
99
|
+
cacheManager?.apply(req, res);
|
|
100
|
+
}
|
|
101
|
+
} else await next(req);
|
|
102
|
+
}
|
|
103
|
+
}, options.wsOptions);
|
|
104
|
+
const rpc = {
|
|
105
|
+
events,
|
|
106
|
+
get isTrusted() {
|
|
107
|
+
return mode.isTrusted;
|
|
108
|
+
},
|
|
109
|
+
connectionMeta: options.connection,
|
|
110
|
+
ensureTrusted: mode.ensureTrusted,
|
|
111
|
+
requestTrust: mode.requestTrust,
|
|
112
|
+
requestTrustWithToken: async (token) => {
|
|
113
|
+
localStorage.setItem(CONNECTION_AUTH_TOKEN_KEY, token);
|
|
114
|
+
globalThis[CONNECTION_AUTH_TOKEN_KEY] = token;
|
|
115
|
+
return mode.requestTrustWithToken(token);
|
|
116
|
+
},
|
|
117
|
+
call: mode.call,
|
|
118
|
+
callEvent: mode.callEvent,
|
|
119
|
+
callOptional: mode.callOptional,
|
|
120
|
+
client: clientRpc,
|
|
121
|
+
sharedState: void 0,
|
|
122
|
+
streaming: void 0,
|
|
123
|
+
cacheManager
|
|
124
|
+
};
|
|
125
|
+
rpc.streaming = createRpcStreamingClientHost(rpc);
|
|
126
|
+
context.rpc = rpc;
|
|
127
|
+
mode.requestTrust();
|
|
128
|
+
try {
|
|
129
|
+
const bc = new BroadcastChannel("vite-devtools-auth");
|
|
130
|
+
bc.onmessage = (event) => {
|
|
131
|
+
if (event.data?.type === "auth-update" && event.data.authToken) rpc.requestTrustWithToken(event.data.authToken);
|
|
132
|
+
};
|
|
133
|
+
} catch {}
|
|
134
|
+
return rpc;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
export { createRpcClient };
|
|
139
|
+
//# sourceMappingURL=rpc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.mjs","names":["createDevframeRpcClient"],"sources":["../../src/helpers/rpc.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { createEventEmitter } from \"@powerlines/core/lib/events\";\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isSet } from \"@stryke/type-checks/is-set\";\nimport { StormURL } from \"@stryke/url\";\nimport { BirpcOptions } from \"birpc\";\nimport {\n createRpcStreamingClientHost,\n DevToolsClientRpcHost,\n DevToolsRpcClientMode,\n RpcClientEvents\n} from \"devframe/client\";\nimport { RpcCacheManager, RpcFunctionsCollectorBase } from \"devframe/rpc\";\nimport { createRpcClient as createDevframeRpcClient } from \"devframe/rpc/client\";\nimport {\n createWsRpcChannel,\n WsRpcChannelOptions\n} from \"devframe/rpc/transports/ws-client\";\nimport {\n ConnectionMeta,\n EventEmitter as DevFrameEventEmitter\n} from \"devframe/types\";\nimport { promiseWithResolver } from \"devframe/utils/promise\";\nimport { humanId } from \"human-id\";\nimport { EventEmitter } from \"node:events\";\nimport { RpcClientOptions } from \"../types/config\";\nimport {\n RpcClient,\n RpcClientFunctions,\n RpcContext,\n RpcServerFunctions\n} from \"../types/rpc\";\n\nfunction createWsRpcClientMode(\n baseURL: StormURL,\n connectionMeta: ConnectionMeta,\n events: DevFrameEventEmitter<RpcClientEvents>,\n clientRpc: DevToolsClientRpcHost,\n authToken: string = humanId({ separator: \"-\", capitalize: false }),\n rpcOptions: Partial<\n BirpcOptions<RpcServerFunctions, RpcClientFunctions, boolean>\n > = {},\n wsOptions: Partial<WsRpcChannelOptions> = {}\n): DevToolsRpcClientMode {\n let isTrusted = false;\n const trustedPromise = promiseWithResolver<boolean>();\n const url =\n isNumber(connectionMeta.websocket) ||\n (isSet(connectionMeta.websocket) &&\n `${+connectionMeta.websocket}` === `${connectionMeta.websocket}`)\n ? `${baseURL.protocol.replace(\"http\", \"ws\")}//${baseURL.hostname}:${connectionMeta.websocket}`\n : (connectionMeta.websocket as string);\n\n // Build a minimal `defs` map from the connection meta so the per-call\n // wire serializer dispatches outgoing requests with the correct\n // encoding (JSON for `jsonSerializable: true` methods; structured-\n // clone for the rest).\n const definitions = new Map<string, { jsonSerializable: true }>();\n for (const name of connectionMeta.jsonSerializableMethods ?? [])\n definitions.set(name, { jsonSerializable: true });\n\n const serverRpc = createDevframeRpcClient<\n RpcServerFunctions,\n RpcClientFunctions\n >(clientRpc.functions, {\n channel: createWsRpcChannel({\n url,\n authToken,\n definitions,\n ...wsOptions\n }),\n rpcOptions\n });\n\n // Handle server-initiated auth revocation\n clientRpc.register({\n name: \"devframe:auth:revoked\",\n type: \"event\",\n handler: () => {\n isTrusted = false;\n events.emit(\"rpc:is-trusted:updated\", false);\n }\n });\n\n let currentAuthToken = authToken;\n\n async function requestTrustWithToken(token: string) {\n currentAuthToken = token;\n\n // const info = parseUA(navigator.userAgent);\n // const ua = [\n // \"powerlines\",\n // \"1.0\",\n // \"|\",\n // info.os.name,\n // info.os.version,\n // info.device.type\n // ]\n // .filter(i => i)\n // .join(\" \");\n\n // const result = await serverRpc.$call(\"vite:anonymous:auth\", {\n // authToken: token,\n // ua,\n // origin: baseURL.origin\n // });\n\n // isTrusted = result.isTrusted;\n // trustedPromise.resolve(isTrusted);\n // events.emit(\"rpc:is-trusted:updated\", isTrusted);\n // return result.isTrusted;\n\n return true;\n }\n\n async function requestTrust() {\n if (isTrusted) return true;\n return requestTrustWithToken(currentAuthToken);\n }\n\n async function ensureTrusted(timeout = 60_000): Promise<boolean> {\n if (isTrusted) trustedPromise.resolve(true);\n\n if (timeout <= 0) return trustedPromise.promise;\n\n let clear = () => {};\n await Promise.race([\n trustedPromise.promise.then(clear),\n new Promise((resolve, reject) => {\n const id = setTimeout(() => {\n reject(new Error(\"Timeout waiting for rpc to be trusted\"));\n }, timeout);\n clear = () => clearTimeout(id);\n })\n ]);\n\n return isTrusted;\n }\n\n return {\n get isTrusted() {\n return isTrusted;\n },\n requestTrust,\n requestTrustWithToken,\n ensureTrusted,\n call: (...args: any): any => {\n return serverRpc.$call(\n // @ts-expect-error casting\n ...args\n );\n },\n callEvent: (...args: any): any => {\n return serverRpc.$callEvent(\n // @ts-expect-error casting\n ...args\n );\n },\n callOptional: (...args: any): any => {\n return serverRpc.$callOptional(\n // @ts-expect-error casting\n ...args\n );\n }\n };\n}\n\nconst CONNECTION_AUTH_TOKEN_KEY = \"__DEVTOOLS_CONNECTION_AUTH_TOKEN__\";\n\nexport function createRpcClient(options: RpcClientOptions) {\n const baseURL = new StormURL(options.baseURL);\n\n const cacheManager = new RpcCacheManager({\n functions: [],\n ...(typeof options.cacheOptions === \"object\" ? options.cacheOptions : {})\n });\n const context: RpcContext = {\n rpc: undefined!\n };\n\n const clientRpc: DevToolsClientRpcHost = new RpcFunctionsCollectorBase<\n RpcClientFunctions,\n RpcContext\n >(context);\n\n EventEmitter.setMaxListeners(100);\n const events = createEventEmitter<RpcClientEvents>();\n\n const mode = createWsRpcClientMode(\n baseURL,\n options.connection,\n events,\n clientRpc,\n undefined,\n {\n ...options.rpcOptions,\n async onRequest(req, next, resolve) {\n await options.rpcOptions?.onRequest?.call(this, req, next, resolve);\n if (options.cacheOptions && cacheManager?.validate(req.m)) {\n const cached = cacheManager.cached(req.m, req.a);\n if (cached) {\n return resolve(cached);\n } else {\n const res = await next(req);\n cacheManager?.apply(req, res);\n }\n } else {\n await next(req);\n }\n }\n },\n options.wsOptions\n );\n\n const rpc: RpcClient = {\n events,\n get isTrusted() {\n return mode.isTrusted;\n },\n connectionMeta: options.connection,\n ensureTrusted: mode.ensureTrusted,\n requestTrust: mode.requestTrust,\n requestTrustWithToken: async (token: string) => {\n // Update stored token for future reconnections\n localStorage.setItem(CONNECTION_AUTH_TOKEN_KEY, token);\n (globalThis as any)[CONNECTION_AUTH_TOKEN_KEY] = token;\n return mode.requestTrustWithToken(token);\n },\n call: mode.call,\n callEvent: mode.callEvent,\n callOptional: mode.callOptional,\n client: clientRpc,\n sharedState: undefined!,\n streaming: undefined!,\n cacheManager\n };\n\n // rpc.sharedState = createRpcSharedStateClientHost(rpc);\n rpc.streaming = createRpcStreamingClientHost(rpc);\n\n // @ts-expect-error assign to readonly property\n context.rpc = rpc;\n void mode.requestTrust();\n\n // Listen for auth updates from other tabs (e.g., auth URL page)\n try {\n const bc = new BroadcastChannel(\"vite-devtools-auth\");\n bc.onmessage = event => {\n if (event.data?.type === \"auth-update\" && event.data.authToken) {\n void rpc.requestTrustWithToken(event.data.authToken);\n }\n };\n } catch {\n // BroadcastChannel is not supported in all environments, so we can safely ignore errors here\n }\n\n return rpc;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let node_stream = require("node:stream");
|
|
3
|
+
|
|
4
|
+
//#region src/helpers/stream.ts
|
|
5
|
+
const kPort = Symbol("kPort");
|
|
6
|
+
function toTransferable(chunk) {
|
|
7
|
+
if (ArrayBuffer.isView(chunk)) return chunk.buffer instanceof ArrayBuffer ? chunk.buffer : void 0;
|
|
8
|
+
if (chunk instanceof ArrayBuffer) return chunk;
|
|
9
|
+
}
|
|
10
|
+
var MessagePortWritable = class extends node_stream.Writable {
|
|
11
|
+
[kPort];
|
|
12
|
+
constructor(port, options) {
|
|
13
|
+
super(options);
|
|
14
|
+
this[kPort] = port;
|
|
15
|
+
}
|
|
16
|
+
_write(chunk, _encoding, callback) {
|
|
17
|
+
const transfer = toTransferable(chunk);
|
|
18
|
+
this[kPort].postMessage(chunk, transfer ? [transfer] : []);
|
|
19
|
+
callback();
|
|
20
|
+
}
|
|
21
|
+
_writev(data, callback) {
|
|
22
|
+
const chunks = data.map((entry) => entry.chunk);
|
|
23
|
+
const transfers = data.map((entry) => toTransferable(entry.chunk)).filter((value) => Boolean(value));
|
|
24
|
+
this[kPort].postMessage(chunks, transfers);
|
|
25
|
+
callback();
|
|
26
|
+
}
|
|
27
|
+
_final(callback) {
|
|
28
|
+
this[kPort].postMessage(null);
|
|
29
|
+
callback();
|
|
30
|
+
}
|
|
31
|
+
_destroy(error, callback) {
|
|
32
|
+
this[kPort].close(() => callback(error));
|
|
33
|
+
}
|
|
34
|
+
unref() {
|
|
35
|
+
this[kPort].unref();
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
ref() {
|
|
39
|
+
this[kPort].ref();
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var MessagePortReadable = class extends node_stream.Readable {
|
|
44
|
+
[kPort];
|
|
45
|
+
constructor(port, options) {
|
|
46
|
+
super(options);
|
|
47
|
+
this[kPort] = port;
|
|
48
|
+
port.onmessage = ({ data }) => {
|
|
49
|
+
this.push(data);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
_read(_size) {
|
|
53
|
+
this[kPort].start();
|
|
54
|
+
}
|
|
55
|
+
_destroy(error, callback) {
|
|
56
|
+
this[kPort].close(() => {
|
|
57
|
+
this[kPort].onmessage = null;
|
|
58
|
+
callback(error);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
unref() {
|
|
62
|
+
this[kPort].unref();
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
ref() {
|
|
66
|
+
this[kPort].ref();
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
var MessagePortDuplex = class extends node_stream.Duplex {
|
|
71
|
+
[kPort];
|
|
72
|
+
_activityAbortHandler;
|
|
73
|
+
constructor(port, options) {
|
|
74
|
+
super(options);
|
|
75
|
+
this[kPort] = port;
|
|
76
|
+
this._activityAbortHandler = options?.onActivityAbort;
|
|
77
|
+
port.onmessage = ({ data }) => {
|
|
78
|
+
this.push(data);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
_read(_size) {
|
|
82
|
+
this[kPort].start();
|
|
83
|
+
}
|
|
84
|
+
_write(chunk, _encoding, callback) {
|
|
85
|
+
if (this._activityAbortHandler) this._activityAbortHandler();
|
|
86
|
+
const transfer = toTransferable(chunk);
|
|
87
|
+
this[kPort].postMessage(chunk, transfer ? [transfer] : []);
|
|
88
|
+
callback();
|
|
89
|
+
}
|
|
90
|
+
_writev(data, callback) {
|
|
91
|
+
const chunks = data.map((entry) => entry.chunk);
|
|
92
|
+
const transfers = data.map((entry) => toTransferable(entry.chunk)).filter((value) => Boolean(value));
|
|
93
|
+
this[kPort].postMessage(chunks, transfers);
|
|
94
|
+
callback();
|
|
95
|
+
}
|
|
96
|
+
_final(callback) {
|
|
97
|
+
this[kPort].postMessage(null);
|
|
98
|
+
callback();
|
|
99
|
+
}
|
|
100
|
+
_destroy(error, callback) {
|
|
101
|
+
this[kPort].close(() => {
|
|
102
|
+
this[kPort].onmessage = null;
|
|
103
|
+
callback(error);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
unref() {
|
|
107
|
+
this[kPort].unref();
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
ref() {
|
|
111
|
+
this[kPort].ref();
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
exports.MessagePortDuplex = MessagePortDuplex;
|
|
118
|
+
exports.MessagePortReadable = MessagePortReadable;
|
|
119
|
+
exports.MessagePortWritable = MessagePortWritable;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Duplex, DuplexOptions, Readable, ReadableOptions, Writable, WritableOptions } from "node:stream";
|
|
2
|
+
import { MessagePort } from "node:worker_threads";
|
|
3
|
+
|
|
4
|
+
//#region src/helpers/stream.d.ts
|
|
5
|
+
declare const kPort: unique symbol;
|
|
6
|
+
interface WritevChunk {
|
|
7
|
+
chunk: unknown;
|
|
8
|
+
encoding: BufferEncoding;
|
|
9
|
+
}
|
|
10
|
+
declare class MessagePortWritable extends Writable {
|
|
11
|
+
private [kPort];
|
|
12
|
+
constructor(port: MessagePort, options?: WritableOptions);
|
|
13
|
+
_write(chunk: unknown, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
14
|
+
_writev(data: WritevChunk[], callback: (error?: Error | null) => void): void;
|
|
15
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
16
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
17
|
+
unref(): this;
|
|
18
|
+
ref(): this;
|
|
19
|
+
}
|
|
20
|
+
declare class MessagePortReadable extends Readable {
|
|
21
|
+
private [kPort];
|
|
22
|
+
constructor(port: MessagePort, options?: ReadableOptions);
|
|
23
|
+
_read(_size: number): void;
|
|
24
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
25
|
+
unref(): this;
|
|
26
|
+
ref(): this;
|
|
27
|
+
}
|
|
28
|
+
interface MessagePortDuplexOptions extends DuplexOptions {
|
|
29
|
+
onActivityAbort?: () => void;
|
|
30
|
+
}
|
|
31
|
+
declare class MessagePortDuplex extends Duplex {
|
|
32
|
+
private [kPort];
|
|
33
|
+
private _activityAbortHandler?;
|
|
34
|
+
constructor(port: MessagePort, options?: MessagePortDuplexOptions);
|
|
35
|
+
_read(_size: number): void;
|
|
36
|
+
_write(chunk: unknown, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
37
|
+
_writev(data: WritevChunk[], callback: (error?: Error | null) => void): void;
|
|
38
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
39
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
40
|
+
unref(): this;
|
|
41
|
+
ref(): this;
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable };
|
|
45
|
+
//# sourceMappingURL=stream.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.cts","names":[],"sources":["../../src/helpers/stream.ts"],"mappings":";;;;cA0BM,KAAA;AAAA,UAMI,WAAA;EACR,KAAA;EACA,QAAA,EAAU,cAAc;AAAA;AAAA,cAeb,mBAAA,SAA4B,QAAA;EAAA,SAC9B,KAAA;cAEU,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,eAAA;EAKhC,MAAA,CACd,KAAA,WACA,SAAA,EAAW,cAAA,EACX,QAAA,GAAW,KAAA,GAAQ,KAAA;EAOL,OAAA,CACd,IAAA,EAAM,WAAA,IACN,QAAA,GAAW,KAAA,GAAQ,KAAA;EAWL,MAAA,CAAO,QAAA,GAAW,KAAA,GAAQ,KAAA;EAK1B,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAKd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA;AAAA,cAMI,mBAAA,SAA4B,QAAA;EAAA,SAC9B,KAAA;cAEU,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,eAAA;EAQhC,KAAA,CAAM,KAAA;EAIN,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAQd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA;AAAA,UAMQ,wBAAA,SAAiC,aAAa;EAC7D,eAAe;AAAA;AAAA,cAGJ,iBAAA,SAA0B,MAAA;EAAA,SAC5B,KAAA;EAAA,QAED,qBAAA;cAEW,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,wBAAA;EAUhC,KAAA,CAAM,KAAA;EAIN,MAAA,CACd,KAAA,WACA,SAAA,EAAW,cAAA,EACX,QAAA,GAAW,KAAA,GAAQ,KAAA;EAUL,OAAA,CACd,IAAA,EAAM,WAAA,IACN,QAAA,GAAW,KAAA,GAAQ,KAAA;EAWL,MAAA,CAAO,QAAA,GAAW,KAAA,GAAQ,KAAA;EAK1B,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAQd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Duplex, DuplexOptions, Readable, ReadableOptions, Writable, WritableOptions } from "node:stream";
|
|
2
|
+
import { MessagePort } from "node:worker_threads";
|
|
3
|
+
|
|
4
|
+
//#region src/helpers/stream.d.ts
|
|
5
|
+
declare const kPort: unique symbol;
|
|
6
|
+
interface WritevChunk {
|
|
7
|
+
chunk: unknown;
|
|
8
|
+
encoding: BufferEncoding;
|
|
9
|
+
}
|
|
10
|
+
declare class MessagePortWritable extends Writable {
|
|
11
|
+
private [kPort];
|
|
12
|
+
constructor(port: MessagePort, options?: WritableOptions);
|
|
13
|
+
_write(chunk: unknown, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
14
|
+
_writev(data: WritevChunk[], callback: (error?: Error | null) => void): void;
|
|
15
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
16
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
17
|
+
unref(): this;
|
|
18
|
+
ref(): this;
|
|
19
|
+
}
|
|
20
|
+
declare class MessagePortReadable extends Readable {
|
|
21
|
+
private [kPort];
|
|
22
|
+
constructor(port: MessagePort, options?: ReadableOptions);
|
|
23
|
+
_read(_size: number): void;
|
|
24
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
25
|
+
unref(): this;
|
|
26
|
+
ref(): this;
|
|
27
|
+
}
|
|
28
|
+
interface MessagePortDuplexOptions extends DuplexOptions {
|
|
29
|
+
onActivityAbort?: () => void;
|
|
30
|
+
}
|
|
31
|
+
declare class MessagePortDuplex extends Duplex {
|
|
32
|
+
private [kPort];
|
|
33
|
+
private _activityAbortHandler?;
|
|
34
|
+
constructor(port: MessagePort, options?: MessagePortDuplexOptions);
|
|
35
|
+
_read(_size: number): void;
|
|
36
|
+
_write(chunk: unknown, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
37
|
+
_writev(data: WritevChunk[], callback: (error?: Error | null) => void): void;
|
|
38
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
39
|
+
_destroy(error: Error | null, callback: (error?: Error | null) => void): void;
|
|
40
|
+
unref(): this;
|
|
41
|
+
ref(): this;
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { MessagePortDuplex, MessagePortDuplexOptions, MessagePortReadable, MessagePortWritable };
|
|
45
|
+
//# sourceMappingURL=stream.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.mts","names":[],"sources":["../../src/helpers/stream.ts"],"mappings":";;;;cA0BM,KAAA;AAAA,UAMI,WAAA;EACR,KAAA;EACA,QAAA,EAAU,cAAc;AAAA;AAAA,cAeb,mBAAA,SAA4B,QAAA;EAAA,SAC9B,KAAA;cAEU,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,eAAA;EAKhC,MAAA,CACd,KAAA,WACA,SAAA,EAAW,cAAA,EACX,QAAA,GAAW,KAAA,GAAQ,KAAA;EAOL,OAAA,CACd,IAAA,EAAM,WAAA,IACN,QAAA,GAAW,KAAA,GAAQ,KAAA;EAWL,MAAA,CAAO,QAAA,GAAW,KAAA,GAAQ,KAAA;EAK1B,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAKd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA;AAAA,cAMI,mBAAA,SAA4B,QAAA;EAAA,SAC9B,KAAA;cAEU,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,eAAA;EAQhC,KAAA,CAAM,KAAA;EAIN,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAQd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA;AAAA,UAMQ,wBAAA,SAAiC,aAAa;EAC7D,eAAe;AAAA;AAAA,cAGJ,iBAAA,SAA0B,MAAA;EAAA,SAC5B,KAAA;EAAA,QAED,qBAAA;cAEW,IAAA,EAAM,WAAA,EAAa,OAAA,GAAU,wBAAA;EAUhC,KAAA,CAAM,KAAA;EAIN,MAAA,CACd,KAAA,WACA,SAAA,EAAW,cAAA,EACX,QAAA,GAAW,KAAA,GAAQ,KAAA;EAUL,OAAA,CACd,IAAA,EAAM,WAAA,IACN,QAAA,GAAW,KAAA,GAAQ,KAAA;EAWL,MAAA,CAAO,QAAA,GAAW,KAAA,GAAQ,KAAA;EAK1B,QAAA,CACd,KAAA,EAAO,KAAA,SACP,QAAA,GAAW,KAAA,GAAQ,KAAA;EAQd,KAAA,CAAA;EAKA,GAAA,CAAA;AAAA"}
|