@efffrida/vitest-pool 0.0.13 → 0.0.14
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/frida/agent.js +14 -69
- package/dist/frida/agent.js.map +1 -1
- package/dist/src/index.d.ts +3 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +94 -254
- package/dist/src/index.js.map +1 -1
- package/package.json +18 -14
- package/src/index.ts +158 -308
package/dist/frida/agent.js
CHANGED
|
@@ -5,27 +5,11 @@ import { createStackString, parseStacktrace } from "@vitest/utils/source-map";
|
|
|
5
5
|
import { createBirpc } from "birpc";
|
|
6
6
|
import { stringify as flattedStringify } from "flatted";
|
|
7
7
|
import { EvaluatedModules } from "vitest";
|
|
8
|
-
const testFiles = {};
|
|
9
8
|
// There should only ever be one test running at a time in a worker and these
|
|
10
9
|
// need to be shared across multiple rpc calls anyways so they will live up here
|
|
11
10
|
// in the module scope.
|
|
12
11
|
let runPromise;
|
|
13
12
|
let setupContext;
|
|
14
|
-
// How to post messages to the parent process - use flatted to handle circular
|
|
15
|
-
// references
|
|
16
|
-
const postMessage = message => {
|
|
17
|
-
send(flattedStringify(message, (_key, value) => {
|
|
18
|
-
/** @see https://github.com/vitest-dev/vitest/blob/372e86fdef381038a2c4999fc9007dd7292a0628/packages/vitest/src/node/ast-collect.ts#L216-L236 */
|
|
19
|
-
if (value !== null && typeof value === "object" && "name" in value && "message" in value && "stack" in value && typeof value.stack !== "string") {
|
|
20
|
-
return {
|
|
21
|
-
...value,
|
|
22
|
-
stack: value.stack === undefined ? undefined : JSON.stringify(value.stack)
|
|
23
|
-
};
|
|
24
|
-
} else {
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
}));
|
|
28
|
-
};
|
|
29
13
|
// Collections of listeners
|
|
30
14
|
const cleanupListeners = /*#__PURE__*/new Set();
|
|
31
15
|
const cancelListeners = /*#__PURE__*/new Set();
|
|
@@ -36,13 +20,10 @@ const birpc = /*#__PURE__*/createBirpc({
|
|
|
36
20
|
await Promise.allSettled([...cancelListeners.values()].map(listener => listener(reason)));
|
|
37
21
|
}
|
|
38
22
|
}, {
|
|
39
|
-
// How to serialize and deserialize messages.
|
|
40
|
-
serialize: data => data,
|
|
41
|
-
deserialize: data => data,
|
|
42
23
|
// How to send and receive messages.
|
|
43
24
|
off: rpcListener => messageListeners.delete(rpcListener),
|
|
44
25
|
on: rpcListener => messageListeners.add(rpcListener),
|
|
45
|
-
post:
|
|
26
|
+
post: message => typeof message === "string" ? send(message) : send(flattedStringify(message)),
|
|
46
27
|
// Names of remote functions that do not need response.
|
|
47
28
|
// These are fire-and-forget messages to the vitest pool coordinator.
|
|
48
29
|
eventNames: ["onUserConsoleLog", "onCollected", "onCancel"],
|
|
@@ -107,10 +88,10 @@ rpc.exports["onMessage"] = async message => {
|
|
|
107
88
|
rpc: birpc,
|
|
108
89
|
projectName: config.name ?? ""
|
|
109
90
|
};
|
|
110
|
-
return {
|
|
91
|
+
return send({
|
|
111
92
|
type: "started",
|
|
112
93
|
__vitest_worker_response__: true
|
|
113
|
-
};
|
|
94
|
+
});
|
|
114
95
|
}
|
|
115
96
|
case "stop":
|
|
116
97
|
{
|
|
@@ -124,20 +105,20 @@ rpc.exports["onMessage"] = async message => {
|
|
|
124
105
|
await Promise.allSettled([...cleanupListeners.values()].map(listener => listener()));
|
|
125
106
|
cancelListeners.clear();
|
|
126
107
|
cleanupListeners.clear();
|
|
127
|
-
return {
|
|
108
|
+
return send({
|
|
128
109
|
type: "stopped",
|
|
129
110
|
__vitest_worker_response__: true
|
|
130
|
-
};
|
|
111
|
+
});
|
|
131
112
|
}
|
|
132
113
|
case "run":
|
|
133
114
|
case "collect":
|
|
134
115
|
{
|
|
135
116
|
if (runPromise !== undefined) {
|
|
136
|
-
return {
|
|
117
|
+
return send({
|
|
137
118
|
type: "testfileFinished",
|
|
138
119
|
__vitest_worker_response__: true,
|
|
139
120
|
error: serializeError("Worker is already running tests")
|
|
140
|
-
};
|
|
121
|
+
});
|
|
141
122
|
}
|
|
142
123
|
/** @see https://github.com/vitest-dev/vitest/blob/4f58c77147796d48bf70579222a577df977300f8/packages/vitest/src/runtime/worker.ts#L28-L49 */
|
|
143
124
|
provideWorkerState(globalThis, {
|
|
@@ -168,45 +149,9 @@ rpc.exports["onMessage"] = async message => {
|
|
|
168
149
|
const entrypoint = message.type === "run" ? startTests : collectTests;
|
|
169
150
|
const testRunner = {
|
|
170
151
|
config: setupContext.config,
|
|
171
|
-
importFile: async
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const nodeCrypto = await import("node:crypto");
|
|
175
|
-
const diagnosticsChannel = await import("node:diagnostics_channel");
|
|
176
|
-
const nodeEvents = await import("node:events");
|
|
177
|
-
const nodeFs = await import("node:fs");
|
|
178
|
-
const nodeNet = await import("node:net");
|
|
179
|
-
const nodeOs = await import("node:os");
|
|
180
|
-
const nodePath = await import("node:path");
|
|
181
|
-
const nodeProcess = await import("node:process");
|
|
182
|
-
const nodeStream = await import("node:stream");
|
|
183
|
-
const nodeTimers = await import("node:timers");
|
|
184
|
-
const nodeTty = await import("node:tty");
|
|
185
|
-
const nodeUrl = await import("node:url");
|
|
186
|
-
const nodeUtil = await import("node:util");
|
|
187
|
-
const nodeVm = await import("node:vm");
|
|
188
|
-
const vitestModule = await import("vitest");
|
|
189
|
-
const vitestRunnerModule = await import("@vitest/runner");
|
|
190
|
-
globalThis.__node_assert = nodeAssert;
|
|
191
|
-
globalThis.__node_buffer = nodeBuffer;
|
|
192
|
-
globalThis.__node_crypto = nodeCrypto;
|
|
193
|
-
globalThis.__node_diagnosticsChannel = diagnosticsChannel;
|
|
194
|
-
globalThis.__node_events = nodeEvents;
|
|
195
|
-
globalThis.__node_fs = nodeFs;
|
|
196
|
-
globalThis.__node_net = nodeNet;
|
|
197
|
-
globalThis.__node_os = nodeOs;
|
|
198
|
-
globalThis.__node_path = nodePath;
|
|
199
|
-
globalThis.__node_process = nodeProcess;
|
|
200
|
-
globalThis.__node_stream = nodeStream;
|
|
201
|
-
globalThis.__node_timers = nodeTimers;
|
|
202
|
-
globalThis.__node_tty = nodeTty;
|
|
203
|
-
globalThis.__node_url = nodeUrl;
|
|
204
|
-
globalThis.__node_util = nodeUtil;
|
|
205
|
-
globalThis.__node_vm = nodeVm;
|
|
206
|
-
globalThis.__vitest = vitestModule;
|
|
207
|
-
globalThis.__vitest_runner = vitestRunnerModule;
|
|
208
|
-
const source = Buffer.from(testFiles[file], "base64").toString("utf-8");
|
|
209
|
-
await Script.load(file, source);
|
|
152
|
+
importFile: async _file => {
|
|
153
|
+
// @efffrida/vitest-pool/agent/file-map
|
|
154
|
+
return Promise.reject("importFile is not supported in the frida pool agent");
|
|
210
155
|
}
|
|
211
156
|
};
|
|
212
157
|
try {
|
|
@@ -214,16 +159,16 @@ rpc.exports["onMessage"] = async message => {
|
|
|
214
159
|
runPromise = entrypoint([file], patchTestRunner(testRunner));
|
|
215
160
|
await runPromise;
|
|
216
161
|
}
|
|
217
|
-
return {
|
|
162
|
+
return send({
|
|
218
163
|
type: "testfileFinished",
|
|
219
164
|
__vitest_worker_response__: true
|
|
220
|
-
};
|
|
165
|
+
});
|
|
221
166
|
} catch (error) {
|
|
222
|
-
return {
|
|
167
|
+
return send({
|
|
223
168
|
type: "testfileFinished",
|
|
224
169
|
__vitest_worker_response__: true,
|
|
225
170
|
error: serializeError(error)
|
|
226
|
-
};
|
|
171
|
+
});
|
|
227
172
|
} finally {
|
|
228
173
|
runPromise = undefined;
|
|
229
174
|
}
|
package/dist/frida/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","names":["collectTests","startTests","serializeError","createStackString","parseStacktrace","createBirpc","stringify","flattedStringify","EvaluatedModules","
|
|
1
|
+
{"version":3,"file":"agent.js","names":["collectTests","startTests","serializeError","createStackString","parseStacktrace","createBirpc","stringify","flattedStringify","EvaluatedModules","runPromise","setupContext","cleanupListeners","Set","cancelListeners","messageListeners","birpc","onCancel","reason","Promise","allSettled","values","map","listener","off","rpcListener","delete","on","add","post","message","send","eventNames","timeout","provideWorkerState","context","state","NAME_WORKER_STATE","Object","defineProperty","value","configurable","writable","enumerable","patchTestRunner","testRunner","originalOnTaskUpdate","onTaskUpdate","task","events","call","originalOnCollectStart","onCollectStart","file","onQueued","originalOnCollected","onCollected","files","rpc","exports","isWorkerRequest","u","__vitest_worker_request__","forEach","type","process","env","VITEST_POOL_ID","String","poolId","VITEST_WORKER_ID","workerId","config","environment","pool","projectName","name","__vitest_worker_response__","undefined","$rejectPendingCalls","method","reject","clear","error","globalThis","durations","prepare","ctx","providedContext","metaEnv","resolvingModules","moduleExecutionInfo","Map","evaluatedModules","onCleanup","onFilterStackTrace","stack","entrypoint","importFile","_file"],"sources":["../../frida/agent.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -37,15 +37,12 @@ declare const ConfigSchema: Schema.Struct<{
|
|
|
37
37
|
* @category Tests
|
|
38
38
|
*/
|
|
39
39
|
export declare class FridaPoolWorker implements VitestNode.PoolWorker {
|
|
40
|
-
readonly agentTemplatePath: URL;
|
|
41
40
|
readonly name = "frida-pool";
|
|
42
|
-
private
|
|
41
|
+
private static initQueue;
|
|
42
|
+
private readonly scope;
|
|
43
|
+
private readonly scriptContext;
|
|
43
44
|
private readonly cancelables;
|
|
44
|
-
private modifiedAgentScope;
|
|
45
|
-
private managedRuntime;
|
|
46
45
|
private sends;
|
|
47
|
-
private compiledAgentUrlPromise;
|
|
48
|
-
private messageCallback;
|
|
49
46
|
constructor(poolOptions: VitestNode.PoolOptions, customOptions: Schema.Schema.Type<typeof ConfigSchema>);
|
|
50
47
|
start(): Promise<void>;
|
|
51
48
|
stop(): Promise<void>;
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAKxC,OAAO,KAAK,KAAK,UAAU,MAAM,aAAa,CAAC;AAmD/C,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKhB,CAAC;AAEH;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU,CAAC,UAAU;IACzD,SAAgB,IAAI,gBAAgB;IACpC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoC;IAE5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAClF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsE;IAElG,OAAO,CAAC,KAAK,CAA+B;gBAEhC,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC;IAwIjG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IA8DrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAQvD,WAAW,CAAC,IAAI,EAAE,OAAO;IAKzB,SAAS,CAAC,IAAI,EAAE,OAAO;CAG1B;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GACxB,eAAe,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,YAAY,CAAC,KACzD,UAAU,CAAC,qBAMb,CAAC"}
|