@efffrida/rpc 0.0.27 → 0.0.29
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/FridaRpcClient.d.ts +5 -29
- package/dist/frida/FridaRpcClient.d.ts.map +1 -1
- package/dist/frida/FridaRpcClient.js +48 -83
- package/dist/frida/FridaRpcClient.js.map +1 -1
- package/dist/frida/FridaRpcServer.d.ts +7 -7
- package/dist/frida/FridaRpcServer.d.ts.map +1 -1
- package/dist/frida/FridaRpcServer.js +37 -49
- package/dist/frida/FridaRpcServer.js.map +1 -1
- package/dist/node/FridaRpcClient.d.ts +6 -10
- package/dist/node/FridaRpcClient.d.ts.map +1 -1
- package/dist/node/FridaRpcClient.js +67 -46
- package/dist/node/FridaRpcClient.js.map +1 -1
- package/dist/node/FridaRpcServer.d.ts +10 -3
- package/dist/node/FridaRpcServer.d.ts.map +1 -1
- package/dist/node/FridaRpcServer.js +63 -64
- package/dist/node/FridaRpcServer.js.map +1 -1
- package/dist/shared/{constants.d.ts → Constants.d.ts} +7 -3
- package/dist/shared/Constants.d.ts.map +1 -0
- package/dist/shared/Constants.js +10 -0
- package/dist/shared/Constants.js.map +1 -0
- package/dist/shared/index.d.ts +10 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +10 -0
- package/dist/shared/index.js.map +1 -0
- package/package.json +12 -20
- package/src/frida/FridaRpcClient.ts +65 -141
- package/src/frida/FridaRpcServer.ts +47 -54
- package/src/node/FridaRpcClient.ts +84 -71
- package/src/node/FridaRpcServer.ts +92 -80
- package/src/shared/Constants.ts +13 -0
- package/src/shared/index.ts +10 -0
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js +0 -7
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/predicates.d.ts +0 -10
- package/dist/shared/predicates.d.ts.map +0 -1
- package/dist/shared/predicates.js +0 -12
- package/dist/shared/predicates.js.map +0 -1
- package/src/shared/constants.ts +0 -11
- package/src/shared/predicates.ts +0 -19
|
@@ -4,80 +4,101 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*/
|
|
7
|
-
import * as
|
|
8
|
-
import * as RpcSerialization from "@effect/rpc/RpcSerialization";
|
|
9
|
-
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
7
|
+
import * as Cause from "effect/Cause";
|
|
10
8
|
import * as Effect from "effect/Effect";
|
|
11
9
|
import * as Function from "effect/Function";
|
|
12
10
|
import * as Layer from "effect/Layer";
|
|
13
11
|
import * as Option from "effect/Option";
|
|
14
|
-
import * as
|
|
15
|
-
import * as Predicate from "effect/Predicate";
|
|
12
|
+
import * as Result from "effect/Result";
|
|
16
13
|
import * as Schema from "effect/Schema";
|
|
17
14
|
import * as Stream from "effect/Stream";
|
|
18
|
-
import * as
|
|
15
|
+
import * as RpcClient from "effect/unstable/rpc/RpcClient";
|
|
16
|
+
import * as RpcClientError from "effect/unstable/rpc/RpcClientError";
|
|
17
|
+
import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization";
|
|
18
|
+
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
19
|
+
import * as constants from "../shared/Constants.js";
|
|
19
20
|
/**
|
|
20
21
|
* @since 1.0.0
|
|
21
22
|
* @category Protocol
|
|
22
23
|
*/
|
|
23
|
-
export const makeProtocolFrida = options => RpcClient.Protocol.make(Effect.fnUntraced(function* (writeResponse) {
|
|
24
|
+
export const makeProtocolFrida = options => RpcClient.Protocol.make(Effect.fnUntraced(function* (writeResponse, clientIds) {
|
|
24
25
|
const script = yield* FridaScript.FridaScript;
|
|
25
26
|
const serialization = yield* RpcSerialization.RpcSerialization;
|
|
26
|
-
const parser = serialization.unsafeMake();
|
|
27
27
|
const mainExportName = options?.exportName ?? constants.defaultServerMainExportName;
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}));
|
|
39
|
-
/**
|
|
40
|
-
* Start listening for responses to our requests, decode them, and
|
|
41
|
-
* send the responses back to the implementation.
|
|
42
|
-
*/
|
|
43
|
-
yield* script.stream.pipe(Stream.filterMap(unfiltered => {
|
|
44
|
-
if (receivingPredicate(unfiltered.message)) return unfiltered.data;else return Option.none();
|
|
45
|
-
}), Stream.runForEach(filtered => {
|
|
28
|
+
const informServerToSetupExport = script.callExport(mainExportName, Schema.String);
|
|
29
|
+
const clientExportName = yield* Effect.orDie(informServerToSetupExport());
|
|
30
|
+
const parser = serialization.makeUnsafe();
|
|
31
|
+
const requestClientMap = new Map();
|
|
32
|
+
let currentError = undefined;
|
|
33
|
+
const broadcast = response => Effect.forEach(clientIds, clientId => writeResponse(clientId, response));
|
|
34
|
+
yield* Stream.runForEach(script.stream, message => {
|
|
35
|
+
if (Option.isNone(message.data)) {
|
|
36
|
+
return Effect.void;
|
|
37
|
+
}
|
|
46
38
|
try {
|
|
47
|
-
const responses = parser.decode(
|
|
39
|
+
const responses = parser.decode(message.data.value);
|
|
48
40
|
if (responses.length === 0) return Effect.void;
|
|
49
41
|
let i = 0;
|
|
50
42
|
return Effect.whileLoop({
|
|
43
|
+
step: Function.constVoid,
|
|
51
44
|
while: () => i < responses.length,
|
|
52
|
-
body: () =>
|
|
53
|
-
|
|
45
|
+
body: () => {
|
|
46
|
+
const response = responses[i++];
|
|
47
|
+
if ("requestId" in response) {
|
|
48
|
+
const clientId = requestClientMap.get(response.requestId);
|
|
49
|
+
if (response._tag === "Exit") requestClientMap.delete(response.requestId);
|
|
50
|
+
return writeResponse(clientId, response);
|
|
51
|
+
} else return broadcast(response);
|
|
52
|
+
}
|
|
54
53
|
});
|
|
55
54
|
} catch (defect) {
|
|
56
|
-
return
|
|
57
|
-
_tag: "
|
|
58
|
-
|
|
55
|
+
return broadcast({
|
|
56
|
+
_tag: "ClientProtocolError",
|
|
57
|
+
error: new RpcClientError.RpcClientError({
|
|
58
|
+
reason: new RpcClientError.RpcClientDefect({
|
|
59
|
+
message: "Error decoding message",
|
|
60
|
+
cause: defect
|
|
61
|
+
})
|
|
62
|
+
})
|
|
59
63
|
});
|
|
60
64
|
}
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
}).pipe(Effect.tapCause(cause => {
|
|
66
|
+
const error = Cause.findError(cause);
|
|
67
|
+
const hasError = Result.isSuccess(error);
|
|
68
|
+
const defect = hasError ? new RpcClientError.RpcClientDefect({
|
|
69
|
+
message: error.success.message,
|
|
70
|
+
cause: error.success.cause
|
|
71
|
+
}) : new RpcClientError.RpcClientDefect({
|
|
72
|
+
message: "Unknown error in Frida RPC client stream",
|
|
73
|
+
cause: Cause.squash(cause)
|
|
74
|
+
});
|
|
75
|
+
currentError = new RpcClientError.RpcClientError({
|
|
76
|
+
reason: defect
|
|
77
|
+
});
|
|
78
|
+
return broadcast({
|
|
79
|
+
_tag: "ClientProtocolError",
|
|
80
|
+
error: currentError
|
|
81
|
+
});
|
|
82
|
+
}), Effect.forkScoped);
|
|
72
83
|
return {
|
|
73
|
-
send,
|
|
74
84
|
supportsAck: true,
|
|
75
|
-
supportsTransferables: false
|
|
85
|
+
supportsTransferables: false,
|
|
86
|
+
send(clientId, request) {
|
|
87
|
+
if (currentError) {
|
|
88
|
+
return Effect.fail(currentError);
|
|
89
|
+
}
|
|
90
|
+
if (request._tag === "Request") {
|
|
91
|
+
requestClientMap.set(request.id, clientId);
|
|
92
|
+
}
|
|
93
|
+
const encoded = parser.encode(request);
|
|
94
|
+
if (encoded === undefined) return Effect.void;
|
|
95
|
+
return Effect.orDie(script.callExport(clientExportName)(encoded));
|
|
96
|
+
}
|
|
76
97
|
};
|
|
77
98
|
}));
|
|
78
99
|
/**
|
|
79
100
|
* @since 1.0.0
|
|
80
101
|
* @category Layers
|
|
81
102
|
*/
|
|
82
|
-
export const layerProtocolFrida = options => Layer.
|
|
103
|
+
export const layerProtocolFrida = options => Layer.effect(RpcClient.Protocol, makeProtocolFrida(options));
|
|
83
104
|
//# sourceMappingURL=FridaRpcClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FridaRpcClient.js","names":["
|
|
1
|
+
{"version":3,"file":"FridaRpcClient.js","names":["Cause","Effect","Function","Layer","Option","Result","Schema","Stream","RpcClient","RpcClientError","RpcSerialization","FridaScript","constants","makeProtocolFrida","options","Protocol","make","fnUntraced","writeResponse","clientIds","script","serialization","mainExportName","exportName","defaultServerMainExportName","informServerToSetupExport","callExport","String","clientExportName","orDie","parser","makeUnsafe","requestClientMap","Map","currentError","undefined","broadcast","response","forEach","clientId","runForEach","stream","message","isNone","data","void","responses","decode","value","length","i","whileLoop","step","constVoid","while","body","get","requestId","_tag","delete","defect","error","reason","RpcClientDefect","cause","pipe","tapCause","findError","hasError","isSuccess","success","squash","forkScoped","supportsAck","supportsTransferables","send","request","fail","set","id","encoded","encode","layerProtocolFrida","effect"],"sources":["../../src/node/FridaRpcClient.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;AAUA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,SAAS,MAAM,+BAA+B;AAC1D,OAAO,KAAKC,cAAc,MAAM,oCAAoC;AACpE,OAAO,KAAKC,gBAAgB,MAAM,sCAAsC;AAIxE,OAAO,KAAKC,WAAW,MAAM,mCAAmC;AAEhE,OAAO,KAAKC,SAAS,MAAM,wBAAwB;AAEnD;;;;AAIA,OAAO,MAAMC,iBAAiB,GAC1BC,OAQe,IAMfN,SAAS,CAACO,QAAQ,CAACC,IAAI,CACnBf,MAAM,CAACgB,UAAU,CAAC,WAAWC,aAAa,EAAEC,SAAS;EACjD,MAAMC,MAAM,GAAG,OAAOT,WAAW,CAACA,WAAW;EAC7C,MAAMU,aAAa,GAAG,OAAOX,gBAAgB,CAACA,gBAAgB;EAE9D,MAAMY,cAAc,GAAGR,OAAO,EAAES,UAAU,IAAIX,SAAS,CAACY,2BAA2B;EACnF,MAAMC,yBAAyB,GAAGL,MAAM,CAACM,UAAU,CAACJ,cAAc,EAAEhB,MAAM,CAACqB,MAAM,CAAC;EAClF,MAAMC,gBAAgB,GAAG,OAAO3B,MAAM,CAAC4B,KAAK,CAACJ,yBAAyB,EAAE,CAAC;EAEzE,MAAMK,MAAM,GAAGT,aAAa,CAACU,UAAU,EAAE;EACzC,MAAMC,gBAAgB,GAAG,IAAIC,GAAG,EAAkB;EAClD,IAAIC,YAAY,GAA8CC,SAAS;EAEvE,MAAMC,SAAS,GAAIC,QAAsC,IACrDpC,MAAM,CAACqC,OAAO,CAACnB,SAAS,EAAGoB,QAAQ,IAAKrB,aAAa,CAACqB,QAAQ,EAAEF,QAAQ,CAAC,CAAC;EAE9E,OAAO9B,MAAM,CAACiC,UAAU,CAACpB,MAAM,CAACqB,MAAM,EAAGC,OAAO,IAAI;IAChD,IAAItC,MAAM,CAACuC,MAAM,CAACD,OAAO,CAACE,IAAI,CAAC,EAAE;MAC7B,OAAO3C,MAAM,CAAC4C,IAAI;IACtB;IAEA,IAAI;MACA,MAAMC,SAAS,GAAGhB,MAAM,CAACiB,MAAM,CAACL,OAAO,CAACE,IAAI,CAACI,KAAK,CAAwC;MAC1F,IAAIF,SAAS,CAACG,MAAM,KAAK,CAAC,EAAE,OAAOhD,MAAM,CAAC4C,IAAI;MAC9C,IAAIK,CAAC,GAAG,CAAC;MACT,OAAOjD,MAAM,CAACkD,SAAS,CAAC;QACpBC,IAAI,EAAElD,QAAQ,CAACmD,SAAS;QACxBC,KAAK,EAAEA,CAAA,KAAMJ,CAAC,GAAGJ,SAAS,CAACG,MAAM;QACjCM,IAAI,EAAEA,CAAA,KAAK;UACP,MAAMlB,QAAQ,GAAGS,SAAS,CAACI,CAAC,EAAE,CAAE;UAChC,IAAI,WAAW,IAAIb,QAAQ,EAAE;YACzB,MAAME,QAAQ,GAAGP,gBAAgB,CAACwB,GAAG,CAACnB,QAAQ,CAACoB,SAAS,CAAE;YAC1D,IAAIpB,QAAQ,CAACqB,IAAI,KAAK,MAAM,EAAE1B,gBAAgB,CAAC2B,MAAM,CAACtB,QAAQ,CAACoB,SAAS,CAAC;YACzE,OAAOvC,aAAa,CAACqB,QAAQ,EAAEF,QAAQ,CAAC;UAC5C,CAAC,MAAM,OAAOD,SAAS,CAACC,QAAQ,CAAC;QACrC;OACH,CAAC;IACN,CAAC,CAAC,OAAOuB,MAAM,EAAE;MACb,OAAOxB,SAAS,CAAC;QACbsB,IAAI,EAAE,qBAAqB;QAC3BG,KAAK,EAAE,IAAIpD,cAAc,CAACA,cAAc,CAAC;UACrCqD,MAAM,EAAE,IAAIrD,cAAc,CAACsD,eAAe,CAAC;YACvCrB,OAAO,EAAE,wBAAwB;YACjCsB,KAAK,EAAEJ;WACV;SACJ;OACJ,CAAC;IACN;EACJ,CAAC,CAAC,CAACK,IAAI,CACHhE,MAAM,CAACiE,QAAQ,CAAEF,KAAK,IAAI;IACtB,MAAMH,KAAK,GAAG7D,KAAK,CAACmE,SAAS,CAACH,KAAK,CAAC;IACpC,MAAMI,QAAQ,GAAG/D,MAAM,CAACgE,SAAS,CAACR,KAAK,CAAC;IACxC,MAAMD,MAAM,GAAGQ,QAAQ,GACjB,IAAI3D,cAAc,CAACsD,eAAe,CAAC;MAC/BrB,OAAO,EAAEmB,KAAK,CAACS,OAAO,CAAC5B,OAAO;MAC9BsB,KAAK,EAAEH,KAAK,CAACS,OAAO,CAACN;KACxB,CAAC,GACF,IAAIvD,cAAc,CAACsD,eAAe,CAAC;MAC/BrB,OAAO,EAAE,0CAA0C;MACnDsB,KAAK,EAAEhE,KAAK,CAACuE,MAAM,CAACP,KAAK;KAC5B,CAAC;IAER9B,YAAY,GAAG,IAAIzB,cAAc,CAACA,cAAc,CAAC;MAAEqD,MAAM,EAAEF;IAAM,CAAE,CAAC;IACpE,OAAOxB,SAAS,CAAC;MAAEsB,IAAI,EAAE,qBAAqB;MAAEG,KAAK,EAAE3B;IAAY,CAAE,CAAC;EAC1E,CAAC,CAAC,EACFjC,MAAM,CAACuE,UAAU,CACpB;EAED,OAAO;IACHC,WAAW,EAAE,IAAI;IACjBC,qBAAqB,EAAE,KAAK;IAC5BC,IAAIA,CAACpC,QAAQ,EAAEqC,OAAO;MAClB,IAAI1C,YAAY,EAAE;QACd,OAAOjC,MAAM,CAAC4E,IAAI,CAAC3C,YAAY,CAAC;MACpC;MAEA,IAAI0C,OAAO,CAAClB,IAAI,KAAK,SAAS,EAAE;QAC5B1B,gBAAgB,CAAC8C,GAAG,CAACF,OAAO,CAACG,EAAE,EAAExC,QAAQ,CAAC;MAC9C;MAEA,MAAMyC,OAAO,GAAGlD,MAAM,CAACmD,MAAM,CAACL,OAAO,CAAC;MACtC,IAAII,OAAO,KAAK7C,SAAS,EAAE,OAAOlC,MAAM,CAAC4C,IAAI;MAC7C,OAAO5C,MAAM,CAAC4B,KAAK,CAACT,MAAM,CAACM,UAAU,CAACE,gBAAgB,CAAC,CAACoD,OAAO,CAAC,CAAC;IACrE;GACH;AACL,CAAC,CAAC,CACL;AAEL;;;;AAIA,OAAO,MAAME,kBAAkB,GAC3BpE,OAQe,IAKdX,KAAK,CAACgF,MAAM,CAAC3E,SAAS,CAACO,QAAQ,EAAEF,iBAAiB,CAACC,OAAO,CAAC,CAAC","ignoreList":[]}
|
|
@@ -5,12 +5,19 @@
|
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*/
|
|
7
7
|
import type * as Scope from "effect/Scope";
|
|
8
|
-
import * as RpcSerialization from "@effect/rpc/RpcSerialization";
|
|
9
|
-
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
10
8
|
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization";
|
|
11
|
+
import * as RpcServer from "effect/unstable/rpc/RpcServer";
|
|
12
|
+
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
11
13
|
/**
|
|
12
14
|
* @since 1.0.0
|
|
13
15
|
* @category Protocol
|
|
14
16
|
*/
|
|
15
|
-
export declare const makeProtocolFrida: () => Effect.Effect<
|
|
17
|
+
export declare const makeProtocolFrida: () => Effect.Effect<RpcServer.Protocol["Service"], never, FridaScript.FridaScript | RpcSerialization.RpcSerialization | Scope.Scope>;
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category Layer
|
|
21
|
+
*/
|
|
22
|
+
export declare const layerProtocolFrida: Layer.Layer<RpcServer.Protocol, never, FridaScript.FridaScript | RpcSerialization.RpcSerialization>;
|
|
16
23
|
//# sourceMappingURL=FridaRpcServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FridaRpcServer.d.ts","sourceRoot":"","sources":["../../src/node/FridaRpcServer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"FridaRpcServer.d.ts","sourceRoot":"","sources":["../../src/node/FridaRpcServer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAOtC,OAAO,KAAK,gBAAgB,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,WAAW,MAAM,mCAAmC,CAAC;AAIjE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAAM,CAAC,MAAM,CAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC7B,KAAK,EACL,WAAW,CAAC,WAAW,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAuGvE,CAAC;AAEP;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CACxC,SAAS,CAAC,QAAQ,EAClB,KAAK,EACL,WAAW,CAAC,WAAW,GAAG,gBAAgB,CAAC,gBAAgB,CACN,CAAC"}
|
|
@@ -4,102 +4,96 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*/
|
|
7
|
-
import * as RpcMessage from "@effect/rpc/RpcMessage";
|
|
8
|
-
import * as RpcSerialization from "@effect/rpc/RpcSerialization";
|
|
9
|
-
import * as RpcServer from "@effect/rpc/RpcServer";
|
|
10
|
-
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
11
|
-
import * as Console from "effect/Console";
|
|
12
7
|
import * as Effect from "effect/Effect";
|
|
13
8
|
import * as Function from "effect/Function";
|
|
14
|
-
import * as
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
15
10
|
import * as Option from "effect/Option";
|
|
16
11
|
import * as Predicate from "effect/Predicate";
|
|
17
|
-
import * as
|
|
12
|
+
import * as Queue from "effect/Queue";
|
|
18
13
|
import * as Stream from "effect/Stream";
|
|
19
14
|
import * as String from "effect/String";
|
|
20
|
-
import * as
|
|
21
|
-
import * as
|
|
22
|
-
import * as
|
|
15
|
+
import * as RpcMessage from "effect/unstable/rpc/RpcMessage";
|
|
16
|
+
import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization";
|
|
17
|
+
import * as RpcServer from "effect/unstable/rpc/RpcServer";
|
|
18
|
+
import * as FridaScript from "@efffrida/frida-tools/FridaScript";
|
|
19
|
+
import * as constants from "../shared/Constants.js";
|
|
23
20
|
/**
|
|
24
21
|
* @since 1.0.0
|
|
25
22
|
* @category Protocol
|
|
26
23
|
*/
|
|
27
24
|
export const makeProtocolFrida = () => Effect.gen(function* () {
|
|
28
|
-
const encoder = new TextEncoder();
|
|
29
|
-
const script = yield* FridaScript.FridaScript;
|
|
30
25
|
const serialization = yield* RpcSerialization.RpcSerialization;
|
|
26
|
+
const script = yield* FridaScript.FridaScript;
|
|
27
|
+
const disconnects = yield* Queue.unbounded();
|
|
28
|
+
const parser = serialization.makeUnsafe();
|
|
29
|
+
const encoder = new TextEncoder();
|
|
31
30
|
let clientId = 0;
|
|
32
31
|
const clientIds = new Set();
|
|
33
|
-
const
|
|
34
|
-
const
|
|
32
|
+
const clientIdsByExports = new Map();
|
|
33
|
+
const clients = new Map();
|
|
34
|
+
const stripPrefix = String.replace(constants.nodeRpcClientConnectionRequestMessagePrefix, "");
|
|
35
|
+
const newClientPredicate = Predicate.compose(Predicate.isString, String.startsWith(constants.nodeRpcClientConnectionRequestMessagePrefix));
|
|
36
|
+
const clientMessagePredicate = Predicate.compose(Predicate.isString, message => clientIdsByExports.has(message));
|
|
35
37
|
let writeRequest;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
const makeRawWriter = exportName => data => {
|
|
39
|
+
const transformed = typeof data === "string" ? encoder.encode(data) : data;
|
|
40
|
+
return script.callExport(exportName)(transformed).pipe(Effect.orDie);
|
|
41
|
+
};
|
|
42
|
+
const onClientConnect = message => {
|
|
43
|
+
const writeRaw = makeRawWriter(stripPrefix(message));
|
|
44
|
+
const write = response => {
|
|
45
|
+
try {
|
|
46
|
+
const encoded = parser.encode(response);
|
|
47
|
+
if (encoded === undefined) return Effect.void;
|
|
48
|
+
return writeRaw(encoded);
|
|
49
|
+
} catch (cause) {
|
|
50
|
+
const encoded = parser.encode(RpcMessage.ResponseDefectEncoded(cause));
|
|
51
|
+
return writeRaw(encoded);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const id = ++clientId;
|
|
55
|
+
clientIdsByExports.set(stripPrefix(message), id);
|
|
56
|
+
clients.set(id, {
|
|
57
|
+
write
|
|
58
|
+
});
|
|
48
59
|
clientIds.add(id);
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
yield* script.stream.pipe(Stream.filterMap(({
|
|
53
|
-
data: maybeData,
|
|
54
|
-
message
|
|
55
|
-
}) => {
|
|
56
|
-
if (predicates.isTaggedForAnyClient(message)) {
|
|
57
|
-
return Option.map(maybeData, data => Tuple.make(message.clientId, data));
|
|
58
|
-
} else {
|
|
59
|
-
return Option.none();
|
|
60
|
-
}
|
|
61
|
-
}), Stream.runForEach(([clientId, data]) => {
|
|
60
|
+
return Effect.void;
|
|
61
|
+
};
|
|
62
|
+
const onMessage = (exportName, data) => {
|
|
62
63
|
try {
|
|
64
|
+
const id = clientIdsByExports.get(exportName);
|
|
63
65
|
const decoded = parser.decode(data);
|
|
64
66
|
if (decoded.length === 0) return Effect.void;
|
|
65
67
|
let i = 0;
|
|
66
68
|
return Effect.whileLoop({
|
|
67
69
|
while: () => i < decoded.length,
|
|
70
|
+
step: Function.constVoid,
|
|
68
71
|
body() {
|
|
69
72
|
const message = decoded[i++];
|
|
70
|
-
return writeRequest(
|
|
71
|
-
}
|
|
72
|
-
step: Function.constVoid
|
|
73
|
+
return writeRequest(id, message);
|
|
74
|
+
}
|
|
73
75
|
});
|
|
74
76
|
} catch (cause) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const transformed = typeof encoded === "string" ? encoder.encode(encoded) : encoded;
|
|
78
|
-
script.script.post({
|
|
79
|
-
clientId
|
|
80
|
-
}, Buffer.from(transformed));
|
|
81
|
-
});
|
|
77
|
+
const writeRaw = makeRawWriter(exportName);
|
|
78
|
+
return writeRaw(parser.encode(RpcMessage.ResponseDefectEncoded(cause)));
|
|
82
79
|
}
|
|
83
|
-
}
|
|
80
|
+
};
|
|
81
|
+
yield* Stream.runForEach(script.stream, ({
|
|
82
|
+
message,
|
|
83
|
+
data
|
|
84
|
+
}) => {
|
|
85
|
+
if (newClientPredicate(message)) return onClientConnect(message);
|
|
86
|
+
if (clientMessagePredicate(message) && Option.isSome(data)) return onMessage(message, data.value);
|
|
87
|
+
return Effect.void;
|
|
88
|
+
}).pipe(Effect.forkScoped);
|
|
84
89
|
return yield* RpcServer.Protocol.make(_writeRequest => {
|
|
85
90
|
writeRequest = _writeRequest;
|
|
86
91
|
return Effect.succeed({
|
|
87
92
|
disconnects,
|
|
88
93
|
send: (clientId, response) => {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
clientId
|
|
93
|
-
}, Buffer.from(transformed));
|
|
94
|
-
return Effect.void;
|
|
95
|
-
};
|
|
96
|
-
try {
|
|
97
|
-
const encoded = parser.encode(response);
|
|
98
|
-
if (Predicate.isNotUndefined(encoded)) return writeRaw(encoded);else return Effect.void;
|
|
99
|
-
} catch (cause) {
|
|
100
|
-
const encoded = parser.encode(RpcMessage.ResponseDefectEncoded(cause));
|
|
101
|
-
return writeRaw(encoded);
|
|
102
|
-
}
|
|
94
|
+
const client = clients.get(clientId);
|
|
95
|
+
if (!client) return Effect.void;
|
|
96
|
+
return Effect.sync(() => client.write(response));
|
|
103
97
|
},
|
|
104
98
|
end(_clientId) {
|
|
105
99
|
return Effect.void;
|
|
@@ -112,4 +106,9 @@ export const makeProtocolFrida = () => Effect.gen(function* () {
|
|
|
112
106
|
});
|
|
113
107
|
});
|
|
114
108
|
});
|
|
109
|
+
/**
|
|
110
|
+
* @since 1.0.0
|
|
111
|
+
* @category Layer
|
|
112
|
+
*/
|
|
113
|
+
export const layerProtocolFrida = /*#__PURE__*/Layer.effect(RpcServer.Protocol, /*#__PURE__*/makeProtocolFrida());
|
|
115
114
|
//# sourceMappingURL=FridaRpcServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FridaRpcServer.js","names":["
|
|
1
|
+
{"version":3,"file":"FridaRpcServer.js","names":["Effect","Function","Layer","Option","Predicate","Queue","Stream","String","RpcMessage","RpcSerialization","RpcServer","FridaScript","constants","makeProtocolFrida","gen","serialization","script","disconnects","unbounded","parser","makeUnsafe","encoder","TextEncoder","clientId","clientIds","Set","clientIdsByExports","Map","clients","stripPrefix","replace","nodeRpcClientConnectionRequestMessagePrefix","newClientPredicate","compose","isString","startsWith","clientMessagePredicate","message","has","writeRequest","makeRawWriter","exportName","data","transformed","encode","callExport","pipe","orDie","onClientConnect","writeRaw","write","response","encoded","undefined","void","cause","ResponseDefectEncoded","id","set","add","onMessage","get","decoded","decode","length","i","whileLoop","while","step","constVoid","body","runForEach","stream","isSome","value","forkScoped","Protocol","make","_writeRequest","succeed","send","client","sync","end","_clientId","initialMessage","succeedNone","supportsAck","supportsTransferables","supportsSpanPropagation","layerProtocolFrida","effect"],"sources":["../../src/node/FridaRpcServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for working with RPC servers and clients.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
1
6
|
export declare const defaultServerMainExportName = "rpc";
|
|
2
7
|
export declare const generateServerExportNameForClient: (clientId: number) => string;
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const nodeRpcClientConnectionRequestMessagePrefix = "client id request message";
|
|
8
|
+
export declare const nodeRpcClientConnectionRequestMessagePrefix = "@efffrida/rpc/NodeRpcClientConnectionRequest/";
|
|
5
9
|
export declare const nodeRpcClientMakeConnectionRequestForServer: (exportName: string) => string;
|
|
6
|
-
//# sourceMappingURL=
|
|
10
|
+
//# sourceMappingURL=Constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../../src/shared/Constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AACjD,eAAO,MAAM,iCAAiC,GAAI,UAAU,MAAM,KAAG,MACN,CAAC;AAEhE,eAAO,MAAM,2CAA2C,kDAAkD,CAAC;AAC3G,eAAO,MAAM,2CAA2C,GAAI,YAAY,MAAM,WACb,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for working with RPC servers and clients.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
export const defaultServerMainExportName = "rpc";
|
|
7
|
+
export const generateServerExportNameForClient = clientId => `@efffrida/rpc/FridaServerRpcListenerForClient/${clientId}`;
|
|
8
|
+
export const nodeRpcClientConnectionRequestMessagePrefix = "@efffrida/rpc/NodeRpcClientConnectionRequest/";
|
|
9
|
+
export const nodeRpcClientMakeConnectionRequestForServer = exportName => `${nodeRpcClientConnectionRequestMessagePrefix}${exportName}`;
|
|
10
|
+
//# sourceMappingURL=Constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constants.js","names":["defaultServerMainExportName","generateServerExportNameForClient","clientId","nodeRpcClientConnectionRequestMessagePrefix","nodeRpcClientMakeConnectionRequestForServer","exportName"],"sources":["../../src/shared/Constants.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAMA,OAAO,MAAMA,2BAA2B,GAAG,KAAK;AAChD,OAAO,MAAMC,iCAAiC,GAAIC,QAAgB,IAC9D,iDAAiDA,QAAQ,EAAE;AAE/D,OAAO,MAAMC,2CAA2C,GAAG,+CAA+C;AAC1G,OAAO,MAAMC,2CAA2C,GAAIC,UAAkB,IAC1E,GAAGF,2CAA2C,GAAGE,UAAU,EAAE","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["Constants"],"sources":["../../src/shared/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;;;;;AAKA,OAAO,KAAKA,SAAS,MAAM,gBAAgB","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@efffrida/rpc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.29",
|
|
4
4
|
"description": "effect rpc-frida",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect-ts",
|
|
@@ -38,30 +38,22 @@
|
|
|
38
38
|
"provenance": true
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@efffrida/frida-tools": "^0.0.
|
|
42
|
-
"@efffrida/platform": "0.0.
|
|
43
|
-
"@efffrida/polyfills": "0.0.
|
|
41
|
+
"@efffrida/frida-tools": "^0.0.29",
|
|
42
|
+
"@efffrida/platform": "0.0.21",
|
|
43
|
+
"@efffrida/polyfills": "0.0.8"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@effect/
|
|
47
|
-
"@effect/
|
|
48
|
-
"@effect/platform": "0.96.1",
|
|
49
|
-
"@effect/platform-node": "0.106.0",
|
|
50
|
-
"@effect/rpc": "0.75.1",
|
|
51
|
-
"@effect/sql": "0.51.1",
|
|
52
|
-
"@effect/vitest": "0.29.0",
|
|
53
|
-
"@effect/workflow": "0.18.1",
|
|
46
|
+
"@effect/platform-node": "4.0.0-beta.69",
|
|
47
|
+
"@effect/vitest": "4.0.0-beta.69",
|
|
54
48
|
"@types/frida-gum": "19.1.0",
|
|
55
|
-
"@types/node": "25.
|
|
56
|
-
"effect": "
|
|
57
|
-
"frida": "17.9.
|
|
58
|
-
"
|
|
59
|
-
"
|
|
49
|
+
"@types/node": "25.9.0",
|
|
50
|
+
"effect": "4.0.0-beta.69",
|
|
51
|
+
"frida": "17.9.10",
|
|
52
|
+
"ioredis": "5.10.1",
|
|
53
|
+
"vitest": "4.1.6"
|
|
60
54
|
},
|
|
61
55
|
"peerDependencies": {
|
|
62
|
-
"
|
|
63
|
-
"@effect/rpc": "0.75.1",
|
|
64
|
-
"effect": "3.21.2"
|
|
56
|
+
"effect": "4.0.0-beta.69"
|
|
65
57
|
},
|
|
66
58
|
"tags": [
|
|
67
59
|
"frida.re",
|