@keplr-wallet/router 0.9.0 → 0.9.12-rc.3
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/build/index.d.ts +1 -3
- package/build/index.js +1 -3
- package/build/index.js.map +1 -1
- package/build/json-uint8-array/hex.d.ts +2 -0
- package/build/json-uint8-array/hex.js +31 -0
- package/build/json-uint8-array/hex.js.map +1 -0
- package/build/json-uint8-array/index.js +4 -3
- package/build/json-uint8-array/index.js.map +1 -1
- package/build/json-uint8-array/json.spec.js +5 -6
- package/build/json-uint8-array/json.spec.js.map +1 -1
- package/build/message.d.ts +5 -0
- package/build/message.js.map +1 -1
- package/build/router/index.d.ts +22 -3
- package/build/router/index.js +54 -12
- package/build/router/index.js.map +1 -1
- package/build/types.d.ts +2 -2
- package/package.json +2 -7
- package/src/index.ts +1 -3
- package/src/json-uint8-array/hex.ts +28 -0
- package/src/json-uint8-array/index.ts +7 -6
- package/src/json-uint8-array/json.spec.ts +0 -1
- package/src/message.ts +6 -0
- package/src/router/index.ts +64 -3
- package/src/types.ts +8 -2
- package/build/env/content-script.d.ts +0 -4
- package/build/env/content-script.js +0 -18
- package/build/env/content-script.js.map +0 -1
- package/build/env/extension.d.ts +0 -5
- package/build/env/extension.js +0 -127
- package/build/env/extension.js.map +0 -1
- package/build/env/extension.spec.d.ts +0 -1
- package/build/env/extension.spec.js +0 -33
- package/build/env/extension.spec.js.map +0 -1
- package/build/env/index.d.ts +0 -3
- package/build/env/index.js +0 -16
- package/build/env/index.js.map +0 -1
- package/build/env/mock.d.ts +0 -7
- package/build/env/mock.js +0 -23
- package/build/env/mock.js.map +0 -1
- package/build/guard/content-script.d.ts +0 -4
- package/build/guard/content-script.js +0 -14
- package/build/guard/content-script.js.map +0 -1
- package/build/guard/extension.d.ts +0 -5
- package/build/guard/extension.js +0 -27
- package/build/guard/extension.js.map +0 -1
- package/build/guard/index.d.ts +0 -3
- package/build/guard/index.js +0 -16
- package/build/guard/index.js.map +0 -1
- package/build/guard/mock.d.ts +0 -5
- package/build/guard/mock.js +0 -10
- package/build/guard/mock.js.map +0 -1
- package/build/mock/mock.spec.d.ts +0 -1
- package/build/mock/mock.spec.js +0 -118
- package/build/mock/mock.spec.js.map +0 -1
- package/build/requester/content-script.d.ts +0 -5
- package/build/requester/content-script.js +0 -51
- package/build/requester/content-script.js.map +0 -1
- package/build/requester/extension.d.ts +0 -6
- package/build/requester/extension.js +0 -59
- package/build/requester/extension.js.map +0 -1
- package/build/requester/index.d.ts +0 -3
- package/build/requester/index.js +0 -16
- package/build/requester/index.js.map +0 -1
- package/build/requester/mock.d.ts +0 -8
- package/build/requester/mock.js +0 -52
- package/build/requester/mock.js.map +0 -1
- package/build/router/extension.d.ts +0 -9
- package/build/router/extension.js +0 -77
- package/build/router/extension.js.map +0 -1
- package/build/router/mock.d.ts +0 -17
- package/build/router/mock.js +0 -59
- package/build/router/mock.js.map +0 -1
- package/build/router/types.d.ts +0 -22
- package/build/router/types.js +0 -57
- package/build/router/types.js.map +0 -1
- package/src/env/content-script.ts +0 -18
- package/src/env/extension.spec.ts +0 -77
- package/src/env/extension.ts +0 -151
- package/src/env/index.ts +0 -3
- package/src/env/mock.ts +0 -23
- package/src/guard/content-script.ts +0 -19
- package/src/guard/extension.ts +0 -36
- package/src/guard/index.ts +0 -3
- package/src/guard/mock.ts +0 -10
- package/src/mock/mock.spec.ts +0 -131
- package/src/requester/content-script.ts +0 -45
- package/src/requester/extension.ts +0 -66
- package/src/requester/index.ts +0 -3
- package/src/requester/mock.ts +0 -48
- package/src/router/extension.ts +0 -72
- package/src/router/mock.ts +0 -55
- package/src/router/types.ts +0 -64
package/build/requester/index.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
-
};
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
__exportStar(require("./extension"), exports);
|
|
14
|
-
__exportStar(require("./content-script"), exports);
|
|
15
|
-
__exportStar(require("./mock"), exports);
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/requester/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B;AAC5B,mDAAiC;AACjC,yCAAuB"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { MessageRequester } from "../types";
|
|
2
|
-
import { Message } from "../message";
|
|
3
|
-
export declare class MockMessageRequester implements MessageRequester {
|
|
4
|
-
protected readonly id: string;
|
|
5
|
-
protected readonly url: string;
|
|
6
|
-
constructor(id: string, url: string);
|
|
7
|
-
sendMessage<M extends Message<unknown>>(port: string, msg: M): Promise<M extends Message<infer R> ? R : never>;
|
|
8
|
-
}
|
package/build/requester/mock.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MockMessageRequester = void 0;
|
|
13
|
-
const json_uint8_array_1 = require("../json-uint8-array");
|
|
14
|
-
const router_1 = require("../router");
|
|
15
|
-
class MockMessageRequester {
|
|
16
|
-
constructor(id, url) {
|
|
17
|
-
this.id = id;
|
|
18
|
-
this.url = url;
|
|
19
|
-
}
|
|
20
|
-
sendMessage(port, msg) {
|
|
21
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
msg.validateBasic();
|
|
23
|
-
// Set message's origin.
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
25
|
-
// @ts-ignore
|
|
26
|
-
msg["origin"] = new URL(this.url).origin;
|
|
27
|
-
const result = json_uint8_array_1.JSONUint8Array.unwrap(yield new Promise((resolve) => {
|
|
28
|
-
router_1.MockRouter.eventEmitter.emit("message", {
|
|
29
|
-
message: {
|
|
30
|
-
port,
|
|
31
|
-
type: msg.type(),
|
|
32
|
-
msg: json_uint8_array_1.JSONUint8Array.wrap(msg),
|
|
33
|
-
},
|
|
34
|
-
sender: {
|
|
35
|
-
id: this.id,
|
|
36
|
-
url: this.url,
|
|
37
|
-
resolver: resolve,
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
}));
|
|
41
|
-
if (!result) {
|
|
42
|
-
throw new Error("Null result");
|
|
43
|
-
}
|
|
44
|
-
if (result.error) {
|
|
45
|
-
throw new Error(result.error);
|
|
46
|
-
}
|
|
47
|
-
return result.return;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
exports.MockMessageRequester = MockMessageRequester;
|
|
52
|
-
//# sourceMappingURL=mock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/requester/mock.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,0DAAqD;AACrD,sCAAuC;AAGvC,MAAa,oBAAoB;IAC/B,YAA+B,EAAU,EAAqB,GAAW;QAA1C,OAAE,GAAF,EAAE,CAAQ;QAAqB,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEvE,WAAW,CACf,IAAY,EACZ,GAAM;;YAEN,GAAG,CAAC,aAAa,EAAE,CAAC;YAEpB,wBAAwB;YACxB,6DAA6D;YAC7D,aAAa;YACb,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YAEzC,MAAM,MAAM,GAAW,iCAAc,CAAC,MAAM,CAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5B,mBAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE;oBACtC,OAAO,EAAE;wBACP,IAAI;wBACJ,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;wBAChB,GAAG,EAAE,iCAAc,CAAC,IAAI,CAAC,GAAG,CAAC;qBAC9B;oBACD,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,QAAQ,EAAE,OAAO;qBAClB;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;aAChC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC/B;YAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;KAAA;CACF;AAzCD,oDAyCC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Router } from "./types";
|
|
2
|
-
import { MessageSender } from "../types";
|
|
3
|
-
import { Result } from "../interfaces";
|
|
4
|
-
export declare class ExtensionRouter extends Router {
|
|
5
|
-
listen(port: string): void;
|
|
6
|
-
unlisten(): void;
|
|
7
|
-
protected onMessage: (message: any, sender: MessageSender) => Promise<Result> | undefined;
|
|
8
|
-
protected onMessageHandler(message: any, sender: MessageSender): Promise<Result>;
|
|
9
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ExtensionRouter = void 0;
|
|
13
|
-
const types_1 = require("./types");
|
|
14
|
-
class ExtensionRouter extends types_1.Router {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(...arguments);
|
|
17
|
-
// You shouldn't set this handler as async funtion,
|
|
18
|
-
// because mozila's extension polyfill deals with the message handler as resolved if it returns the `Promise`.
|
|
19
|
-
// So, if this handler is async function, it always return the `Promise` if it returns `undefined` and it is dealt with as resolved.
|
|
20
|
-
this.onMessage = (message, sender) => {
|
|
21
|
-
if (message.port !== this.port) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
return this.onMessageHandler(message, sender);
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
listen(port) {
|
|
28
|
-
if (!port) {
|
|
29
|
-
throw new Error("Empty port");
|
|
30
|
-
}
|
|
31
|
-
this.port = port;
|
|
32
|
-
browser.runtime.onMessage.addListener(this.onMessage);
|
|
33
|
-
// Although security considerations cross-extension communication are in place,
|
|
34
|
-
// we have put in additional security measures by disbling extension-to-extension communication until a formal security audit has taken place.
|
|
35
|
-
/*
|
|
36
|
-
if (browser.runtime.onMessageExternal) {
|
|
37
|
-
browser.runtime.onMessageExternal.addListener(this.onMessage);
|
|
38
|
-
}
|
|
39
|
-
*/
|
|
40
|
-
}
|
|
41
|
-
unlisten() {
|
|
42
|
-
this.port = "";
|
|
43
|
-
browser.runtime.onMessage.removeListener(this.onMessage);
|
|
44
|
-
// Although security considerations cross-extension communication are in place,
|
|
45
|
-
// we have put in additional security measures by disbling extension-to-extension communication until a formal security audit has taken place.
|
|
46
|
-
/*
|
|
47
|
-
if (browser.runtime.onMessageExternal) {
|
|
48
|
-
browser.runtime.onMessageExternal.removeListener(this.onMessage);
|
|
49
|
-
}
|
|
50
|
-
*/
|
|
51
|
-
}
|
|
52
|
-
onMessageHandler(message, sender) {
|
|
53
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
-
try {
|
|
55
|
-
const result = yield this.handleMessage(message, sender);
|
|
56
|
-
return {
|
|
57
|
-
return: result,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
console.log(`Failed to process msg ${message.type}: ${(e === null || e === void 0 ? void 0 : e.message) || (e === null || e === void 0 ? void 0 : e.toString())}`);
|
|
62
|
-
if (e) {
|
|
63
|
-
return Promise.resolve({
|
|
64
|
-
error: e.message || e.toString(),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return Promise.resolve({
|
|
69
|
-
error: "Unknown error, and error is null",
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
exports.ExtensionRouter = ExtensionRouter;
|
|
77
|
-
//# sourceMappingURL=extension.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../src/router/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAiC;AAIjC,MAAa,eAAgB,SAAQ,cAAM;IAA3C;;QA6BE,mDAAmD;QACnD,8GAA8G;QAC9G,oIAAoI;QAC1H,cAAS,GAAG,CACpB,OAAY,EACZ,MAAqB,EACQ,EAAE;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;gBAC9B,OAAO;aACR;YAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC,CAAC;IA0BJ,CAAC;IAlEC,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;SAC/B;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,+EAA+E;QAC/E,8IAA8I;QAC9I;;;;WAIG;IACL,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,+EAA+E;QAC/E,8IAA8I;QAC9I;;;;WAIG;IACL,CAAC;IAgBe,gBAAgB,CAC9B,OAAY,EACZ,MAAqB;;YAErB,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzD,OAAO;oBACL,MAAM,EAAE,MAAM;iBACf,CAAC;aACH;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CACT,yBAAyB,OAAO,CAAC,IAAI,KAAK,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,MAAI,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,QAAQ,GAAE,EAAE,CACxE,CAAC;gBACF,IAAI,CAAC,EAAE;oBACL,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE;qBACjC,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,KAAK,EAAE,kCAAkC;qBAC1C,CAAC,CAAC;iBACJ;aACF;QACH,CAAC;KAAA;CACF;AAnED,0CAmEC"}
|
package/build/router/mock.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="firefox-webext-browser" />
|
|
3
|
-
import { Router } from "./types";
|
|
4
|
-
import { MessageSender } from "../types";
|
|
5
|
-
import { Result } from "../interfaces";
|
|
6
|
-
import { EventEmitter } from "events";
|
|
7
|
-
export declare class MockRouter extends Router {
|
|
8
|
-
static eventEmitter: EventEmitter;
|
|
9
|
-
listen(port: string): void;
|
|
10
|
-
unlisten(): void;
|
|
11
|
-
protected onMessage: (params: {
|
|
12
|
-
message: any;
|
|
13
|
-
sender: Pick<browser.runtime.MessageSender, "id" | "url"> & {
|
|
14
|
-
resolver: (result: Result) => void;
|
|
15
|
-
};
|
|
16
|
-
}) => Promise<void>;
|
|
17
|
-
}
|
package/build/router/mock.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MockRouter = void 0;
|
|
13
|
-
const types_1 = require("./types");
|
|
14
|
-
const events_1 = require("events");
|
|
15
|
-
class MockRouter extends types_1.Router {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(...arguments);
|
|
18
|
-
this.onMessage = (params) => __awaiter(this, void 0, void 0, function* () {
|
|
19
|
-
const { message, sender } = params;
|
|
20
|
-
if (message.port !== this.port) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
const result = yield this.handleMessage(message, sender);
|
|
25
|
-
sender.resolver({
|
|
26
|
-
return: result,
|
|
27
|
-
});
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
catch (e) {
|
|
31
|
-
console.log(`Failed to process msg ${message.type}: ${(e === null || e === void 0 ? void 0 : e.message) || (e === null || e === void 0 ? void 0 : e.toString())}`);
|
|
32
|
-
if (e) {
|
|
33
|
-
sender.resolver({
|
|
34
|
-
error: e.message || e.toString(),
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
sender.resolver({
|
|
39
|
-
error: "Unknown error, and error is null",
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
listen(port) {
|
|
46
|
-
if (!port) {
|
|
47
|
-
throw new Error("Empty port");
|
|
48
|
-
}
|
|
49
|
-
this.port = port;
|
|
50
|
-
MockRouter.eventEmitter.addListener("message", this.onMessage);
|
|
51
|
-
}
|
|
52
|
-
unlisten() {
|
|
53
|
-
this.port = "";
|
|
54
|
-
MockRouter.eventEmitter.removeListener("message", this.onMessage);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
exports.MockRouter = MockRouter;
|
|
58
|
-
MockRouter.eventEmitter = new events_1.EventEmitter();
|
|
59
|
-
//# sourceMappingURL=mock.js.map
|
package/build/router/mock.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/router/mock.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAiC;AAGjC,mCAAsC;AAEtC,MAAa,UAAW,SAAQ,cAAM;IAAtC;;QAiBY,cAAS,GAAG,CAAO,MAK5B,EAAiB,EAAE;YAClB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YACnC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;gBAC9B,OAAO;aACR;YAED,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM,CAAC,QAAQ,CAAC;oBACd,MAAM,EAAE,MAAM;iBACf,CAAC,CAAC;gBACH,OAAO;aACR;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CACT,yBAAyB,OAAO,CAAC,IAAI,KAAK,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,MAAI,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,QAAQ,GAAE,EAAE,CACxE,CAAC;gBACF,IAAI,CAAC,EAAE;oBACL,MAAM,CAAC,QAAQ,CAAC;wBACd,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE;qBACjC,CAAC,CAAC;iBACJ;qBAAM;oBACL,MAAM,CAAC,QAAQ,CAAC;wBACd,KAAK,EAAE,kCAAkC;qBAC1C,CAAC,CAAC;iBACJ;aACF;QACH,CAAC,CAAA,CAAC;IACJ,CAAC;IA9CC,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;SAC/B;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;;AAfH,gCAiDC;AAhDe,uBAAY,GAAG,IAAI,qBAAY,EAAE,CAAC"}
|
package/build/router/types.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Message } from "../message";
|
|
2
|
-
import { Handler } from "../handler";
|
|
3
|
-
import { EnvProducer, Guard, MessageSender } from "../types";
|
|
4
|
-
import { MessageRegistry } from "../encoding";
|
|
5
|
-
export declare abstract class Router {
|
|
6
|
-
protected readonly envProducer: EnvProducer;
|
|
7
|
-
protected msgRegistry: MessageRegistry;
|
|
8
|
-
protected registeredHandler: Map<string, Handler>;
|
|
9
|
-
protected guards: Guard[];
|
|
10
|
-
protected port: string;
|
|
11
|
-
constructor(envProducer: EnvProducer);
|
|
12
|
-
registerMessage(msgCls: {
|
|
13
|
-
new (...args: any): Message<unknown>;
|
|
14
|
-
} & {
|
|
15
|
-
type(): string;
|
|
16
|
-
}): void;
|
|
17
|
-
addHandler(route: string, handler: Handler): void;
|
|
18
|
-
addGuard(guard: Guard): void;
|
|
19
|
-
abstract listen(port: string): void;
|
|
20
|
-
abstract unlisten(): void;
|
|
21
|
-
protected handleMessage(message: any, sender: MessageSender): Promise<unknown>;
|
|
22
|
-
}
|
package/build/router/types.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Router = void 0;
|
|
13
|
-
const encoding_1 = require("../encoding");
|
|
14
|
-
const json_uint8_array_1 = require("../json-uint8-array");
|
|
15
|
-
class Router {
|
|
16
|
-
constructor(envProducer) {
|
|
17
|
-
this.envProducer = envProducer;
|
|
18
|
-
this.msgRegistry = new encoding_1.MessageRegistry();
|
|
19
|
-
this.registeredHandler = new Map();
|
|
20
|
-
this.guards = [];
|
|
21
|
-
this.port = "";
|
|
22
|
-
}
|
|
23
|
-
registerMessage(msgCls) {
|
|
24
|
-
this.msgRegistry.registerMessage(msgCls);
|
|
25
|
-
}
|
|
26
|
-
addHandler(route, handler) {
|
|
27
|
-
if (this.registeredHandler.has(route)) {
|
|
28
|
-
throw new Error(`Already registered type ${route}`);
|
|
29
|
-
}
|
|
30
|
-
this.registeredHandler.set(route, handler);
|
|
31
|
-
}
|
|
32
|
-
addGuard(guard) {
|
|
33
|
-
this.guards.push(guard);
|
|
34
|
-
}
|
|
35
|
-
handleMessage(message, sender) {
|
|
36
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
const msg = this.msgRegistry.parseMessage(json_uint8_array_1.JSONUint8Array.unwrap(message));
|
|
38
|
-
const env = this.envProducer(sender);
|
|
39
|
-
for (const guard of this.guards) {
|
|
40
|
-
yield guard(env, msg, sender);
|
|
41
|
-
}
|
|
42
|
-
// Can happen throw
|
|
43
|
-
msg.validateBasic();
|
|
44
|
-
const route = msg.route();
|
|
45
|
-
if (!route) {
|
|
46
|
-
throw new Error("Null router");
|
|
47
|
-
}
|
|
48
|
-
const handler = this.registeredHandler.get(route);
|
|
49
|
-
if (!handler) {
|
|
50
|
-
throw new Error("Can't get handler");
|
|
51
|
-
}
|
|
52
|
-
return json_uint8_array_1.JSONUint8Array.wrap(yield handler(env, msg));
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.Router = Router;
|
|
57
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,0CAA8C;AAC9C,0DAAqD;AAErD,MAAsB,MAAM;IAQ1B,YAA+B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAP7C,gBAAW,GAAoB,IAAI,0BAAe,EAAE,CAAC;QACrD,sBAAiB,GAAyB,IAAI,GAAG,EAAE,CAAC;QAEpD,WAAM,GAAY,EAAE,CAAC;QAErB,SAAI,GAAG,EAAE,CAAC;IAEsC,CAAC;IAEpD,eAAe,CACpB,MAAqE;QAErE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEM,UAAU,CAAC,KAAa,EAAE,OAAgB;QAC/C,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;SACrD;QAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,QAAQ,CAAC,KAAY;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAMe,aAAa,CAC3B,OAAY,EACZ,MAAqB;;YAErB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,iCAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAErC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;gBAC/B,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;aAC/B;YAED,mBAAmB;YACnB,GAAG,CAAC,aAAa,EAAE,CAAC;YAEpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;aAChC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;aACtC;YAED,OAAO,iCAAc,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;KAAA;CACF;AAzDD,wBAyDC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Env, MessageSender } from "../types";
|
|
2
|
-
|
|
3
|
-
// ContentScriptEnv only checks the id is same as the extension id.
|
|
4
|
-
// And, doesn't support the request interaction.
|
|
5
|
-
export class ContentScriptEnv {
|
|
6
|
-
static readonly produceEnv = (sender: MessageSender): Env => {
|
|
7
|
-
const isInternalMsg = sender.id === browser.runtime.id;
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
isInternalMsg,
|
|
11
|
-
requestInteraction: () => {
|
|
12
|
-
throw new Error(
|
|
13
|
-
"ContentScriptEnv doesn't support `requestInteraction`"
|
|
14
|
-
);
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import assert from "assert";
|
|
2
|
-
|
|
3
|
-
import { ExtensionEnv } from "./extension";
|
|
4
|
-
import { MessageSender } from "../types";
|
|
5
|
-
|
|
6
|
-
describe("Test extension env producer", () => {
|
|
7
|
-
const extensionId = "id";
|
|
8
|
-
const extensionUrl = "https://wallet.keplr.app";
|
|
9
|
-
const validSender: MessageSender = {
|
|
10
|
-
id: extensionId,
|
|
11
|
-
url: extensionUrl,
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
it("should return true if the sender is internal else return false", () => {
|
|
15
|
-
assert.strictEqual(
|
|
16
|
-
ExtensionEnv.checkIsInternalMessage(
|
|
17
|
-
validSender,
|
|
18
|
-
extensionId,
|
|
19
|
-
extensionUrl
|
|
20
|
-
),
|
|
21
|
-
true
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
assert.strictEqual(
|
|
25
|
-
ExtensionEnv.checkIsInternalMessage(
|
|
26
|
-
{
|
|
27
|
-
...validSender,
|
|
28
|
-
url: "https://other.com",
|
|
29
|
-
},
|
|
30
|
-
extensionId,
|
|
31
|
-
extensionUrl
|
|
32
|
-
),
|
|
33
|
-
false
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
assert.strictEqual(
|
|
37
|
-
ExtensionEnv.checkIsInternalMessage(
|
|
38
|
-
{
|
|
39
|
-
...validSender,
|
|
40
|
-
id: "other_id",
|
|
41
|
-
},
|
|
42
|
-
extensionId,
|
|
43
|
-
extensionUrl
|
|
44
|
-
),
|
|
45
|
-
false
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
assert.strictEqual(
|
|
49
|
-
ExtensionEnv.checkIsInternalMessage(
|
|
50
|
-
{
|
|
51
|
-
id: "other_id",
|
|
52
|
-
url: "https://other.com",
|
|
53
|
-
},
|
|
54
|
-
extensionId,
|
|
55
|
-
extensionUrl
|
|
56
|
-
),
|
|
57
|
-
false
|
|
58
|
-
);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("should throw an error if the sender is invalid", () => {
|
|
62
|
-
assert.throws(() => {
|
|
63
|
-
ExtensionEnv.checkIsInternalMessage({}, "id", "https://wallet.keplr.app");
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
assert.throws(() => {
|
|
67
|
-
ExtensionEnv.checkIsInternalMessage(
|
|
68
|
-
{
|
|
69
|
-
...validSender,
|
|
70
|
-
url: "invalid://test.com",
|
|
71
|
-
},
|
|
72
|
-
"id",
|
|
73
|
-
"https://wallet.keplr.app"
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
});
|
package/src/env/extension.ts
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { Env, FnRequestInteraction, MessageSender } from "../types";
|
|
2
|
-
import { openPopupWindow as openPopupWindowInner } from "@keplr-wallet/popup";
|
|
3
|
-
import { APP_PORT } from "../constant";
|
|
4
|
-
import { InExtensionMessageRequester } from "../requester";
|
|
5
|
-
import PQueue from "p-queue";
|
|
6
|
-
|
|
7
|
-
const openPopupQueue = new PQueue({
|
|
8
|
-
concurrency: 1,
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
// To handle the opening popup more easily,
|
|
12
|
-
// just open the popup one by one.
|
|
13
|
-
async function openPopupWindow(
|
|
14
|
-
url: string,
|
|
15
|
-
channel: string = "default"
|
|
16
|
-
): Promise<number> {
|
|
17
|
-
return await openPopupQueue.add(() => openPopupWindowInner(url, channel));
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class ExtensionEnv {
|
|
21
|
-
static readonly produceEnv = (sender: MessageSender): Env => {
|
|
22
|
-
const isInternalMsg = ExtensionEnv.checkIsInternalMessage(
|
|
23
|
-
sender,
|
|
24
|
-
browser.runtime.id,
|
|
25
|
-
browser.runtime.getURL("/")
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
// Add additional query string for letting the extension know it is for interaction.
|
|
29
|
-
const queryString = `interaction=true&interactionInternal=${isInternalMsg}`;
|
|
30
|
-
|
|
31
|
-
const openAndSendMsg: FnRequestInteraction = async (url, msg, options) => {
|
|
32
|
-
if (url.startsWith("/")) {
|
|
33
|
-
url = url.slice(1);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
url = browser.runtime.getURL("/popup.html#/" + url);
|
|
37
|
-
|
|
38
|
-
if (url.includes("?")) {
|
|
39
|
-
url += "&" + queryString;
|
|
40
|
-
} else {
|
|
41
|
-
url += "?" + queryString;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const windowId = await openPopupWindow(url, options?.channel);
|
|
45
|
-
const window = await browser.windows.get(windowId, {
|
|
46
|
-
populate: true,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
50
|
-
const tabId = window.tabs![0].id!;
|
|
51
|
-
|
|
52
|
-
// Wait until that tab is loaded
|
|
53
|
-
await (async () => {
|
|
54
|
-
const tab = await browser.tabs.get(tabId);
|
|
55
|
-
if (tab.status === "complete") {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return new Promise<void>((resolve) => {
|
|
60
|
-
browser.tabs.onUpdated.addListener((_tabId, changeInfo) => {
|
|
61
|
-
if (tabId === _tabId && changeInfo.status === "complete") {
|
|
62
|
-
resolve();
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
})();
|
|
67
|
-
|
|
68
|
-
return await InExtensionMessageRequester.sendMessageToTab(
|
|
69
|
-
tabId,
|
|
70
|
-
APP_PORT,
|
|
71
|
-
msg
|
|
72
|
-
);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
if (!isInternalMsg) {
|
|
76
|
-
// If msg is from external (probably from webpage), it opens the popup for extension and send the msg back to the tab opened.
|
|
77
|
-
return {
|
|
78
|
-
isInternalMsg,
|
|
79
|
-
requestInteraction: openAndSendMsg,
|
|
80
|
-
};
|
|
81
|
-
} else {
|
|
82
|
-
// If msg is from the extension itself, it can send the msg back to the extension itself.
|
|
83
|
-
// In this case, this expects that there is only one extension popup have been opened.
|
|
84
|
-
const requestInteraction: FnRequestInteraction = async (
|
|
85
|
-
url,
|
|
86
|
-
msg,
|
|
87
|
-
options
|
|
88
|
-
) => {
|
|
89
|
-
if (options?.forceOpenWindow) {
|
|
90
|
-
return await openAndSendMsg(url, msg, options);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (url.startsWith("/")) {
|
|
94
|
-
url = url.slice(1);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
url = browser.runtime.getURL("/popup.html#/" + url);
|
|
98
|
-
|
|
99
|
-
if (url.includes("?")) {
|
|
100
|
-
url += "&" + queryString;
|
|
101
|
-
} else {
|
|
102
|
-
url += "?" + queryString;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const backgroundPage = await browser.runtime.getBackgroundPage();
|
|
106
|
-
const windows = browser.extension.getViews().filter((window) => {
|
|
107
|
-
return window.location.href !== backgroundPage.location.href;
|
|
108
|
-
});
|
|
109
|
-
const prefer = windows.find((window) => {
|
|
110
|
-
return window.location.href === sender.url;
|
|
111
|
-
});
|
|
112
|
-
(prefer ?? windows[0]).location.href = url;
|
|
113
|
-
|
|
114
|
-
return await new InExtensionMessageRequester().sendMessage(
|
|
115
|
-
APP_PORT,
|
|
116
|
-
msg
|
|
117
|
-
);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
isInternalMsg,
|
|
122
|
-
requestInteraction,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
public static readonly checkIsInternalMessage = (
|
|
128
|
-
sender: MessageSender,
|
|
129
|
-
extensionId: string,
|
|
130
|
-
extensionUrl: string
|
|
131
|
-
): boolean => {
|
|
132
|
-
if (!sender.url) {
|
|
133
|
-
throw new Error("Empty sender url");
|
|
134
|
-
}
|
|
135
|
-
const url = new URL(sender.url);
|
|
136
|
-
if (!url.origin || url.origin === "null") {
|
|
137
|
-
throw new Error("Invalid sender url");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const browserURL = new URL(extensionUrl);
|
|
141
|
-
if (!browserURL.origin || browserURL.origin === "null") {
|
|
142
|
-
throw new Error("Invalid browser url");
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (url.origin !== browserURL.origin) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return sender.id === extensionId;
|
|
150
|
-
};
|
|
151
|
-
}
|
package/src/env/index.ts
DELETED
package/src/env/mock.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Env, MessageSender } from "../types";
|
|
2
|
-
import { ExtensionEnv } from "./extension";
|
|
3
|
-
|
|
4
|
-
export class MockEnv {
|
|
5
|
-
constructor(protected readonly id: string, protected readonly url: string) {}
|
|
6
|
-
|
|
7
|
-
envProducer(): (sender: MessageSender) => Env {
|
|
8
|
-
return (sender: MessageSender): Env => {
|
|
9
|
-
const isInternalMsg = ExtensionEnv.checkIsInternalMessage(
|
|
10
|
-
sender,
|
|
11
|
-
this.id,
|
|
12
|
-
this.url
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
return {
|
|
16
|
-
isInternalMsg,
|
|
17
|
-
requestInteraction: () => {
|
|
18
|
-
throw new Error("TODO: Implement me");
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Env, Guard, MessageSender } from "../types";
|
|
2
|
-
import { Message } from "../message";
|
|
3
|
-
|
|
4
|
-
export class ContentScriptGuards {
|
|
5
|
-
// Router in content script will reject all messages that can be sent from the external.
|
|
6
|
-
static readonly checkMessageIsInternal: Guard = (
|
|
7
|
-
env: Omit<Env, "requestInteraction">,
|
|
8
|
-
msg: Message<unknown>,
|
|
9
|
-
sender: MessageSender
|
|
10
|
-
): Promise<void> => {
|
|
11
|
-
if (!env.isInternalMsg || msg.approveExternal(env, sender)) {
|
|
12
|
-
throw new Error(
|
|
13
|
-
"Content script can't handle the message that is able to be sent from external"
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return Promise.resolve();
|
|
18
|
-
};
|
|
19
|
-
}
|