@efffrida/vitest-pool 0.0.1 → 0.0.2
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.d.ts +1 -1
- package/dist/frida/agent.d.ts.map +1 -1
- package/dist/frida/agent.js +230 -14
- package/dist/frida/agent.js.map +1 -1
- package/dist/src/index.d.ts +14 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +231 -16
- package/dist/src/index.js.map +1 -1
- package/package.json +26 -19
- package/src/index.ts +284 -31
package/dist/frida/agent.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import "@efffrida/polyfills";
|
|
2
2
|
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../frida/agent.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../frida/agent.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC"}
|
package/dist/frida/agent.js
CHANGED
|
@@ -1,17 +1,233 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import "@efffrida/polyfills";
|
|
2
|
+
import { collectTests, startTests } from "@vitest/runner";
|
|
3
|
+
import { serializeError } from "@vitest/utils/error";
|
|
4
|
+
import { createStackString, parseStacktrace } from "@vitest/utils/source-map";
|
|
5
|
+
import { createBirpc } from "birpc";
|
|
6
|
+
import { stringify as flattedStringify } from "flatted";
|
|
7
|
+
import { EvaluatedModules } from "vitest";
|
|
8
|
+
const testFiles = {};
|
|
9
|
+
// There should only ever be one test running at a time in a worker and these
|
|
10
|
+
// need to be shared across multiple rpc calls anyways so they will live up here
|
|
11
|
+
// in the module scope.
|
|
12
|
+
let runPromise;
|
|
13
|
+
let setupContext;
|
|
14
|
+
// How to post messages to the parent process - use flatted to handle circular references
|
|
15
|
+
const postMessage = message => send(flattedStringify(message, (_key, value) => {
|
|
16
|
+
/** @see https://github.com/vitest-dev/vitest/blob/372e86fdef381038a2c4999fc9007dd7292a0628/packages/vitest/src/node/ast-collect.ts#L216-L236 */
|
|
17
|
+
if (value !== null && typeof value === "object" && "name" in value && "message" in value && "stack" in value && typeof value.stack !== "string") {
|
|
18
|
+
return {
|
|
19
|
+
...value,
|
|
20
|
+
stack: value.stack === undefined ? undefined : JSON.stringify(value.stack)
|
|
9
21
|
};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
} else {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
const postWorkerResponse = response => postMessage({
|
|
27
|
+
...response,
|
|
28
|
+
__vitest_worker_response__: true
|
|
16
29
|
});
|
|
30
|
+
// Collections of listeners
|
|
31
|
+
const cleanupListeners = /*#__PURE__*/new Set();
|
|
32
|
+
const cancelListeners = /*#__PURE__*/new Set();
|
|
33
|
+
const messageListeners = /*#__PURE__*/new Set();
|
|
34
|
+
const birpc = /*#__PURE__*/createBirpc({
|
|
35
|
+
async onCancel(reason) {
|
|
36
|
+
await Promise.allSettled([...cancelListeners.values()].map(listener => listener(reason)));
|
|
37
|
+
}
|
|
38
|
+
}, {
|
|
39
|
+
// How to serialize and deserialize messages.
|
|
40
|
+
serialize: data => data,
|
|
41
|
+
deserialize: data => data,
|
|
42
|
+
// How to send and receive messages.
|
|
43
|
+
post: postMessage,
|
|
44
|
+
on: rpcListener => messageListeners.add(rpcListener),
|
|
45
|
+
off: rpcListener => messageListeners.delete(rpcListener),
|
|
46
|
+
// Names of remote functions that do not need response.
|
|
47
|
+
// These are fire-and-forget messages to the vitest pool coordinator.
|
|
48
|
+
eventNames: ["onUserConsoleLog", "onCollected", "onCancel"],
|
|
49
|
+
// Maximum timeout for waiting for response, in milliseconds.
|
|
50
|
+
timeout: -1
|
|
51
|
+
});
|
|
52
|
+
/** @see https://github.com/vitest-dev/vitest/blob/8508296e9adcd2d9859e8073ac76c0bcb7d78f50/packages/vitest/src/runtime/utils.ts#L23-L32 */
|
|
53
|
+
function provideWorkerState(context, state) {
|
|
54
|
+
const NAME_WORKER_STATE = "__vitest_worker__";
|
|
55
|
+
Object.defineProperty(context, NAME_WORKER_STATE, {
|
|
56
|
+
value: state,
|
|
57
|
+
configurable: true,
|
|
58
|
+
writable: true,
|
|
59
|
+
enumerable: false
|
|
60
|
+
});
|
|
61
|
+
return state;
|
|
62
|
+
}
|
|
63
|
+
/** @see https://github.com/vitest-dev/vitest/blob/9ca74cfb2060d8bc1c7a319ba3cba1578517adb0/packages/vitest/src/runtime/runners/index.ts#L65-L139 */
|
|
64
|
+
function patchTestRunner(testRunner) {
|
|
65
|
+
const originalOnTaskUpdate = testRunner.onTaskUpdate;
|
|
66
|
+
testRunner.onTaskUpdate = async (task, events) => {
|
|
67
|
+
await birpc.onTaskUpdate(task, events);
|
|
68
|
+
await originalOnTaskUpdate?.call(testRunner, task, events);
|
|
69
|
+
};
|
|
70
|
+
const originalOnCollectStart = testRunner.onCollectStart;
|
|
71
|
+
testRunner.onCollectStart = async file => {
|
|
72
|
+
await birpc.onQueued(file);
|
|
73
|
+
await originalOnCollectStart?.call(testRunner, file);
|
|
74
|
+
};
|
|
75
|
+
const originalOnCollected = testRunner.onCollected;
|
|
76
|
+
testRunner.onCollected = async files => {
|
|
77
|
+
await birpc.onCollected(files);
|
|
78
|
+
await originalOnCollected?.call(testRunner, files);
|
|
79
|
+
};
|
|
80
|
+
return testRunner;
|
|
81
|
+
}
|
|
82
|
+
/** @see https://github.com/vitest-dev/vitest/blob/4f58c77147796d48bf70579222a577df977300f8/packages/vitest/src/runtime/workers/init.ts#L20-L235 */
|
|
83
|
+
rpc.exports["onMessage"] = async message => {
|
|
84
|
+
// Predicate to check if a message is a worker request
|
|
85
|
+
const isWorkerRequest = u => typeof u === "object" && u !== null && "__vitest_worker_request__" in u && u.__vitest_worker_request__ === true;
|
|
86
|
+
// Handle non-worker messages
|
|
87
|
+
if (!isWorkerRequest(message)) {
|
|
88
|
+
return messageListeners.forEach(listener => {
|
|
89
|
+
listener(message);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Handle worker messages
|
|
93
|
+
switch (message.type) {
|
|
94
|
+
case "start":
|
|
95
|
+
{
|
|
96
|
+
process.env.VITEST_POOL_ID = String(message.poolId);
|
|
97
|
+
process.env.VITEST_WORKER_ID = String(message.workerId);
|
|
98
|
+
const {
|
|
99
|
+
config,
|
|
100
|
+
environment,
|
|
101
|
+
pool
|
|
102
|
+
} = message.context;
|
|
103
|
+
setupContext = {
|
|
104
|
+
environment,
|
|
105
|
+
config,
|
|
106
|
+
pool,
|
|
107
|
+
rpc: birpc,
|
|
108
|
+
projectName: config.name ?? ""
|
|
109
|
+
};
|
|
110
|
+
return postWorkerResponse({
|
|
111
|
+
type: "started"
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
case "stop":
|
|
115
|
+
{
|
|
116
|
+
if (runPromise !== undefined) await runPromise;
|
|
117
|
+
await Promise.allSettled(setupContext.rpc.$rejectPendingCalls(({
|
|
118
|
+
method,
|
|
119
|
+
reject
|
|
120
|
+
}) => {
|
|
121
|
+
reject(`Closing rpc while ${method} was pending`);
|
|
122
|
+
}));
|
|
123
|
+
await Promise.allSettled([...cleanupListeners.values()].map(listener => listener()));
|
|
124
|
+
cancelListeners.clear();
|
|
125
|
+
cleanupListeners.clear();
|
|
126
|
+
return postWorkerResponse({
|
|
127
|
+
type: "stopped"
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
case "run":
|
|
131
|
+
case "collect":
|
|
132
|
+
{
|
|
133
|
+
if (runPromise !== undefined) {
|
|
134
|
+
return postWorkerResponse({
|
|
135
|
+
type: "testfileFinished",
|
|
136
|
+
error: serializeError("Worker is already running tests")
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** @see https://github.com/vitest-dev/vitest/blob/4f58c77147796d48bf70579222a577df977300f8/packages/vitest/src/runtime/worker.ts#L28-L49 */
|
|
140
|
+
provideWorkerState(globalThis, {
|
|
141
|
+
rpc: birpc,
|
|
142
|
+
environment: null,
|
|
143
|
+
config: setupContext.config,
|
|
144
|
+
durations: {
|
|
145
|
+
environment: 0,
|
|
146
|
+
prepare: 0
|
|
147
|
+
},
|
|
148
|
+
ctx: {
|
|
149
|
+
...setupContext,
|
|
150
|
+
...message.context
|
|
151
|
+
},
|
|
152
|
+
providedContext: message.context.providedContext,
|
|
153
|
+
metaEnv: process.env,
|
|
154
|
+
resolvingModules: new Set(),
|
|
155
|
+
// TODO: share this between runs? https://github.com/vitest-dev/vitest/blob/8508296e9adcd2d9859e8073ac76c0bcb7d78f50/packages/vitest/src/runtime/worker.ts#L9
|
|
156
|
+
moduleExecutionInfo: new Map(),
|
|
157
|
+
// TODO: share this between runs? https://github.com/vitest-dev/vitest/blob/4f58c77147796d48bf70579222a577df977300f8/packages/vitest/src/runtime/workers/base.ts#L18-L19
|
|
158
|
+
evaluatedModules: new EvaluatedModules(),
|
|
159
|
+
// TODO: share this between runs? https://github.com/vitest-dev/vitest/blob/4f58c77147796d48bf70579222a577df977300f8/packages/vitest/src/runtime/workers/base.ts#L18-L19
|
|
160
|
+
onCancel: listener => cancelListeners.add(listener),
|
|
161
|
+
onCleanup: listener => cleanupListeners.add(listener),
|
|
162
|
+
onFilterStackTrace: stack => createStackString(parseStacktrace(stack))
|
|
163
|
+
});
|
|
164
|
+
// Create a minimal runner without snapshot support
|
|
165
|
+
const entrypoint = message.type === "run" ? startTests : collectTests;
|
|
166
|
+
const testRunner = {
|
|
167
|
+
config: setupContext.config,
|
|
168
|
+
importFile: async file => {
|
|
169
|
+
const nodeAssert = await import("node:assert");
|
|
170
|
+
const nodeBuffer = await import("node:buffer");
|
|
171
|
+
const nodeCrypto = await import("node:crypto");
|
|
172
|
+
const diagnosticsChannel = await import("node:diagnostics_channel");
|
|
173
|
+
const nodeEvents = await import("node:events");
|
|
174
|
+
const nodeFs = await import("node:fs");
|
|
175
|
+
const nodeNet = await import("node:net");
|
|
176
|
+
const nodeOs = await import("node:os");
|
|
177
|
+
const nodePath = await import("node:path");
|
|
178
|
+
const nodeProcess = await import("node:process");
|
|
179
|
+
const nodeStream = await import("node:stream");
|
|
180
|
+
const nodeTimers = await import("node:timers");
|
|
181
|
+
const nodeTty = await import("node:tty");
|
|
182
|
+
const nodeUrl = await import("node:url");
|
|
183
|
+
const nodeUtil = await import("node:util");
|
|
184
|
+
const nodeVm = await import("node:vm");
|
|
185
|
+
const vitestModule = await import("vitest");
|
|
186
|
+
const vitestRunnerModule = await import("@vitest/runner");
|
|
187
|
+
globalThis.__node_assert = nodeAssert;
|
|
188
|
+
globalThis.__node_buffer = nodeBuffer;
|
|
189
|
+
globalThis.__node_crypto = nodeCrypto;
|
|
190
|
+
globalThis.__node_diagnosticsChannel = diagnosticsChannel;
|
|
191
|
+
globalThis.__node_events = nodeEvents;
|
|
192
|
+
globalThis.__node_fs = nodeFs;
|
|
193
|
+
globalThis.__node_net = nodeNet;
|
|
194
|
+
globalThis.__node_os = nodeOs;
|
|
195
|
+
globalThis.__node_path = nodePath;
|
|
196
|
+
globalThis.__node_process = nodeProcess;
|
|
197
|
+
globalThis.__node_stream = nodeStream;
|
|
198
|
+
globalThis.__node_timers = nodeTimers;
|
|
199
|
+
globalThis.__node_tty = nodeTty;
|
|
200
|
+
globalThis.__node_url = nodeUrl;
|
|
201
|
+
globalThis.__node_util = nodeUtil;
|
|
202
|
+
globalThis.__node_vm = nodeVm;
|
|
203
|
+
globalThis.__vitest = vitestModule;
|
|
204
|
+
globalThis.__vitest_runner = vitestRunnerModule;
|
|
205
|
+
// TODO: warning if file not found
|
|
206
|
+
const source64 = testFiles[file];
|
|
207
|
+
if (source64 === undefined) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const source = Buffer.from(source64, "base64").toString("utf-8");
|
|
211
|
+
await Script.load(file, source);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
try {
|
|
215
|
+
for (const file of message.context.files) {
|
|
216
|
+
runPromise = entrypoint([file], patchTestRunner(testRunner));
|
|
217
|
+
await runPromise;
|
|
218
|
+
}
|
|
219
|
+
postWorkerResponse({
|
|
220
|
+
type: "testfileFinished"
|
|
221
|
+
});
|
|
222
|
+
} catch (error) {
|
|
223
|
+
postWorkerResponse({
|
|
224
|
+
type: "testfileFinished",
|
|
225
|
+
error: serializeError(error)
|
|
226
|
+
});
|
|
227
|
+
} finally {
|
|
228
|
+
runPromise = undefined;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
};
|
|
17
233
|
//# sourceMappingURL=agent.js.map
|
package/dist/frida/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","names":["
|
|
1
|
+
{"version":3,"file":"agent.js","names":["collectTests","startTests","serializeError","createStackString","parseStacktrace","createBirpc","stringify","flattedStringify","EvaluatedModules","testFiles","runPromise","setupContext","postMessage","message","send","_key","value","stack","undefined","JSON","postWorkerResponse","response","__vitest_worker_response__","cleanupListeners","Set","cancelListeners","messageListeners","birpc","onCancel","reason","Promise","allSettled","values","map","listener","serialize","data","deserialize","post","on","rpcListener","add","off","delete","eventNames","timeout","provideWorkerState","context","state","NAME_WORKER_STATE","Object","defineProperty","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","$rejectPendingCalls","method","reject","clear","error","globalThis","durations","prepare","ctx","providedContext","metaEnv","resolvingModules","moduleExecutionInfo","Map","evaluatedModules","onCleanup","onFilterStackTrace","entrypoint","importFile","nodeAssert","nodeBuffer","nodeCrypto","diagnosticsChannel","nodeEvents","nodeFs","nodeNet","nodeOs","nodePath","nodeProcess","nodeStream","nodeTimers","nodeTty","nodeUrl","nodeUtil","nodeVm","vitestModule","vitestRunnerModule","__node_assert","__node_buffer","__node_crypto","__node_diagnosticsChannel","__node_events","__node_fs","__node_net","__node_os","__node_path","__node_process","__node_stream","__node_timers","__node_tty","__node_url","__node_util","__node_vm","__vitest","__vitest_runner","source64","source","Buffer","from","toString","Script","load"],"sources":["../../frida/agent.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,qBAAqB;AAM5B,SAASA,YAAY,EAAEC,UAAU,QAAQ,gBAAgB;AACzD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,iBAAiB,EAAEC,eAAe,QAAQ,0BAA0B;AAC7E,SAASC,WAAW,QAAQ,OAAO;AACnC,SAASC,SAAS,IAAIC,gBAAgB,QAAQ,SAAS;AACvD,SAASC,gBAAgB,QAAQ,QAAQ;AAEzC,MAAMC,SAAS,GAA2B,EAAE;AAE5C;AACA;AACA;AACA,IAAIC,UAAwC;AAC5C,IAAIC,YAAyF;AAE7F;AACA,MAAMC,WAAW,GAAIC,OAAgB,IACjCC,IAAI,CACAP,gBAAgB,CAACM,OAAO,EAAE,CAACE,IAAY,EAAEC,KAAc,KAAa;EAChE;EACA,IACIA,KAAK,KAAK,IAAI,IACd,OAAOA,KAAK,KAAK,QAAQ,IACzB,MAAM,IAAIA,KAAK,IACf,SAAS,IAAIA,KAAK,IAClB,OAAO,IAAIA,KAAK,IAChB,OAAOA,KAAK,CAACC,KAAK,KAAK,QAAQ,EACjC;IACE,OAAO;MACH,GAAGD,KAAK;MACRC,KAAK,EAAED,KAAK,CAACC,KAAK,KAAKC,SAAS,GAAGA,SAAS,GAAGC,IAAI,CAACb,SAAS,CAACU,KAAK,CAACC,KAAK;KAC5E;EACL,CAAC,MAAM;IACH,OAAOD,KAAK;EAChB;AACJ,CAAC,CAAC,CACL;AACL,MAAMI,kBAAkB,GAAIC,QAA4D,IACpFT,WAAW,CAAC;EAAE,GAAGS,QAAQ;EAAEC,0BAA0B,EAAE;AAAI,CAAE,CAAC;AAElE;AACA,MAAMC,gBAAgB,gBAAG,IAAIC,GAAG,EAAiB;AACjD,MAAMC,eAAe,gBAAG,IAAID,GAAG,EAAqC;AACpE,MAAME,gBAAgB,gBAAG,IAAIF,GAAG,EAA8C;AAC9E,MAAMG,KAAK,gBAAGtB,WAAW,CACrB;EACI,MAAMuB,QAAQA,CAACC,MAAoB;IAC/B,MAAMC,OAAO,CAACC,UAAU,CAAC,CAAC,GAAGN,eAAe,CAACO,MAAM,EAAE,CAAC,CAACC,GAAG,CAAEC,QAAQ,IAAKA,QAAQ,CAACL,MAAM,CAAC,CAAC,CAAC;EAC/F;CACH,EACD;EACI;EACAM,SAAS,EAAGC,IAAI,IAAKA,IAAI;EACzBC,WAAW,EAAGD,IAAI,IAAKA,IAAI;EAE3B;EACAE,IAAI,EAAE1B,WAAW;EACjB2B,EAAE,EAAGC,WAAW,IAAKd,gBAAgB,CAACe,GAAG,CAACD,WAAW,CAAC;EACtDE,GAAG,EAAGF,WAAW,IAAKd,gBAAgB,CAACiB,MAAM,CAACH,WAAW,CAAC;EAE1D;EACA;EACAI,UAAU,EAAE,CAAC,kBAAkB,EAAE,aAAa,EAAE,UAAU,CAAC;EAE3D;EACAC,OAAO,EAAE,CAAC;CACb,CACJ;AAED;AACA,SAASC,kBAAkBA,CAACC,OAAgB,EAAEC,KAAwB;EAClE,MAAMC,iBAAiB,GAAG,mBAAmB;EAC7CC,MAAM,CAACC,cAAc,CAACJ,OAAO,EAAEE,iBAAiB,EAAE;IAC9CjC,KAAK,EAAEgC,KAAK;IACZI,YAAY,EAAE,IAAI;IAClBC,QAAQ,EAAE,IAAI;IACdC,UAAU,EAAE;GACf,CAAC;EACF,OAAON,KAAK;AAChB;AAEA;AACA,SAASO,eAAeA,CAACC,UAAwB;EAC7C,MAAMC,oBAAoB,GAAGD,UAAU,CAACE,YAAY;EACpDF,UAAU,CAACE,YAAY,GAAG,OAAOC,IAAI,EAAEC,MAAM,KAAI;IAC7C,MAAMjC,KAAK,CAAC+B,YAAY,CAACC,IAAI,EAAEC,MAAM,CAAC;IACtC,MAAMH,oBAAoB,EAAEI,IAAI,CAACL,UAAU,EAAEG,IAAI,EAAEC,MAAM,CAAC;EAC9D,CAAC;EAED,MAAME,sBAAsB,GAAGN,UAAU,CAACO,cAAc;EACxDP,UAAU,CAACO,cAAc,GAAG,MAAOC,IAAI,IAAI;IACvC,MAAMrC,KAAK,CAACsC,QAAQ,CAACD,IAAI,CAAC;IAC1B,MAAMF,sBAAsB,EAAED,IAAI,CAACL,UAAU,EAAEQ,IAAI,CAAC;EACxD,CAAC;EAED,MAAME,mBAAmB,GAAGV,UAAU,CAACW,WAAW;EAClDX,UAAU,CAACW,WAAW,GAAG,MAAOC,KAAK,IAAI;IACrC,MAAMzC,KAAK,CAACwC,WAAW,CAACC,KAAK,CAAC;IAC9B,MAAMF,mBAAmB,EAAEL,IAAI,CAACL,UAAU,EAAEY,KAAK,CAAC;EACtD,CAAC;EAED,OAAOZ,UAAU;AACrB;AAEA;AACAa,GAAG,CAACC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAOzD,OAAgB,IAAmB;EACjE;EACA,MAAM0D,eAAe,GAAIC,CAAU,IAC/B,OAAOA,CAAC,KAAK,QAAQ,IAAIA,CAAC,KAAK,IAAI,IAAI,2BAA2B,IAAIA,CAAC,IAAIA,CAAC,CAACC,yBAAyB,KAAK,IAAI;EAEnH;EACA,IAAI,CAACF,eAAe,CAAC1D,OAAO,CAAC,EAAE;IAC3B,OAAOa,gBAAgB,CAACgD,OAAO,CAAExC,QAAQ,IAAI;MACzCA,QAAQ,CAACrB,OAAO,CAAC;IACrB,CAAC,CAAC;EACN;EAEA;EACA,QAAQA,OAAO,CAAC8D,IAAI;IAChB,KAAK,OAAO;MAAE;QACVC,OAAO,CAACC,GAAG,CAACC,cAAc,GAAGC,MAAM,CAAClE,OAAO,CAACmE,MAAM,CAAC;QACnDJ,OAAO,CAACC,GAAG,CAACI,gBAAgB,GAAGF,MAAM,CAAClE,OAAO,CAACqE,QAAQ,CAAC;QACvD,MAAM;UAAEC,MAAM;UAAEC,WAAW;UAAEC;QAAI,CAAE,GAAGxE,OAAO,CAACkC,OAAO;QACrDpC,YAAY,GAAG;UAAEyE,WAAW;UAAED,MAAM;UAAEE,IAAI;UAAEhB,GAAG,EAAE1C,KAAK;UAAE2D,WAAW,EAAEH,MAAM,CAACI,IAAI,IAAI;QAAE,CAAE;QACxF,OAAOnE,kBAAkB,CAAC;UAAEuD,IAAI,EAAE;QAAS,CAAE,CAAC;MAClD;IAEA,KAAK,MAAM;MAAE;QACT,IAAIjE,UAAU,KAAKQ,SAAS,EAAE,MAAMR,UAAU;QAC9C,MAAMoB,OAAO,CAACC,UAAU,CACpBpB,YAAY,CAAC0D,GAAG,CAACmB,mBAAmB,CAAC,CAAC;UAAEC,MAAM;UAAEC;QAAM,CAAE,KAAI;UACxDA,MAAM,CAAC,qBAAqBD,MAAM,cAAc,CAAC;QACrD,CAAC,CAAC,CACL;QACD,MAAM3D,OAAO,CAACC,UAAU,CAAC,CAAC,GAAGR,gBAAgB,CAACS,MAAM,EAAE,CAAC,CAACC,GAAG,CAAEC,QAAQ,IAAKA,QAAQ,EAAE,CAAC,CAAC;QACtFT,eAAe,CAACkE,KAAK,EAAE;QACvBpE,gBAAgB,CAACoE,KAAK,EAAE;QACxB,OAAOvE,kBAAkB,CAAC;UAAEuD,IAAI,EAAE;QAAS,CAAE,CAAC;MAClD;IAEA,KAAK,KAAK;IACV,KAAK,SAAS;MAAE;QACZ,IAAIjE,UAAU,KAAKQ,SAAS,EAAE;UAC1B,OAAOE,kBAAkB,CAAC;YACtBuD,IAAI,EAAE,kBAAkB;YACxBiB,KAAK,EAAE1F,cAAc,CAAC,iCAAiC;WAC1D,CAAC;QACN;QAEA;QACA4C,kBAAkB,CAAC+C,UAAU,EAAE;UAC3BxB,GAAG,EAAE1C,KAAK;UACVyD,WAAW,EAAE,IAAK;UAClBD,MAAM,EAAExE,YAAY,CAACwE,MAAM;UAC3BW,SAAS,EAAE;YAAEV,WAAW,EAAE,CAAC;YAAEW,OAAO,EAAE;UAAC,CAAE;UACzCC,GAAG,EAAE;YAAE,GAAGrF,YAAY;YAAE,GAAGE,OAAO,CAACkC;UAAO,CAAE;UAC5CkD,eAAe,EAAEpF,OAAO,CAACkC,OAAO,CAACkD,eAAe;UAChDC,OAAO,EAAEtB,OAAO,CAACC,GAAmC;UAEpDsB,gBAAgB,EAAE,IAAI3E,GAAG,EAAE;UAAE;UAC7B4E,mBAAmB,EAAE,IAAIC,GAAG,EAAE;UAAE;UAChCC,gBAAgB,EAAE,IAAI9F,gBAAgB,EAAE;UAAE;UAE1CoB,QAAQ,EAAGM,QAAQ,IAAKT,eAAe,CAACgB,GAAG,CAACP,QAAQ,CAAC;UACrDqE,SAAS,EAAGrE,QAAQ,IAAKX,gBAAgB,CAACkB,GAAG,CAACP,QAAQ,CAAC;UACvDsE,kBAAkB,EAAGvF,KAAK,IAAKd,iBAAiB,CAACC,eAAe,CAACa,KAAK,CAAC;SAC9C,CAAC;QAE9B;QACA,MAAMwF,UAAU,GAAG5F,OAAO,CAAC8D,IAAI,KAAK,KAAK,GAAG1E,UAAU,GAAGD,YAAY;QACrE,MAAMwD,UAAU,GAAiB;UAC7B2B,MAAM,EAAExE,YAAY,CAACwE,MAAgC;UACrDuB,UAAU,EAAE,MAAO1C,IAAY,IAAmB;YAC9C,MAAM2C,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,kBAAkB,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC;YACnE,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACtC,MAAMC,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,MAAMC,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACtC,MAAMC,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YAC1C,MAAMC,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;YAChD,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAMC,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,MAAMC,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,MAAMC,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YAC1C,MAAMC,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACtC,MAAMC,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAMC,kBAAkB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAExD/B,UAAkB,CAACgC,aAAa,GAAGlB,UAAU;YAC7Cd,UAAkB,CAACiC,aAAa,GAAGlB,UAAU;YAC7Cf,UAAkB,CAACkC,aAAa,GAAGlB,UAAU;YAC7ChB,UAAkB,CAACmC,yBAAyB,GAAGlB,kBAAkB;YACjEjB,UAAkB,CAACoC,aAAa,GAAGlB,UAAU;YAC7ClB,UAAkB,CAACqC,SAAS,GAAGlB,MAAM;YACrCnB,UAAkB,CAACsC,UAAU,GAAGlB,OAAO;YACvCpB,UAAkB,CAACuC,SAAS,GAAGlB,MAAM;YACrCrB,UAAkB,CAACwC,WAAW,GAAGlB,QAAQ;YACzCtB,UAAkB,CAACyC,cAAc,GAAGlB,WAAW;YAC/CvB,UAAkB,CAAC0C,aAAa,GAAGlB,UAAU;YAC7CxB,UAAkB,CAAC2C,aAAa,GAAGlB,UAAU;YAC7CzB,UAAkB,CAAC4C,UAAU,GAAGlB,OAAO;YACvC1B,UAAkB,CAAC6C,UAAU,GAAGlB,OAAO;YACvC3B,UAAkB,CAAC8C,WAAW,GAAGlB,QAAQ;YACzC5B,UAAkB,CAAC+C,SAAS,GAAGlB,MAAM;YACrC7B,UAAkB,CAACgD,QAAQ,GAAGlB,YAAY;YAC1C9B,UAAkB,CAACiD,eAAe,GAAGlB,kBAAkB;YAExD;YACA,MAAMmB,QAAQ,GAAGtI,SAAS,CAACuD,IAAI,CAAC;YAChC,IAAI+E,QAAQ,KAAK7H,SAAS,EAAE;cACxB;YACJ;YAEA,MAAM8H,MAAM,GAAGC,MAAM,CAACC,IAAI,CAACH,QAAQ,EAAE,QAAQ,CAAC,CAACI,QAAQ,CAAC,OAAO,CAAC;YAChE,MAAMC,MAAM,CAACC,IAAI,CAACrF,IAAI,EAAEgF,MAAM,CAAC;UACnC;SACH;QAED,IAAI;UACA,KAAK,MAAMhF,IAAI,IAAInD,OAAO,CAACkC,OAAO,CAACqB,KAAK,EAAE;YACtC1D,UAAU,GAAG+F,UAAU,CAAC,CAACzC,IAAI,CAAC,EAAET,eAAe,CAACC,UAAU,CAAC,CAAC;YAC5D,MAAM9C,UAAU;UACpB;UACAU,kBAAkB,CAAC;YAAEuD,IAAI,EAAE;UAAkB,CAAE,CAAC;QACpD,CAAC,CAAC,OAAOiB,KAAc,EAAE;UACrBxE,kBAAkB,CAAC;YAAEuD,IAAI,EAAE,kBAAkB;YAAEiB,KAAK,EAAE1F,cAAc,CAAC0F,KAAK;UAAC,CAAE,CAAC;QAClF,CAAC,SAAS;UACNlF,UAAU,GAAGQ,SAAS;QAC1B;MACJ;EACJ;AACJ,CAAC","ignoreList":[]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type * as VitestNode from "vitest/node";
|
|
2
|
-
import type { PoolWorker, WorkerRequest } from "vitest/node";
|
|
3
2
|
import * as Schema from "effect/Schema";
|
|
4
3
|
declare const DeviceSchema_base: Schema.Union<[Schema.Struct<{
|
|
5
4
|
device: Schema.Literal<["local"]>;
|
|
@@ -54,7 +53,10 @@ declare const AttachSchema_base: Schema.Union<[Schema.Struct<{
|
|
|
54
53
|
declare class AttachSchema extends AttachSchema_base {
|
|
55
54
|
}
|
|
56
55
|
declare const ConfigSchema_base: Schema.extend<Schema.extend<Schema.Struct<{
|
|
57
|
-
|
|
56
|
+
runtime: Schema.optionalWith<Schema.Literal<["default", "qjs", "v8"]>, {
|
|
57
|
+
nullable: true;
|
|
58
|
+
}>;
|
|
59
|
+
platform: Schema.optionalWith<Schema.Literal<["gum", "browser", "neutral"]>, {
|
|
58
60
|
nullable: true;
|
|
59
61
|
}>;
|
|
60
62
|
}>, typeof DeviceSchema>, typeof AttachSchema>;
|
|
@@ -64,23 +66,27 @@ declare class ConfigSchema extends ConfigSchema_base {
|
|
|
64
66
|
* @since 1.0.0
|
|
65
67
|
* @category Tests
|
|
66
68
|
*/
|
|
67
|
-
export declare class FridaPoolWorker implements PoolWorker {
|
|
69
|
+
export declare class FridaPoolWorker implements VitestNode.PoolWorker {
|
|
68
70
|
readonly name = "frida-pool";
|
|
71
|
+
readonly agentTemplatePath: URL;
|
|
72
|
+
private readonly poolOptions;
|
|
69
73
|
private readonly customOptions;
|
|
70
|
-
private readonly managedRuntime;
|
|
71
74
|
private readonly cancelables;
|
|
72
|
-
|
|
75
|
+
private modifiedAgentScope;
|
|
76
|
+
private managedRuntime;
|
|
77
|
+
constructor(poolOptions: VitestNode.PoolOptions, customOptions: Schema.Schema.Type<ConfigSchema>);
|
|
73
78
|
start(): Promise<void>;
|
|
74
79
|
stop(): Promise<void>;
|
|
75
|
-
send(message: WorkerRequest): Promise<void>;
|
|
80
|
+
send(message: VitestNode.WorkerRequest): Promise<void>;
|
|
76
81
|
on(event: string, callback: (arg: any) => void): void;
|
|
77
82
|
off(_event: string, callback: (arg: any) => void): void;
|
|
78
|
-
deserialize(data: unknown):
|
|
83
|
+
deserialize(data: unknown): any;
|
|
84
|
+
serialize(data: unknown): unknown;
|
|
79
85
|
}
|
|
80
86
|
/**
|
|
81
87
|
* @since 1.0.0
|
|
82
88
|
* @category Tests
|
|
83
89
|
*/
|
|
84
|
-
export declare const createFridaPool: (customOptions: Schema.Schema.Encoded<
|
|
90
|
+
export declare const createFridaPool: (customOptions: Schema.Schema.Encoded<ConfigSchema>) => VitestNode.PoolRunnerInitializer;
|
|
85
91
|
export {};
|
|
86
92
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,UAAU,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,UAAU,MAAM,aAAa,CAAC;AAkB/C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASxC,cAAM,YAAa,SAAQ,iBAuB1B;CAAG;;;;;;;;;;;;;;AAGJ,cAAM,YAAa,SAAQ,iBAY1B;CAAG;;;;;;;;;AAGJ,cAAM,YAAa,SAAQ,iBAKW;CAAG;AAEzC;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU,CAAC,UAAU;IACzD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,iBAAiB,MAAiD;IAE3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IAEjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAQ1B;IAEF,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,cAAc,CAON;gBAEJ,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IAQ1F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAkDrD,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,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KACnD,UAAU,CAAC,qBAMb,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as NodeContext from "@effect/platform-node/NodeContext";
|
|
2
2
|
import * as Command from "@effect/platform/Command";
|
|
3
3
|
import * as CommandExecutor from "@effect/platform/CommandExecutor";
|
|
4
|
+
import * as FileSystem from "@effect/platform/FileSystem";
|
|
5
|
+
import * as Path from "@effect/platform/Path";
|
|
4
6
|
import * as FridaDevice from "@efffrida/frida-tools/FridaDevice";
|
|
5
7
|
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
6
8
|
import * as FridaSession from "@efffrida/frida-tools/FridaSession";
|
|
@@ -13,7 +15,12 @@ import * as Layer from "effect/Layer";
|
|
|
13
15
|
import * as ManagedRuntime from "effect/ManagedRuntime";
|
|
14
16
|
import * as Match from "effect/Match";
|
|
15
17
|
import * as Schema from "effect/Schema";
|
|
18
|
+
import * as Scope from "effect/Scope";
|
|
19
|
+
import * as Sink from "effect/Sink";
|
|
16
20
|
import * as Stream from "effect/Stream";
|
|
21
|
+
import * as Esbuild from "esbuild";
|
|
22
|
+
import * as Flatted from "flatted";
|
|
23
|
+
import * as Frida from "frida";
|
|
17
24
|
// First, pick your device
|
|
18
25
|
class DeviceSchema extends /*#__PURE__*/Schema.Union(/*#__PURE__*/Schema.Struct({
|
|
19
26
|
device: /*#__PURE__*/Schema.Literal("local")
|
|
@@ -64,8 +71,12 @@ class AttachSchema extends /*#__PURE__*/Schema.Union(/*#__PURE__*/Schema.Struct(
|
|
|
64
71
|
nullable: true
|
|
65
72
|
})
|
|
66
73
|
})) {}
|
|
74
|
+
// Third, pick your runtime and platform
|
|
67
75
|
class ConfigSchema extends /*#__PURE__*/Schema.Struct({
|
|
68
|
-
|
|
76
|
+
runtime: Schema.optionalWith(Schema.Literal("default", "qjs", "v8"), {
|
|
77
|
+
nullable: true
|
|
78
|
+
}),
|
|
79
|
+
platform: Schema.optionalWith(Schema.Literal("gum", "browser", "neutral"), {
|
|
69
80
|
nullable: true
|
|
70
81
|
})
|
|
71
82
|
}).pipe(Schema.extend(DeviceSchema)).pipe(/*#__PURE__*/Schema.extend(AttachSchema)) {}
|
|
@@ -75,12 +86,23 @@ class ConfigSchema extends /*#__PURE__*/Schema.Struct({
|
|
|
75
86
|
*/
|
|
76
87
|
export class FridaPoolWorker {
|
|
77
88
|
name = "frida-pool";
|
|
89
|
+
agentTemplatePath = /*#__PURE__*/new URL("../frida/agent.ts", import.meta.url);
|
|
90
|
+
poolOptions;
|
|
78
91
|
customOptions;
|
|
79
|
-
managedRuntime;
|
|
80
92
|
cancelables;
|
|
81
|
-
|
|
93
|
+
modifiedAgentScope;
|
|
94
|
+
managedRuntime;
|
|
95
|
+
constructor(poolOptions, customOptions) {
|
|
96
|
+
this.poolOptions = poolOptions;
|
|
82
97
|
this.customOptions = customOptions;
|
|
83
98
|
this.cancelables = new Map();
|
|
99
|
+
this.managedRuntime = undefined;
|
|
100
|
+
this.modifiedAgentScope = Effect.runSync(Scope.make());
|
|
101
|
+
}
|
|
102
|
+
async start() {
|
|
103
|
+
const tempAgentUrl = await compileTestFiles(this.agentTemplatePath, this.poolOptions).pipe(Scope.extend(this.modifiedAgentScope)).pipe(Effect.provide(NodeContext.layer)).pipe(Effect.runPromise);
|
|
104
|
+
const FridaRuntime = Match.value(this.customOptions.runtime).pipe(Match.when(undefined, () => undefined), Match.when("v8", () => Frida.ScriptRuntime.V8), Match.when("qjs", () => Frida.ScriptRuntime.QJS), Match.when("default", () => Frida.ScriptRuntime.Default), Match.exhaustive);
|
|
105
|
+
const FridaPlatform = Match.value(this.customOptions.platform).pipe(Match.when(undefined, () => undefined), Match.when("gum", () => Frida.JsPlatform.Gum), Match.when("browser", () => Frida.JsPlatform.Browser), Match.when("neutral", () => Frida.JsPlatform.Neutral), Match.exhaustive);
|
|
84
106
|
const DeviceLive = Match.value(this.customOptions).pipe(Match.when({
|
|
85
107
|
device: "local"
|
|
86
108
|
}, () => FridaDevice.layerLocalDevice), Match.when({
|
|
@@ -137,31 +159,39 @@ export class FridaPoolWorker {
|
|
|
137
159
|
spawn
|
|
138
160
|
}) => FridaSession.layer(spawn)));
|
|
139
161
|
const FridaLive = Layer.provide(SessionLive, DeviceLive).pipe(Layer.provide(NodeContext.layer));
|
|
140
|
-
const ScriptLive = FridaScript.layer(
|
|
141
|
-
externals: ["jsdom", "happy-dom", "@edge-runtime/vm"]
|
|
142
|
-
|
|
162
|
+
const ScriptLive = FridaScript.layer(tempAgentUrl, {
|
|
163
|
+
externals: ["jsdom", "happy-dom", "@edge-runtime/vm"],
|
|
164
|
+
...(FridaRuntime !== undefined ? {
|
|
165
|
+
runtime: FridaRuntime
|
|
166
|
+
} : {}),
|
|
167
|
+
...(FridaPlatform !== undefined ? {
|
|
168
|
+
platform: FridaPlatform
|
|
169
|
+
} : {})
|
|
170
|
+
}).pipe(Layer.provide(FridaLive));
|
|
143
171
|
this.managedRuntime = ManagedRuntime.make(ScriptLive);
|
|
144
|
-
}
|
|
145
|
-
async start() {
|
|
146
172
|
const exit = await this.managedRuntime.runPromiseExit(Effect.void);
|
|
147
173
|
if (Exit.isSuccess(exit)) return;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
174
|
+
const prettyError = Cause.prettyErrors(exit.cause);
|
|
175
|
+
throw prettyError[0];
|
|
151
176
|
}
|
|
152
177
|
async stop() {
|
|
153
|
-
|
|
178
|
+
await this.managedRuntime.dispose();
|
|
179
|
+
await Effect.runPromise(Scope.close(this.modifiedAgentScope, Exit.void));
|
|
154
180
|
}
|
|
155
181
|
async send(message) {
|
|
156
|
-
await this.managedRuntime.
|
|
182
|
+
const exit = await this.managedRuntime.runPromiseExit(Effect.flatMap(FridaScript.FridaScript, fridaScript => fridaScript.callExport("onMessage", Schema.Void)(message)));
|
|
183
|
+
if (Exit.isSuccess(exit)) return;
|
|
184
|
+
const prettyError = Cause.prettyErrors(exit.cause);
|
|
185
|
+
throw prettyError[0];
|
|
157
186
|
}
|
|
158
187
|
on(event, callback) {
|
|
159
188
|
let cancelable;
|
|
189
|
+
const sink = Sink.forEach(input => Effect.sync(() => {
|
|
190
|
+
callback(input.message);
|
|
191
|
+
}));
|
|
160
192
|
switch (event) {
|
|
161
193
|
case "message":
|
|
162
|
-
cancelable = this.managedRuntime.runCallback(Effect.flatMap(FridaScript.FridaScript, fridaScript => fridaScript.stream
|
|
163
|
-
message
|
|
164
|
-
}) => Effect.sync(() => callback(message))))));
|
|
194
|
+
cancelable = this.managedRuntime.runCallback(Effect.flatMap(FridaScript.FridaScript, fridaScript => Stream.run(fridaScript.stream, sink)));
|
|
165
195
|
break;
|
|
166
196
|
case "error":
|
|
167
197
|
cancelable = this.managedRuntime.runCallback(Effect.flatMap(FridaScript.FridaScript, fridaScript => Deferred.await(fridaScript.scriptError)), {
|
|
@@ -186,6 +216,9 @@ export class FridaPoolWorker {
|
|
|
186
216
|
}
|
|
187
217
|
}
|
|
188
218
|
deserialize(data) {
|
|
219
|
+
if (typeof data !== "string") return data;else return Flatted.parse(data);
|
|
220
|
+
}
|
|
221
|
+
serialize(data) {
|
|
189
222
|
return data;
|
|
190
223
|
}
|
|
191
224
|
}
|
|
@@ -200,4 +233,186 @@ export const createFridaPool = customOptions => {
|
|
|
200
233
|
createPoolWorker: options => new FridaPoolWorker(options, decoded)
|
|
201
234
|
};
|
|
202
235
|
};
|
|
236
|
+
/** @internal */
|
|
237
|
+
const vitestGlobalsPlugin = {
|
|
238
|
+
name: "vitest-globals",
|
|
239
|
+
setup(build) {
|
|
240
|
+
// Handle vitest and @vitest/* imports
|
|
241
|
+
build.onResolve({
|
|
242
|
+
filter: /^(vitest|@vitest\/.*)$/
|
|
243
|
+
}, args => ({
|
|
244
|
+
path: args.path,
|
|
245
|
+
namespace: "vitest-globals"
|
|
246
|
+
}));
|
|
247
|
+
build.onLoad({
|
|
248
|
+
filter: /.*/,
|
|
249
|
+
namespace: "vitest-globals"
|
|
250
|
+
}, args => {
|
|
251
|
+
if (args.path === "vitest") {
|
|
252
|
+
return {
|
|
253
|
+
loader: "js",
|
|
254
|
+
contents: "export * from 'VITEST_GLOBAL';\nexport { default } from 'VITEST_GLOBAL';"
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (args.path === "@vitest/runner") {
|
|
258
|
+
return {
|
|
259
|
+
loader: "js",
|
|
260
|
+
contents: "export * from 'VITEST_RUNNER_GLOBAL';\nexport { default } from 'VITEST_RUNNER_GLOBAL';"
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
loader: "js",
|
|
265
|
+
contents: "export * from 'VITEST_GLOBAL';\nexport { default } from 'VITEST_GLOBAL';"
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
build.onResolve({
|
|
269
|
+
filter: /^VITEST_(GLOBAL|RUNNER_GLOBAL)$/
|
|
270
|
+
}, args => ({
|
|
271
|
+
path: args.path,
|
|
272
|
+
namespace: "vitest-synthetic"
|
|
273
|
+
}));
|
|
274
|
+
build.onLoad({
|
|
275
|
+
filter: /.*/,
|
|
276
|
+
namespace: "vitest-synthetic"
|
|
277
|
+
}, args => {
|
|
278
|
+
const globalName = args.path === "VITEST_GLOBAL" ? "__vitest" : "__vitest_runner";
|
|
279
|
+
return {
|
|
280
|
+
loader: "js",
|
|
281
|
+
contents: `
|
|
282
|
+
const g = globalThis.${globalName};
|
|
283
|
+
export default g;
|
|
284
|
+
export const {
|
|
285
|
+
describe, it, test, expect, vi, beforeAll, afterAll,
|
|
286
|
+
beforeEach, afterEach, suite, bench, assert
|
|
287
|
+
} = g;
|
|
288
|
+
`
|
|
289
|
+
};
|
|
290
|
+
});
|
|
291
|
+
// Handle Node.js built-in modules - redirect to globals set up by the agent
|
|
292
|
+
// The agent imports these from frida-compile's shims and exposes them as globals
|
|
293
|
+
const nodeModuleMap = {
|
|
294
|
+
"node:assert": "__node_assert",
|
|
295
|
+
"node:buffer": "__node_buffer",
|
|
296
|
+
"node:crypto": "__node_crypto",
|
|
297
|
+
"node:diagnostics_channel": "__node_diagnosticsChannel",
|
|
298
|
+
"node:events": "__node_events",
|
|
299
|
+
"node:fs": "__node_fs",
|
|
300
|
+
"node:net": "__node_net",
|
|
301
|
+
"node:os": "__node_os",
|
|
302
|
+
"node:path": "__node_path",
|
|
303
|
+
"node:process": "__node_process",
|
|
304
|
+
"node:stream": "__node_stream",
|
|
305
|
+
"node:timers": "__node_timers",
|
|
306
|
+
"node:tty": "__node_tty",
|
|
307
|
+
"node:url": "__node_url",
|
|
308
|
+
"node:util": "__node_util",
|
|
309
|
+
"node:vm": "__node_vm",
|
|
310
|
+
assert: "__node_assert",
|
|
311
|
+
buffer: "__node_buffer",
|
|
312
|
+
crypto: "__node_crypto",
|
|
313
|
+
diagnostics_channel: "__node_diagnosticsChannel",
|
|
314
|
+
events: "__node_events",
|
|
315
|
+
fs: "__node_fs",
|
|
316
|
+
net: "__node_net",
|
|
317
|
+
os: "__node_os",
|
|
318
|
+
path: "__node_path",
|
|
319
|
+
process: "__node_process",
|
|
320
|
+
stream: "__node_stream",
|
|
321
|
+
timers: "__node_timers",
|
|
322
|
+
tty: "__node_tty",
|
|
323
|
+
url: "__node_url",
|
|
324
|
+
util: "__node_util",
|
|
325
|
+
vm: "__node_vm"
|
|
326
|
+
};
|
|
327
|
+
build.onResolve({
|
|
328
|
+
filter: /^(node:)?(assert|buffer|crypto|diagnostics_channel|events|fs|net|os|path|process|stream|timers|tty|url|util|vm)$/
|
|
329
|
+
}, args => ({
|
|
330
|
+
path: args.path,
|
|
331
|
+
namespace: "node-globals"
|
|
332
|
+
}));
|
|
333
|
+
build.onLoad({
|
|
334
|
+
filter: /.*/,
|
|
335
|
+
namespace: "node-globals"
|
|
336
|
+
}, args => {
|
|
337
|
+
const globalName = nodeModuleMap[args.path];
|
|
338
|
+
if (!globalName) {
|
|
339
|
+
return {
|
|
340
|
+
loader: "js",
|
|
341
|
+
contents: "export default {};"
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
loader: "js",
|
|
346
|
+
contents: `
|
|
347
|
+
const m = globalThis.${globalName};
|
|
348
|
+
export default m;
|
|
349
|
+
export const { Buffer } = m.Buffer ? m : { Buffer: m.default?.Buffer };
|
|
350
|
+
export * from 'NODE_MODULE_REEXPORT_${globalName}';
|
|
351
|
+
`
|
|
352
|
+
};
|
|
353
|
+
});
|
|
354
|
+
// Handle re-exports from node modules
|
|
355
|
+
build.onResolve({
|
|
356
|
+
filter: /^NODE_MODULE_REEXPORT_/
|
|
357
|
+
}, args => ({
|
|
358
|
+
path: args.path,
|
|
359
|
+
namespace: "node-reexport"
|
|
360
|
+
}));
|
|
361
|
+
build.onLoad({
|
|
362
|
+
filter: /.*/,
|
|
363
|
+
namespace: "node-reexport"
|
|
364
|
+
}, args => {
|
|
365
|
+
const globalName = args.path.replace("NODE_MODULE_REEXPORT_", "");
|
|
366
|
+
return {
|
|
367
|
+
loader: "js",
|
|
368
|
+
contents: `
|
|
369
|
+
const m = globalThis.${globalName};
|
|
370
|
+
const mod = m.default || m;
|
|
371
|
+
for (const key in mod) {
|
|
372
|
+
if (key !== 'default') {
|
|
373
|
+
Object.defineProperty(exports, key, {
|
|
374
|
+
enumerable: true,
|
|
375
|
+
get: () => mod[key]
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
`
|
|
380
|
+
};
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
/** @internal */
|
|
385
|
+
const compileTestFiles = /*#__PURE__*/Effect.fnUntraced(function* (agentTemplatePath, poolOptions, customOptions) {
|
|
386
|
+
const path = yield* Path.Path;
|
|
387
|
+
const fs = yield* FileSystem.FileSystem;
|
|
388
|
+
const url = yield* path.fromFileUrl(agentTemplatePath);
|
|
389
|
+
const testFiles = poolOptions.project.testFilesList ?? [];
|
|
390
|
+
const testFilesMap = {};
|
|
391
|
+
const esbuildPlatform = Match.value(customOptions?.platform).pipe(Match.when("browser", () => "browser"), Match.when("neutral", () => "neutral"), Match.whenOr("gum", undefined, () => "node"), Match.orElseAbsurd);
|
|
392
|
+
for (const testFile of testFiles) {
|
|
393
|
+
const result = yield* Effect.promise(() => Esbuild.build({
|
|
394
|
+
bundle: true,
|
|
395
|
+
write: false,
|
|
396
|
+
format: "esm",
|
|
397
|
+
platform: esbuildPlatform,
|
|
398
|
+
target: "es2020",
|
|
399
|
+
entryPoints: [testFile],
|
|
400
|
+
plugins: [vitestGlobalsPlugin]
|
|
401
|
+
}));
|
|
402
|
+
if (!result.outputFiles || result.outputFiles.length === 0) {
|
|
403
|
+
throw new Error(`esbuild produced no output for ${testFile}`);
|
|
404
|
+
} else {
|
|
405
|
+
testFilesMap[testFile] = Buffer.from(result.outputFiles[0].text).toString("base64");
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const agentTemplateContents = yield* fs.readFileString(url);
|
|
409
|
+
const modifiedAgentContents = agentTemplateContents.replace(/^const testFiles: Record<string, string> = \{\};$/m, `const testFiles: Record<string, string> = ${JSON.stringify(testFilesMap, null, 4)};`);
|
|
410
|
+
const tempAgentPath = yield* fs.makeTempFileScoped({
|
|
411
|
+
suffix: ".ts",
|
|
412
|
+
prefix: ".agent-",
|
|
413
|
+
directory: path.dirname(url)
|
|
414
|
+
});
|
|
415
|
+
yield* fs.writeFileString(tempAgentPath, modifiedAgentContents);
|
|
416
|
+
return yield* path.toFileUrl(tempAgentPath);
|
|
417
|
+
});
|
|
203
418
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["NodeContext","Command","CommandExecutor","FridaDevice","FridaScript","FridaSession","Cause","Deferred","Duration","Effect","Exit","Layer","ManagedRuntime","Match","Schema","Stream","DeviceSchema","Union","Struct","device","Literal","timeout","optionalWith","DurationFromMillis","nullable","address","String","token","origin","keepaliveInterval","emulatorName","hidden","Boolean","adbExecutable","fridaExecutable","emulatorExecutable","AttachSchema","attach","Number","pipe","brand","spawn","NonEmptyArrayEnsure","preSpawn","attachFrontmost","frontmostScope","ConfigSchema","isolated","extend","FridaPoolWorker","name","customOptions","managedRuntime","cancelables","constructor","_poolOptions","Map","DeviceLive","value","when","layerLocalDevice","layerUsbDevice","toMillis","undefined","layerRemoteDevice","toSeconds","layerAndroidEmulatorDevice","exhaustive","SessionLive","number","layer","layerFrontmost","scope","unwrapScoped","gen","executor","command","make","process","start","pid","orElse","FridaLive","provide","ScriptLive","URL","import","meta","url","externals","fresh","exit","runPromiseExit","void","isSuccess","pretty","cause","renderErrorCause","stop","dispose","send","message","runPromise","flatMap","fridaScript","callExport","Void","on","event","callback","cancelable","runCallback","stream","runForEach","sync","await","scriptError","onExit","destroyed","Error","set","off","_event","get","delete","deserialize","data","createFridaPool","decoded","decodeUnknownSync","createPoolWorker","options"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["NodeContext","Command","CommandExecutor","FileSystem","Path","FridaDevice","FridaScript","FridaSession","Cause","Deferred","Duration","Effect","Exit","Layer","ManagedRuntime","Match","Schema","Scope","Sink","Stream","Esbuild","Flatted","Frida","DeviceSchema","Union","Struct","device","Literal","timeout","optionalWith","DurationFromMillis","nullable","address","String","token","origin","keepaliveInterval","emulatorName","hidden","Boolean","adbExecutable","fridaExecutable","emulatorExecutable","AttachSchema","attach","Number","pipe","brand","spawn","NonEmptyArrayEnsure","preSpawn","attachFrontmost","frontmostScope","ConfigSchema","runtime","platform","extend","FridaPoolWorker","name","agentTemplatePath","URL","import","meta","url","poolOptions","customOptions","cancelables","modifiedAgentScope","managedRuntime","constructor","Map","undefined","runSync","make","start","tempAgentUrl","compileTestFiles","provide","layer","runPromise","FridaRuntime","value","when","ScriptRuntime","V8","QJS","Default","exhaustive","FridaPlatform","JsPlatform","Gum","Browser","Neutral","DeviceLive","layerLocalDevice","layerUsbDevice","toMillis","layerRemoteDevice","toSeconds","layerAndroidEmulatorDevice","SessionLive","number","layerFrontmost","scope","unwrapScoped","gen","executor","command","process","pid","orElse","FridaLive","ScriptLive","externals","exit","runPromiseExit","void","isSuccess","prettyError","prettyErrors","cause","stop","dispose","close","send","message","flatMap","fridaScript","callExport","Void","on","event","callback","cancelable","sink","forEach","input","sync","runCallback","run","stream","await","scriptError","onExit","destroyed","Error","set","off","_event","get","delete","deserialize","data","parse","serialize","createFridaPool","decoded","decodeUnknownSync","createPoolWorker","options","vitestGlobalsPlugin","setup","build","onResolve","filter","args","path","namespace","onLoad","loader","contents","globalName","nodeModuleMap","assert","buffer","crypto","diagnostics_channel","events","fs","net","os","timers","tty","util","vm","replace","fnUntraced","fromFileUrl","testFiles","project","testFilesList","testFilesMap","esbuildPlatform","whenOr","orElseAbsurd","testFile","result","promise","bundle","write","format","target","entryPoints","plugins","outputFiles","length","Buffer","from","text","toString","agentTemplateContents","readFileString","modifiedAgentContents","JSON","stringify","tempAgentPath","makeTempFileScoped","suffix","prefix","directory","dirname","writeFileString","toFileUrl"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@efffrida/vitest-pool",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "effect vitest-pool",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "effect frida vitest-pool",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"frida.re",
|
|
7
7
|
"reverse engineering",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"type": "module",
|
|
20
20
|
"exports": {
|
|
21
21
|
"./package.json": "./package.json",
|
|
22
|
-
".": "./dist/src/index.
|
|
23
|
-
"./*": "./dist/src/*.
|
|
22
|
+
".": "./dist/src/index.js",
|
|
23
|
+
"./*": "./dist/src/*.js",
|
|
24
24
|
"./internal/*": null
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
@@ -31,27 +31,34 @@
|
|
|
31
31
|
"dist/**/*.d.ts.map"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@
|
|
34
|
+
"@vitest/runner": "4.0.14",
|
|
35
|
+
"@vitest/utils": "4.0.14",
|
|
36
|
+
"birpc": "2.8.0",
|
|
37
|
+
"esbuild": "0.27.1",
|
|
38
|
+
"flatted": "3.3.3",
|
|
39
|
+
"@efffrida/polyfills": "0.0.1",
|
|
40
|
+
"@efffrida/frida-tools": "0.0.16"
|
|
35
41
|
},
|
|
36
42
|
"devDependencies": {
|
|
37
|
-
"@effect/cluster": "0.
|
|
38
|
-
"@effect/experimental": "0.57.
|
|
39
|
-
"@effect/platform": "0.93.
|
|
40
|
-
"@effect/platform-node": "0.
|
|
41
|
-
"@effect/rpc": "0.72.
|
|
42
|
-
"@effect/sql": "0.48.
|
|
43
|
-
"@effect/workflow": "0.
|
|
43
|
+
"@effect/cluster": "0.54.0",
|
|
44
|
+
"@effect/experimental": "0.57.8",
|
|
45
|
+
"@effect/platform": "0.93.5",
|
|
46
|
+
"@effect/platform-node": "0.102.0",
|
|
47
|
+
"@effect/rpc": "0.72.2",
|
|
48
|
+
"@effect/sql": "0.48.5",
|
|
49
|
+
"@effect/workflow": "0.14.0",
|
|
44
50
|
"@types/frida-gum": "19.0.1",
|
|
45
|
-
"@types/node": "24.10.
|
|
46
|
-
"
|
|
47
|
-
"effect": "3.19.0",
|
|
51
|
+
"@types/node": "24.10.1",
|
|
52
|
+
"effect": "3.19.8",
|
|
48
53
|
"frida": "17.5.1",
|
|
49
|
-
"vitest": "4.0.
|
|
54
|
+
"vitest": "4.0.14"
|
|
50
55
|
},
|
|
51
56
|
"peerDependencies": {
|
|
52
|
-
"@effect/platform": "0.93.
|
|
53
|
-
"
|
|
54
|
-
"vitest": "4.0.
|
|
57
|
+
"@effect/platform": "0.93.5",
|
|
58
|
+
"@vitest/runner": "4.0.14",
|
|
59
|
+
"@vitest/utils": "4.0.14",
|
|
60
|
+
"effect": "3.19.8",
|
|
61
|
+
"vitest": "4.0.14"
|
|
55
62
|
},
|
|
56
63
|
"publishConfig": {
|
|
57
64
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type * as PlatformError from "@effect/platform/Error";
|
|
2
2
|
import type * as FridaDeviceAcquisitionError from "@efffrida/frida-tools/FridaDeviceAcquisitionError";
|
|
3
3
|
import type * as FridaSessionError from "@efffrida/frida-tools/FridaSessionError";
|
|
4
|
+
import type * as Option from "effect/Option";
|
|
4
5
|
import type * as Runtime from "effect/Runtime";
|
|
5
|
-
import type * as Frida from "frida";
|
|
6
6
|
import type * as VitestNode from "vitest/node";
|
|
7
|
-
import type { PoolWorker, WorkerRequest } from "vitest/node";
|
|
8
7
|
|
|
9
8
|
import * as NodeContext from "@effect/platform-node/NodeContext";
|
|
10
9
|
import * as Command from "@effect/platform/Command";
|
|
11
10
|
import * as CommandExecutor from "@effect/platform/CommandExecutor";
|
|
11
|
+
import * as FileSystem from "@effect/platform/FileSystem";
|
|
12
|
+
import * as Path from "@effect/platform/Path";
|
|
12
13
|
import * as FridaDevice from "@efffrida/frida-tools/FridaDevice";
|
|
13
14
|
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
14
15
|
import * as FridaSession from "@efffrida/frida-tools/FridaSession";
|
|
@@ -21,7 +22,12 @@ import * as Layer from "effect/Layer";
|
|
|
21
22
|
import * as ManagedRuntime from "effect/ManagedRuntime";
|
|
22
23
|
import * as Match from "effect/Match";
|
|
23
24
|
import * as Schema from "effect/Schema";
|
|
25
|
+
import * as Scope from "effect/Scope";
|
|
26
|
+
import * as Sink from "effect/Sink";
|
|
24
27
|
import * as Stream from "effect/Stream";
|
|
28
|
+
import * as Esbuild from "esbuild";
|
|
29
|
+
import * as Flatted from "flatted";
|
|
30
|
+
import * as Frida from "frida";
|
|
25
31
|
|
|
26
32
|
// First, pick your device
|
|
27
33
|
class DeviceSchema extends Schema.Union(
|
|
@@ -64,8 +70,10 @@ class AttachSchema extends Schema.Union(
|
|
|
64
70
|
})
|
|
65
71
|
) {}
|
|
66
72
|
|
|
73
|
+
// Third, pick your runtime and platform
|
|
67
74
|
class ConfigSchema extends Schema.Struct({
|
|
68
|
-
|
|
75
|
+
runtime: Schema.optionalWith(Schema.Literal("default", "qjs", "v8"), { nullable: true }),
|
|
76
|
+
platform: Schema.optionalWith(Schema.Literal("gum", "browser", "neutral"), { nullable: true }),
|
|
69
77
|
})
|
|
70
78
|
.pipe(Schema.extend(DeviceSchema))
|
|
71
79
|
.pipe(Schema.extend(AttachSchema)) {}
|
|
@@ -74,16 +82,12 @@ class ConfigSchema extends Schema.Struct({
|
|
|
74
82
|
* @since 1.0.0
|
|
75
83
|
* @category Tests
|
|
76
84
|
*/
|
|
77
|
-
export class FridaPoolWorker implements PoolWorker {
|
|
85
|
+
export class FridaPoolWorker implements VitestNode.PoolWorker {
|
|
78
86
|
readonly name = "frida-pool";
|
|
87
|
+
readonly agentTemplatePath = new URL("../frida/agent.ts", import.meta.url);
|
|
79
88
|
|
|
80
|
-
private readonly
|
|
81
|
-
private readonly
|
|
82
|
-
FridaScript.FridaScript,
|
|
83
|
-
| FridaDeviceAcquisitionError.FridaDeviceAcquisitionError
|
|
84
|
-
| PlatformError.PlatformError
|
|
85
|
-
| FridaSessionError.FridaSessionError
|
|
86
|
-
>;
|
|
89
|
+
private readonly poolOptions: VitestNode.PoolOptions;
|
|
90
|
+
private readonly customOptions: Schema.Schema.Type<ConfigSchema>;
|
|
87
91
|
|
|
88
92
|
private readonly cancelables: Map<
|
|
89
93
|
(arg: any) => void,
|
|
@@ -95,9 +99,45 @@ export class FridaPoolWorker implements PoolWorker {
|
|
|
95
99
|
>
|
|
96
100
|
>;
|
|
97
101
|
|
|
98
|
-
|
|
102
|
+
private modifiedAgentScope: Scope.CloseableScope;
|
|
103
|
+
private managedRuntime:
|
|
104
|
+
| ManagedRuntime.ManagedRuntime<
|
|
105
|
+
FridaScript.FridaScript,
|
|
106
|
+
| FridaDeviceAcquisitionError.FridaDeviceAcquisitionError
|
|
107
|
+
| PlatformError.PlatformError
|
|
108
|
+
| FridaSessionError.FridaSessionError
|
|
109
|
+
>
|
|
110
|
+
| undefined;
|
|
111
|
+
|
|
112
|
+
constructor(poolOptions: VitestNode.PoolOptions, customOptions: Schema.Schema.Type<ConfigSchema>) {
|
|
113
|
+
this.poolOptions = poolOptions;
|
|
99
114
|
this.customOptions = customOptions;
|
|
100
115
|
this.cancelables = new Map();
|
|
116
|
+
this.managedRuntime = undefined;
|
|
117
|
+
this.modifiedAgentScope = Effect.runSync(Scope.make());
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async start(): Promise<void> {
|
|
121
|
+
const tempAgentUrl = await compileTestFiles(this.agentTemplatePath, this.poolOptions)
|
|
122
|
+
.pipe(Scope.extend(this.modifiedAgentScope))
|
|
123
|
+
.pipe(Effect.provide(NodeContext.layer))
|
|
124
|
+
.pipe(Effect.runPromise);
|
|
125
|
+
|
|
126
|
+
const FridaRuntime = Match.value(this.customOptions.runtime).pipe(
|
|
127
|
+
Match.when(undefined, () => undefined),
|
|
128
|
+
Match.when("v8", () => Frida.ScriptRuntime.V8),
|
|
129
|
+
Match.when("qjs", () => Frida.ScriptRuntime.QJS),
|
|
130
|
+
Match.when("default", () => Frida.ScriptRuntime.Default),
|
|
131
|
+
Match.exhaustive
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const FridaPlatform = Match.value(this.customOptions.platform).pipe(
|
|
135
|
+
Match.when(undefined, () => undefined),
|
|
136
|
+
Match.when("gum", () => Frida.JsPlatform.Gum),
|
|
137
|
+
Match.when("browser", () => Frida.JsPlatform.Browser),
|
|
138
|
+
Match.when("neutral", () => Frida.JsPlatform.Neutral),
|
|
139
|
+
Match.exhaustive
|
|
140
|
+
);
|
|
101
141
|
|
|
102
142
|
const DeviceLive = Match.value(this.customOptions).pipe(
|
|
103
143
|
Match.when({ device: "local" }, () => FridaDevice.layerLocalDevice),
|
|
@@ -145,31 +185,34 @@ export class FridaPoolWorker implements PoolWorker {
|
|
|
145
185
|
);
|
|
146
186
|
|
|
147
187
|
const FridaLive = Layer.provide(SessionLive, DeviceLive).pipe(Layer.provide(NodeContext.layer));
|
|
148
|
-
const ScriptLive = FridaScript.layer(
|
|
188
|
+
const ScriptLive = FridaScript.layer(tempAgentUrl, {
|
|
149
189
|
externals: ["jsdom", "happy-dom", "@edge-runtime/vm"],
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
190
|
+
...(FridaRuntime !== undefined ? { runtime: FridaRuntime } : {}),
|
|
191
|
+
...(FridaPlatform !== undefined ? { platform: FridaPlatform } : {}),
|
|
192
|
+
}).pipe(Layer.provide(FridaLive));
|
|
153
193
|
|
|
154
194
|
this.managedRuntime = ManagedRuntime.make(ScriptLive);
|
|
155
|
-
}
|
|
156
195
|
|
|
157
|
-
async start(): Promise<void> {
|
|
158
196
|
const exit = await this.managedRuntime.runPromiseExit(Effect.void);
|
|
159
197
|
if (Exit.isSuccess(exit)) return;
|
|
160
|
-
|
|
198
|
+
const prettyError = Cause.prettyErrors(exit.cause);
|
|
199
|
+
throw prettyError[0];
|
|
161
200
|
}
|
|
162
201
|
|
|
163
202
|
async stop(): Promise<void> {
|
|
164
|
-
|
|
203
|
+
await this.managedRuntime!.dispose();
|
|
204
|
+
await Effect.runPromise(Scope.close(this.modifiedAgentScope, Exit.void));
|
|
165
205
|
}
|
|
166
206
|
|
|
167
|
-
async send(message: WorkerRequest): Promise<void> {
|
|
168
|
-
await this.managedRuntime
|
|
207
|
+
async send(message: VitestNode.WorkerRequest): Promise<void> {
|
|
208
|
+
const exit = await this.managedRuntime!.runPromiseExit(
|
|
169
209
|
Effect.flatMap(FridaScript.FridaScript, (fridaScript) =>
|
|
170
210
|
fridaScript.callExport("onMessage", Schema.Void)(message)
|
|
171
211
|
)
|
|
172
212
|
);
|
|
213
|
+
if (Exit.isSuccess(exit)) return;
|
|
214
|
+
const prettyError = Cause.prettyErrors(exit.cause);
|
|
215
|
+
throw prettyError[0];
|
|
173
216
|
}
|
|
174
217
|
|
|
175
218
|
on(event: string, callback: (arg: any) => void): void {
|
|
@@ -180,26 +223,36 @@ export class FridaPoolWorker implements PoolWorker {
|
|
|
180
223
|
| FridaSessionError.FridaSessionError
|
|
181
224
|
>;
|
|
182
225
|
|
|
226
|
+
const sink = Sink.forEach<
|
|
227
|
+
{
|
|
228
|
+
message: unknown;
|
|
229
|
+
data: Option.Option<Buffer<ArrayBufferLike>>;
|
|
230
|
+
},
|
|
231
|
+
void,
|
|
232
|
+
never,
|
|
233
|
+
never
|
|
234
|
+
>((input) =>
|
|
235
|
+
Effect.sync(() => {
|
|
236
|
+
callback(input.message);
|
|
237
|
+
})
|
|
238
|
+
);
|
|
239
|
+
|
|
183
240
|
switch (event) {
|
|
184
241
|
case "message":
|
|
185
|
-
cancelable = this.managedRuntime
|
|
186
|
-
Effect.flatMap(FridaScript.FridaScript, (fridaScript) =>
|
|
187
|
-
fridaScript.stream.pipe(
|
|
188
|
-
Stream.runForEach(({ message }) => Effect.sync(() => callback(message)))
|
|
189
|
-
)
|
|
190
|
-
)
|
|
242
|
+
cancelable = this.managedRuntime!.runCallback(
|
|
243
|
+
Effect.flatMap(FridaScript.FridaScript, (fridaScript) => Stream.run(fridaScript.stream, sink))
|
|
191
244
|
);
|
|
192
245
|
break;
|
|
193
246
|
|
|
194
247
|
case "error":
|
|
195
|
-
cancelable = this.managedRuntime
|
|
248
|
+
cancelable = this.managedRuntime!.runCallback(
|
|
196
249
|
Effect.flatMap(FridaScript.FridaScript, (fridaScript) => Deferred.await(fridaScript.scriptError)),
|
|
197
250
|
{ onExit: (exit) => (Exit.isSuccess(exit) ? callback(exit.value) : callback(exit.cause)) }
|
|
198
251
|
);
|
|
199
252
|
break;
|
|
200
253
|
|
|
201
254
|
case "exit":
|
|
202
|
-
cancelable = this.managedRuntime
|
|
255
|
+
cancelable = this.managedRuntime!.runCallback(
|
|
203
256
|
Effect.flatMap(FridaScript.FridaScript, (fridaScript) => Deferred.await(fridaScript.destroyed)),
|
|
204
257
|
{ onExit: () => callback(undefined) }
|
|
205
258
|
);
|
|
@@ -221,6 +274,11 @@ export class FridaPoolWorker implements PoolWorker {
|
|
|
221
274
|
}
|
|
222
275
|
|
|
223
276
|
deserialize(data: unknown) {
|
|
277
|
+
if (typeof data !== "string") return data;
|
|
278
|
+
else return Flatted.parse(data);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
serialize(data: unknown) {
|
|
224
282
|
return data;
|
|
225
283
|
}
|
|
226
284
|
}
|
|
@@ -230,7 +288,7 @@ export class FridaPoolWorker implements PoolWorker {
|
|
|
230
288
|
* @category Tests
|
|
231
289
|
*/
|
|
232
290
|
export const createFridaPool = (
|
|
233
|
-
customOptions: Schema.Schema.Encoded<
|
|
291
|
+
customOptions: Schema.Schema.Encoded<ConfigSchema>
|
|
234
292
|
): VitestNode.PoolRunnerInitializer => {
|
|
235
293
|
const decoded = Schema.decodeUnknownSync(ConfigSchema)(customOptions);
|
|
236
294
|
return {
|
|
@@ -238,3 +296,198 @@ export const createFridaPool = (
|
|
|
238
296
|
createPoolWorker: (options: VitestNode.PoolOptions) => new FridaPoolWorker(options, decoded),
|
|
239
297
|
};
|
|
240
298
|
};
|
|
299
|
+
|
|
300
|
+
/** @internal */
|
|
301
|
+
const vitestGlobalsPlugin: Esbuild.Plugin = {
|
|
302
|
+
name: "vitest-globals",
|
|
303
|
+
setup(build) {
|
|
304
|
+
// Handle vitest and @vitest/* imports
|
|
305
|
+
build.onResolve({ filter: /^(vitest|@vitest\/.*)$/ }, (args) => ({
|
|
306
|
+
path: args.path,
|
|
307
|
+
namespace: "vitest-globals",
|
|
308
|
+
}));
|
|
309
|
+
|
|
310
|
+
build.onLoad({ filter: /.*/, namespace: "vitest-globals" }, (args) => {
|
|
311
|
+
if (args.path === "vitest") {
|
|
312
|
+
return {
|
|
313
|
+
loader: "js",
|
|
314
|
+
contents: "export * from 'VITEST_GLOBAL';\nexport { default } from 'VITEST_GLOBAL';",
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
if (args.path === "@vitest/runner") {
|
|
318
|
+
return {
|
|
319
|
+
loader: "js",
|
|
320
|
+
contents: "export * from 'VITEST_RUNNER_GLOBAL';\nexport { default } from 'VITEST_RUNNER_GLOBAL';",
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
loader: "js",
|
|
325
|
+
contents: "export * from 'VITEST_GLOBAL';\nexport { default } from 'VITEST_GLOBAL';",
|
|
326
|
+
};
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
build.onResolve({ filter: /^VITEST_(GLOBAL|RUNNER_GLOBAL)$/ }, (args) => ({
|
|
330
|
+
path: args.path,
|
|
331
|
+
namespace: "vitest-synthetic",
|
|
332
|
+
}));
|
|
333
|
+
|
|
334
|
+
build.onLoad({ filter: /.*/, namespace: "vitest-synthetic" }, (args) => {
|
|
335
|
+
const globalName = args.path === "VITEST_GLOBAL" ? "__vitest" : "__vitest_runner";
|
|
336
|
+
return {
|
|
337
|
+
loader: "js",
|
|
338
|
+
contents: `
|
|
339
|
+
const g = globalThis.${globalName};
|
|
340
|
+
export default g;
|
|
341
|
+
export const {
|
|
342
|
+
describe, it, test, expect, vi, beforeAll, afterAll,
|
|
343
|
+
beforeEach, afterEach, suite, bench, assert
|
|
344
|
+
} = g;
|
|
345
|
+
`,
|
|
346
|
+
};
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// Handle Node.js built-in modules - redirect to globals set up by the agent
|
|
350
|
+
// The agent imports these from frida-compile's shims and exposes them as globals
|
|
351
|
+
const nodeModuleMap: Record<string, string> = {
|
|
352
|
+
"node:assert": "__node_assert",
|
|
353
|
+
"node:buffer": "__node_buffer",
|
|
354
|
+
"node:crypto": "__node_crypto",
|
|
355
|
+
"node:diagnostics_channel": "__node_diagnosticsChannel",
|
|
356
|
+
"node:events": "__node_events",
|
|
357
|
+
"node:fs": "__node_fs",
|
|
358
|
+
"node:net": "__node_net",
|
|
359
|
+
"node:os": "__node_os",
|
|
360
|
+
"node:path": "__node_path",
|
|
361
|
+
"node:process": "__node_process",
|
|
362
|
+
"node:stream": "__node_stream",
|
|
363
|
+
"node:timers": "__node_timers",
|
|
364
|
+
"node:tty": "__node_tty",
|
|
365
|
+
"node:url": "__node_url",
|
|
366
|
+
"node:util": "__node_util",
|
|
367
|
+
"node:vm": "__node_vm",
|
|
368
|
+
assert: "__node_assert",
|
|
369
|
+
buffer: "__node_buffer",
|
|
370
|
+
crypto: "__node_crypto",
|
|
371
|
+
diagnostics_channel: "__node_diagnosticsChannel",
|
|
372
|
+
events: "__node_events",
|
|
373
|
+
fs: "__node_fs",
|
|
374
|
+
net: "__node_net",
|
|
375
|
+
os: "__node_os",
|
|
376
|
+
path: "__node_path",
|
|
377
|
+
process: "__node_process",
|
|
378
|
+
stream: "__node_stream",
|
|
379
|
+
timers: "__node_timers",
|
|
380
|
+
tty: "__node_tty",
|
|
381
|
+
url: "__node_url",
|
|
382
|
+
util: "__node_util",
|
|
383
|
+
vm: "__node_vm",
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
build.onResolve(
|
|
387
|
+
{
|
|
388
|
+
filter: /^(node:)?(assert|buffer|crypto|diagnostics_channel|events|fs|net|os|path|process|stream|timers|tty|url|util|vm)$/,
|
|
389
|
+
},
|
|
390
|
+
(args) => ({
|
|
391
|
+
path: args.path,
|
|
392
|
+
namespace: "node-globals",
|
|
393
|
+
})
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
build.onLoad({ filter: /.*/, namespace: "node-globals" }, (args) => {
|
|
397
|
+
const globalName = nodeModuleMap[args.path];
|
|
398
|
+
if (!globalName) {
|
|
399
|
+
return { loader: "js", contents: "export default {};" };
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
loader: "js",
|
|
403
|
+
contents: `
|
|
404
|
+
const m = globalThis.${globalName};
|
|
405
|
+
export default m;
|
|
406
|
+
export const { Buffer } = m.Buffer ? m : { Buffer: m.default?.Buffer };
|
|
407
|
+
export * from 'NODE_MODULE_REEXPORT_${globalName}';
|
|
408
|
+
`,
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// Handle re-exports from node modules
|
|
413
|
+
build.onResolve({ filter: /^NODE_MODULE_REEXPORT_/ }, (args) => ({
|
|
414
|
+
path: args.path,
|
|
415
|
+
namespace: "node-reexport",
|
|
416
|
+
}));
|
|
417
|
+
|
|
418
|
+
build.onLoad({ filter: /.*/, namespace: "node-reexport" }, (args) => {
|
|
419
|
+
const globalName = args.path.replace("NODE_MODULE_REEXPORT_", "");
|
|
420
|
+
return {
|
|
421
|
+
loader: "js",
|
|
422
|
+
contents: `
|
|
423
|
+
const m = globalThis.${globalName};
|
|
424
|
+
const mod = m.default || m;
|
|
425
|
+
for (const key in mod) {
|
|
426
|
+
if (key !== 'default') {
|
|
427
|
+
Object.defineProperty(exports, key, {
|
|
428
|
+
enumerable: true,
|
|
429
|
+
get: () => mod[key]
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
`,
|
|
434
|
+
};
|
|
435
|
+
});
|
|
436
|
+
},
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
/** @internal */
|
|
440
|
+
const compileTestFiles = Effect.fnUntraced(function* (
|
|
441
|
+
agentTemplatePath: URL,
|
|
442
|
+
poolOptions: VitestNode.PoolOptions,
|
|
443
|
+
customOptions?: Schema.Schema.Type<ConfigSchema> | undefined
|
|
444
|
+
): Effect.fn.Return<URL, PlatformError.PlatformError, Path.Path | FileSystem.FileSystem | Scope.Scope> {
|
|
445
|
+
const path = yield* Path.Path;
|
|
446
|
+
const fs = yield* FileSystem.FileSystem;
|
|
447
|
+
const url = yield* path.fromFileUrl(agentTemplatePath);
|
|
448
|
+
|
|
449
|
+
const testFiles = poolOptions.project.testFilesList ?? [];
|
|
450
|
+
const testFilesMap: Record<string, string> = {};
|
|
451
|
+
|
|
452
|
+
const esbuildPlatform = Match.value(customOptions?.platform).pipe(
|
|
453
|
+
Match.when("browser", () => "browser" as const),
|
|
454
|
+
Match.when("neutral", () => "neutral" as const),
|
|
455
|
+
Match.whenOr("gum", undefined, () => "node" as const),
|
|
456
|
+
Match.orElseAbsurd
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
for (const testFile of testFiles) {
|
|
460
|
+
const result = yield* Effect.promise(() =>
|
|
461
|
+
Esbuild.build({
|
|
462
|
+
bundle: true,
|
|
463
|
+
write: false,
|
|
464
|
+
format: "esm",
|
|
465
|
+
platform: esbuildPlatform,
|
|
466
|
+
target: "es2020",
|
|
467
|
+
entryPoints: [testFile],
|
|
468
|
+
plugins: [vitestGlobalsPlugin],
|
|
469
|
+
})
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
if (!result.outputFiles || result.outputFiles.length === 0) {
|
|
473
|
+
throw new Error(`esbuild produced no output for ${testFile}`);
|
|
474
|
+
} else {
|
|
475
|
+
testFilesMap[testFile] = Buffer.from(result.outputFiles[0].text).toString("base64");
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const agentTemplateContents = yield* fs.readFileString(url);
|
|
480
|
+
const modifiedAgentContents = agentTemplateContents.replace(
|
|
481
|
+
/^const testFiles: Record<string, string> = \{\};$/m,
|
|
482
|
+
`const testFiles: Record<string, string> = ${JSON.stringify(testFilesMap, null, 4)};`
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
const tempAgentPath = yield* fs.makeTempFileScoped({
|
|
486
|
+
suffix: ".ts",
|
|
487
|
+
prefix: ".agent-",
|
|
488
|
+
directory: path.dirname(url),
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
yield* fs.writeFileString(tempAgentPath, modifiedAgentContents);
|
|
492
|
+
return yield* path.toFileUrl(tempAgentPath);
|
|
493
|
+
});
|