@thalesrc/hermes 6.0.1 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +417 -57
- package/broadcast/default-channel-name.cjs +4 -0
- package/broadcast/default-channel-name.js +2 -0
- package/broadcast/default-channel-name.js.map +1 -0
- package/broadcast/index.cjs +13 -0
- package/broadcast/index.js +2 -0
- package/broadcast/index.js.map +1 -0
- package/broadcast/message-client.cjs +26 -0
- package/broadcast/message-client.js +2 -0
- package/broadcast/message-client.js.map +1 -0
- package/broadcast/message-host.cjs +27 -0
- package/broadcast/message-host.js +2 -0
- package/broadcast/message-host.js.map +1 -0
- package/broadcast/message-service.cjs +13 -0
- package/broadcast/message-service.d.ts +1 -1
- package/broadcast/message-service.js +4 -2
- package/broadcast/message-service.js.map +1 -0
- package/chrome/default-connection-name.cjs +4 -0
- package/chrome/default-connection-name.js +2 -0
- package/chrome/default-connection-name.js.map +1 -0
- package/chrome/index.cjs +11 -0
- package/chrome/index.js +2 -0
- package/chrome/index.js.map +1 -0
- package/chrome/message-client.cjs +41 -0
- package/chrome/message-client.js +2 -0
- package/chrome/message-client.js.map +1 -0
- package/chrome/message-host.cjs +42 -0
- package/chrome/message-host.d.ts +3 -7
- package/chrome/message-host.js +11 -11
- package/chrome/message-host.js.map +1 -0
- package/iframe/channel-path-splitter.cjs +4 -0
- package/iframe/channel-path-splitter.js +2 -0
- package/iframe/channel-path-splitter.js.map +1 -0
- package/iframe/default-channel-name.cjs +4 -0
- package/iframe/default-channel-name.js +2 -0
- package/iframe/default-channel-name.js.map +1 -0
- package/iframe/iframe.type.cjs +2 -0
- package/iframe/iframe.type.js +2 -0
- package/iframe/iframe.type.js.map +1 -0
- package/iframe/index.cjs +13 -0
- package/iframe/index.js +2 -0
- package/iframe/index.js.map +1 -0
- package/iframe/message-client.cjs +50 -0
- package/iframe/message-client.d.ts +1 -5
- package/iframe/message-client.js +10 -10
- package/iframe/message-client.js.map +1 -0
- package/iframe/message-host.cjs +62 -0
- package/iframe/message-host.d.ts +3 -13
- package/iframe/message-host.js +20 -23
- package/iframe/message-host.js.map +1 -0
- package/iframe/message-service.cjs +13 -0
- package/iframe/message-service.d.ts +1 -1
- package/iframe/message-service.js +4 -2
- package/iframe/message-service.js.map +1 -0
- package/iframe/source-id-splitter.cjs +4 -0
- package/iframe/source-id-splitter.js +2 -0
- package/iframe/source-id-splitter.js.map +1 -0
- package/iframe/upcoming-message.cjs +2 -0
- package/iframe/upcoming-message.js +2 -0
- package/iframe/upcoming-message.js.map +1 -0
- package/index.cjs +13 -0
- package/index.d.ts +1 -0
- package/index.js +3 -0
- package/index.js.map +1 -0
- package/listen.decorator.cjs +20 -0
- package/listen.decorator.js +4 -2
- package/listen.decorator.js.map +1 -0
- package/listener-storage.type.cjs +2 -0
- package/listener-storage.type.js +2 -0
- package/listener-storage.type.js.map +1 -0
- package/message-client.cjs +10 -0
- package/message-client.js +2 -0
- package/message-client.js.map +1 -0
- package/message-host.cjs +53 -0
- package/message-host.d.ts +3 -10
- package/message-host.js +4 -6
- package/message-host.js.map +1 -0
- package/message-response.type.cjs +2 -0
- package/message-response.type.d.ts +6 -2
- package/message-response.type.js +2 -0
- package/message-response.type.js.map +1 -0
- package/message.interface.cjs +2 -0
- package/message.interface.js +2 -0
- package/message.interface.js.map +1 -0
- package/package.json +32 -34
- package/request.decorator.cjs +20 -0
- package/request.decorator.js +9 -2
- package/request.decorator.js.map +1 -0
- package/selectors.cjs +8 -0
- package/selectors.js +2 -0
- package/selectors.js.map +1 -0
- package/worker/index.cjs +9 -0
- package/worker/index.js +2 -0
- package/worker/index.js.map +1 -0
- package/worker/message-client.cjs +40 -0
- package/worker/message-client.d.ts +1 -1
- package/worker/message-client.js +2 -0
- package/worker/message-client.js.map +1 -0
- package/worker/message-host.cjs +43 -0
- package/worker/message-host.js +2 -0
- package/worker/message-host.js.map +1 -0
- package/worker/message-service.cjs +12 -0
- package/worker/message-service.d.ts +1 -1
- package/worker/message-service.js +4 -2
- package/worker/message-service.js.map +1 -0
- package/.editorconfig +0 -9
- package/CODE_OF_CONDUCT.md +0 -76
- package/codecov.yml +0 -8
- package/jest.config.js +0 -22
- package/mixin.d.ts +0 -12
- package/mixin.js +0 -18
- package/setup-test.ts +0 -0
- package/tsconfig.lib.json +0 -7
- package/tsconfig.spec.json +0 -11
- package/tslint.json +0 -14
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BroadcastMessageClient } from "./message-client";
|
|
2
|
-
declare const BroadcastMessageService_base: new (args_0: [channelName?: string], args_1: [channelName?: string]) => {
|
|
2
|
+
declare const BroadcastMessageService_base: new (args_0: [channelName?: string | undefined], args_1: [channelName?: string | undefined]) => {
|
|
3
3
|
terminate: () => void;
|
|
4
4
|
} & BroadcastMessageClient;
|
|
5
5
|
export declare class BroadcastMessageService extends BroadcastMessageService_base {
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mixin } from "@thalesrc/js-utils/class/mixin";
|
|
2
2
|
import { DEFAULT_CHANNEL_NAME } from "./default-channel-name";
|
|
3
3
|
import { BroadcastMessageClient } from "./message-client";
|
|
4
4
|
import { BroadcastMessageHost } from "./message-host";
|
|
5
|
-
export class BroadcastMessageService extends
|
|
5
|
+
export class BroadcastMessageService extends mixin(BroadcastMessageHost, BroadcastMessageClient) {
|
|
6
6
|
constructor(channelName = DEFAULT_CHANNEL_NAME) {
|
|
7
7
|
super([channelName], [channelName]);
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=message-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/broadcast/message-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,OAAO,uBAAwB,SAAQ,KAAK,CAAC,oBAAoB,EAAE,sBAAsB,CAAC;IAC9F,YAAY,WAAW,GAAG,oBAAoB;QAC5C,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,CAAC;CACF","file":"message-service.js","sourcesContent":["import { mixin } from \"@thalesrc/js-utils/class/mixin\";\nimport { DEFAULT_CHANNEL_NAME } from \"./default-channel-name\";\nimport { BroadcastMessageClient } from \"./message-client\";\nimport { BroadcastMessageHost } from \"./message-host\";\n\nexport class BroadcastMessageService extends mixin(BroadcastMessageHost, BroadcastMessageClient) {\n constructor(channelName = DEFAULT_CHANNEL_NAME) {\n super([channelName], [channelName]);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/chrome/default-connection-name.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC","file":"default-connection-name.js","sourcesContent":["export const DEFAULT_CONNECTION_NAME = 'hermes';\n"]}
|
package/chrome/index.cjs
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChromeMessageHost = exports.ChromeMessageClient = exports.Listen = exports.Request = void 0;
|
|
4
|
+
var request_decorator_1 = require("../request.decorator");
|
|
5
|
+
Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return request_decorator_1.Request; } });
|
|
6
|
+
var listen_decorator_1 = require("../listen.decorator");
|
|
7
|
+
Object.defineProperty(exports, "Listen", { enumerable: true, get: function () { return listen_decorator_1.Listen; } });
|
|
8
|
+
var message_client_1 = require("./message-client");
|
|
9
|
+
Object.defineProperty(exports, "ChromeMessageClient", { enumerable: true, get: function () { return message_client_1.ChromeMessageClient; } });
|
|
10
|
+
var message_host_1 = require("./message-host");
|
|
11
|
+
Object.defineProperty(exports, "ChromeMessageHost", { enumerable: true, get: function () { return message_host_1.ChromeMessageHost; } });
|
package/chrome/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/chrome/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC","file":"index.js","sourcesContent":["export { Request } from '../request.decorator';\nexport { Listen } from '../listen.decorator';\nexport { ChromeMessageClient } from './message-client';\nexport { ChromeMessageHost } from './message-host';\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChromeMessageClient = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const operators_1 = require("rxjs/operators");
|
|
6
|
+
const message_client_1 = require("../message-client");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
8
|
+
const default_connection_name_1 = require("./default-connection-name");
|
|
9
|
+
const RANDOM_ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
10
|
+
const RANDOM_ID_CHARS_LENGTH = RANDOM_ID_CHARS.length;
|
|
11
|
+
const PORT = Symbol('Port');
|
|
12
|
+
class ChromeMessageClient extends message_client_1.MessageClient {
|
|
13
|
+
static connections = {};
|
|
14
|
+
[selectors_1.RESPONSES$];
|
|
15
|
+
[PORT];
|
|
16
|
+
constructor(name = default_connection_name_1.DEFAULT_CONNECTION_NAME) {
|
|
17
|
+
super();
|
|
18
|
+
if (!(name in ChromeMessageClient.connections)) {
|
|
19
|
+
const port = chrome.runtime.connect({ name });
|
|
20
|
+
const responses = new rxjs_1.Observable(subscriber => {
|
|
21
|
+
port.onMessage.addListener((message) => {
|
|
22
|
+
subscriber.next(message);
|
|
23
|
+
});
|
|
24
|
+
}).pipe((0, operators_1.share)());
|
|
25
|
+
ChromeMessageClient.connections[name] = { port, responses };
|
|
26
|
+
}
|
|
27
|
+
this[PORT] = ChromeMessageClient.connections[name].port;
|
|
28
|
+
this[selectors_1.RESPONSES$] = ChromeMessageClient.connections[name].responses;
|
|
29
|
+
}
|
|
30
|
+
[selectors_1.SEND](message) {
|
|
31
|
+
this[PORT].postMessage(message);
|
|
32
|
+
}
|
|
33
|
+
[selectors_1.GET_NEW_ID]() {
|
|
34
|
+
let result = '' + Date.now();
|
|
35
|
+
for (var i = 0; i < 10; i++) {
|
|
36
|
+
result += RANDOM_ID_CHARS.charAt(Math.floor(Math.random() * RANDOM_ID_CHARS_LENGTH));
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.ChromeMessageClient = ChromeMessageClient;
|
package/chrome/message-client.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/chrome/message-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,eAAe,GAAG,gEAAgE,CAAC;AACzF,MAAM,sBAAsB,GAAG,eAAe,CAAC,MAAM,CAAC;AACtD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAO5B,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC5C,MAAM,CAAU,WAAW,GAAkC,EAAE,CAAC;IAEjE,CAAC,UAAU,CAAC,CAA8B;IACzC,CAAC,IAAI,CAAC,CAAsB;IAEpC,YAAY,IAAI,GAAG,uBAAuB;QACxC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,CAAC,IAAI,IAAI,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,UAAU,CAAkB,UAAU,CAAC,EAAE;gBAC7D,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAwB,EAAE,EAAE;oBACtD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAEjB,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,GAAG,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC;IAEM,CAAC,IAAI,CAAC,CAAI,OAAmB;QAClC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAES,CAAC,UAAU,CAAC;QACpB,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC","file":"message-client.js","sourcesContent":["import { Observable } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nimport { MessageClient } from '../message-client';\nimport { MessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';\nimport { DEFAULT_CONNECTION_NAME } from './default-connection-name';\n\nconst RANDOM_ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\nconst RANDOM_ID_CHARS_LENGTH = RANDOM_ID_CHARS.length;\nconst PORT = Symbol('Port');\n\ninterface Connection {\n port: chrome.runtime.Port;\n responses: Observable<MessageResponse>;\n}\n\nexport class ChromeMessageClient extends MessageClient {\n private static readonly connections: { [key: string]: Connection } = {};\n\n public [RESPONSES$]: Observable<MessageResponse>;\n private [PORT]: chrome.runtime.Port;\n\n constructor(name = DEFAULT_CONNECTION_NAME) {\n super();\n\n if (!(name in ChromeMessageClient.connections)) {\n const port = chrome.runtime.connect({ name });\n const responses = new Observable<MessageResponse>(subscriber => {\n port.onMessage.addListener((message: MessageResponse) => {\n subscriber.next(message);\n });\n }).pipe(share());\n\n ChromeMessageClient.connections[name] = { port, responses };\n }\n\n this[PORT] = ChromeMessageClient.connections[name].port;\n this[RESPONSES$] = ChromeMessageClient.connections[name].responses;\n }\n\n public [SEND]<T>(message: Message<T>) {\n this[PORT].postMessage(message);\n }\n\n protected [GET_NEW_ID](): string {\n let result = '' + Date.now();\n\n for (var i = 0; i < 10; i++) {\n result += RANDOM_ID_CHARS.charAt(Math.floor(Math.random() * RANDOM_ID_CHARS_LENGTH));\n }\n\n return result;\n }\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChromeMessageHost = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const message_host_1 = require("../message-host");
|
|
6
|
+
const default_connection_name_1 = require("./default-connection-name");
|
|
7
|
+
class ChromeMessageHost extends message_host_1.MessageHost {
|
|
8
|
+
static PORT_IDENTIFIER = 'portIdentifier';
|
|
9
|
+
#ports = {};
|
|
10
|
+
#requests = new rxjs_1.Subject();
|
|
11
|
+
constructor(name = default_connection_name_1.DEFAULT_CONNECTION_NAME) {
|
|
12
|
+
super();
|
|
13
|
+
chrome.runtime.onConnect.addListener((port) => {
|
|
14
|
+
if (port.name !== name) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
port.onMessage.addListener((message, incomingMessagePort) => {
|
|
18
|
+
if (!this.#ports[incomingMessagePort.sender.tab.id]) {
|
|
19
|
+
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
20
|
+
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
21
|
+
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
22
|
+
this.terminateMessage$.next(message.id);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const newMessage = {
|
|
26
|
+
...message,
|
|
27
|
+
id: `${message.id}&${ChromeMessageHost.PORT_IDENTIFIER}=${incomingMessagePort.sender.tab.id}`,
|
|
28
|
+
};
|
|
29
|
+
this.#requests.next(newMessage);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
this.listen(this.#requests);
|
|
33
|
+
}
|
|
34
|
+
response(message) {
|
|
35
|
+
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
36
|
+
message.id = messageId;
|
|
37
|
+
if (this.#ports[portId]) {
|
|
38
|
+
this.#ports[portId].postMessage(message);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.ChromeMessageHost = ChromeMessageHost;
|
package/chrome/message-host.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { MessageHost } from '../message-host';
|
|
2
|
-
import {
|
|
3
|
-
declare const PORTS: unique symbol;
|
|
4
|
-
declare const REQUESTS$: unique symbol;
|
|
2
|
+
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
5
3
|
export declare class ChromeMessageHost extends MessageHost {
|
|
4
|
+
#private;
|
|
6
5
|
private static readonly PORT_IDENTIFIER;
|
|
7
|
-
private [PORTS];
|
|
8
|
-
private [REQUESTS$];
|
|
9
6
|
constructor(name?: string);
|
|
10
|
-
protected response(message:
|
|
7
|
+
protected response(message: SuccessfulMessageResponse): void;
|
|
11
8
|
}
|
|
12
|
-
export {};
|
package/chrome/message-host.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { Subject } from 'rxjs';
|
|
2
2
|
import { MessageHost } from '../message-host';
|
|
3
3
|
import { DEFAULT_CONNECTION_NAME } from './default-connection-name';
|
|
4
|
-
const PORTS = Symbol('Ports');
|
|
5
|
-
const REQUESTS$ = Symbol('Requests');
|
|
6
4
|
export class ChromeMessageHost extends MessageHost {
|
|
7
5
|
static PORT_IDENTIFIER = 'portIdentifier';
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
#ports = {};
|
|
7
|
+
#requests = new Subject();
|
|
10
8
|
constructor(name = DEFAULT_CONNECTION_NAME) {
|
|
11
9
|
super();
|
|
12
10
|
chrome.runtime.onConnect.addListener((port) => {
|
|
@@ -14,10 +12,10 @@ export class ChromeMessageHost extends MessageHost {
|
|
|
14
12
|
return;
|
|
15
13
|
}
|
|
16
14
|
port.onMessage.addListener((message, incomingMessagePort) => {
|
|
17
|
-
if (!this[
|
|
18
|
-
this[
|
|
15
|
+
if (!this.#ports[incomingMessagePort.sender.tab.id]) {
|
|
16
|
+
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
19
17
|
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
20
|
-
delete this[
|
|
18
|
+
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
21
19
|
this.terminateMessage$.next(message.id);
|
|
22
20
|
});
|
|
23
21
|
}
|
|
@@ -25,16 +23,18 @@ export class ChromeMessageHost extends MessageHost {
|
|
|
25
23
|
...message,
|
|
26
24
|
id: `${message.id}&${ChromeMessageHost.PORT_IDENTIFIER}=${incomingMessagePort.sender.tab.id}`,
|
|
27
25
|
};
|
|
28
|
-
this
|
|
26
|
+
this.#requests.next(newMessage);
|
|
29
27
|
});
|
|
30
28
|
});
|
|
31
|
-
this.listen(this
|
|
29
|
+
this.listen(this.#requests);
|
|
32
30
|
}
|
|
33
31
|
response(message) {
|
|
34
32
|
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
35
33
|
message.id = messageId;
|
|
36
|
-
if (this[
|
|
37
|
-
this[
|
|
34
|
+
if (this.#ports[portId]) {
|
|
35
|
+
this.#ports[portId].postMessage(message);
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
38
|
}
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=message-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/chrome/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IACxC,MAAM,CAAU,eAAe,GAAG,gBAAgB,CAAC;IAE3D,MAAM,GAAyC,EAAE,CAAC;IAClD,SAAS,GAAG,IAAI,OAAO,EAAW,CAAC;IAEnC,YAAY,IAAI,GAAG,uBAAuB;QACxC,KAAK,EAAE,CAAC;QAER,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAgB,EAAE,mBAAwC,EAAE,EAAE;gBACxF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAO,CAAC,GAAI,CAAC,EAAG,CAAC,EAAE,CAAC;oBACvD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAO,CAAC,GAAI,CAAC,EAAG,CAAC,GAAG,mBAAmB,CAAC;oBAExE,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE;wBAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAO,CAAC,GAAI,CAAC,EAAG,CAAC,CAAC;wBACtD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC1C,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,UAAU,GAAG;oBACjB,GAAG,OAAO;oBACV,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,iBAAiB,CAAC,eAAe,IAAI,mBAAmB,CAAC,MAAO,CAAC,GAAI,CAAC,EAAG,EAAE;iBACjG,CAAC;gBAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAES,QAAQ,CAAC,OAAkC;QACnD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,eAAe,GAAG,CAAC,CAAC;QAEvF,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;QAEvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC","file":"message-host.js","sourcesContent":["import { Subject } from 'rxjs';\n\nimport { MessageHost } from '../message-host';\nimport { SuccessfulMessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { DEFAULT_CONNECTION_NAME } from './default-connection-name';\n\nexport class ChromeMessageHost extends MessageHost {\n private static readonly PORT_IDENTIFIER = 'portIdentifier';\n\n #ports: {[key: string]: chrome.runtime.Port} = {};\n #requests = new Subject<Message>();\n\n constructor(name = DEFAULT_CONNECTION_NAME) {\n super();\n\n chrome.runtime.onConnect.addListener((port) => {\n if (port.name !== name) {\n return;\n }\n\n port.onMessage.addListener((message: Message, incomingMessagePort: chrome.runtime.Port) => {\n if (!this.#ports[incomingMessagePort.sender!.tab!.id!]) {\n this.#ports[incomingMessagePort.sender!.tab!.id!] = incomingMessagePort;\n\n incomingMessagePort.onDisconnect.addListener(disconnectedPort => {\n delete this.#ports[disconnectedPort.sender!.tab!.id!];\n this.terminateMessage$.next(message.id);\n });\n }\n\n const newMessage = {\n ...message,\n id: `${message.id}&${ChromeMessageHost.PORT_IDENTIFIER}=${incomingMessagePort.sender!.tab!.id!}`,\n };\n\n this.#requests.next(newMessage);\n });\n });\n\n this.listen(this.#requests);\n }\n\n protected response(message: SuccessfulMessageResponse): void {\n const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);\n\n message.id = messageId;\n\n if (this.#ports[portId]) {\n this.#ports[portId].postMessage(message);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/channel-path-splitter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,CAAC","file":"channel-path-splitter.js","sourcesContent":["export const CHANNEL_PATH_SPLITTER = '__hermes_channel_splitter__';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/default-channel-name.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,4BAA4B,CAAC","file":"default-channel-name.js","sourcesContent":["export const DEFAULT_CHANNEL_NAME = 'HermesIframeChannelDefault';\n"]}
|
package/iframe/iframe.type.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/iframe.type.ts"],"names":[],"mappings":"","file":"iframe.type.js","sourcesContent":["export type IFrame = HTMLIFrameElement | (() => HTMLIFrameElement);"]}
|
package/iframe/index.cjs
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageService = exports.IframeMessageHost = exports.IframeMessageClient = exports.Listen = exports.Request = void 0;
|
|
4
|
+
var request_decorator_1 = require("../request.decorator");
|
|
5
|
+
Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return request_decorator_1.Request; } });
|
|
6
|
+
var listen_decorator_1 = require("../listen.decorator");
|
|
7
|
+
Object.defineProperty(exports, "Listen", { enumerable: true, get: function () { return listen_decorator_1.Listen; } });
|
|
8
|
+
var message_client_1 = require("./message-client");
|
|
9
|
+
Object.defineProperty(exports, "IframeMessageClient", { enumerable: true, get: function () { return message_client_1.IframeMessageClient; } });
|
|
10
|
+
var message_host_1 = require("./message-host");
|
|
11
|
+
Object.defineProperty(exports, "IframeMessageHost", { enumerable: true, get: function () { return message_host_1.IframeMessageHost; } });
|
|
12
|
+
var message_service_1 = require("./message-service");
|
|
13
|
+
Object.defineProperty(exports, "IframeMessageService", { enumerable: true, get: function () { return message_service_1.IframeMessageService; } });
|
package/iframe/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC","file":"index.js","sourcesContent":["export { Request } from '../request.decorator';\nexport { Listen } from '../listen.decorator';\nexport { IframeMessageClient } from './message-client';\nexport { IframeMessageHost } from './message-host';\nexport { IframeMessageService } from './message-service';\nexport { UpcomingMessage } from './upcoming-message';\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageClient = void 0;
|
|
4
|
+
const js_utils_1 = require("@thalesrc/js-utils");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const message_client_1 = require("../message-client");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
8
|
+
const channel_path_splitter_1 = require("./channel-path-splitter");
|
|
9
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
10
|
+
class IframeMessageClient extends message_client_1.MessageClient {
|
|
11
|
+
channelName;
|
|
12
|
+
[selectors_1.RESPONSES$] = new rxjs_1.Subject();
|
|
13
|
+
#_targetFrame;
|
|
14
|
+
get #targetFrame() {
|
|
15
|
+
return typeof this.#_targetFrame === 'function'
|
|
16
|
+
? this.#_targetFrame() ?? null
|
|
17
|
+
: this.#_targetFrame ?? null;
|
|
18
|
+
}
|
|
19
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
20
|
+
super();
|
|
21
|
+
this.channelName = channelName;
|
|
22
|
+
this.#_targetFrame = targetFrame;
|
|
23
|
+
window.addEventListener('message', ({ data, source }) => {
|
|
24
|
+
const target = this.#targetFrame;
|
|
25
|
+
if (target && source !== target.contentWindow)
|
|
26
|
+
return;
|
|
27
|
+
if (!data
|
|
28
|
+
|| typeof data !== 'object'
|
|
29
|
+
|| typeof data.id === 'undefined'
|
|
30
|
+
|| typeof data.completed === 'undefined') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this[selectors_1.RESPONSES$].next(data);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
[selectors_1.SEND](message) {
|
|
37
|
+
message = { ...message, path: `${this.channelName}${channel_path_splitter_1.CHANNEL_PATH_SPLITTER}${message.path}` };
|
|
38
|
+
const target = this.#targetFrame;
|
|
39
|
+
if (target) {
|
|
40
|
+
target.contentWindow.postMessage(message, '*');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
window.parent.postMessage(message, '*');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
[selectors_1.GET_NEW_ID]() {
|
|
47
|
+
return (0, js_utils_1.uniqueId)('hermes-iframe-message');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.IframeMessageClient = IframeMessageClient;
|
|
@@ -4,15 +4,11 @@ import { MessageResponse } from '../message-response.type';
|
|
|
4
4
|
import { Message } from '../message.interface';
|
|
5
5
|
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
6
6
|
import { IFrame } from './iframe.type';
|
|
7
|
-
declare const TARGET_FRAME: unique symbol;
|
|
8
|
-
declare const _TARGET_FRAME: unique symbol;
|
|
9
7
|
export declare class IframeMessageClient extends MessageClient {
|
|
8
|
+
#private;
|
|
10
9
|
private channelName;
|
|
11
10
|
[RESPONSES$]: Subject<MessageResponse>;
|
|
12
|
-
private [_TARGET_FRAME];
|
|
13
|
-
protected get [TARGET_FRAME](): null | HTMLIFrameElement;
|
|
14
11
|
constructor(channelName?: string, targetFrame?: IFrame);
|
|
15
12
|
[SEND]<T>(message: Message<T>): void;
|
|
16
13
|
protected [GET_NEW_ID](): string;
|
|
17
14
|
}
|
|
18
|
-
export {};
|
package/iframe/message-client.js
CHANGED
|
@@ -4,23 +4,21 @@ import { MessageClient } from '../message-client';
|
|
|
4
4
|
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
5
5
|
import { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';
|
|
6
6
|
import { DEFAULT_CHANNEL_NAME } from './default-channel-name';
|
|
7
|
-
const TARGET_FRAME = Symbol('Target Frame');
|
|
8
|
-
const _TARGET_FRAME = Symbol('_ Target Frame');
|
|
9
7
|
export class IframeMessageClient extends MessageClient {
|
|
10
8
|
channelName;
|
|
11
9
|
[RESPONSES$] = new Subject();
|
|
12
|
-
|
|
13
|
-
get
|
|
14
|
-
return typeof this
|
|
15
|
-
? this
|
|
16
|
-
: this
|
|
10
|
+
#_targetFrame;
|
|
11
|
+
get #targetFrame() {
|
|
12
|
+
return typeof this.#_targetFrame === 'function'
|
|
13
|
+
? this.#_targetFrame() ?? null
|
|
14
|
+
: this.#_targetFrame ?? null;
|
|
17
15
|
}
|
|
18
16
|
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
19
17
|
super();
|
|
20
18
|
this.channelName = channelName;
|
|
21
|
-
this
|
|
19
|
+
this.#_targetFrame = targetFrame;
|
|
22
20
|
window.addEventListener('message', ({ data, source }) => {
|
|
23
|
-
const target = this
|
|
21
|
+
const target = this.#targetFrame;
|
|
24
22
|
if (target && source !== target.contentWindow)
|
|
25
23
|
return;
|
|
26
24
|
if (!data
|
|
@@ -34,7 +32,7 @@ export class IframeMessageClient extends MessageClient {
|
|
|
34
32
|
}
|
|
35
33
|
[SEND](message) {
|
|
36
34
|
message = { ...message, path: `${this.channelName}${CHANNEL_PATH_SPLITTER}${message.path}` };
|
|
37
|
-
const target = this
|
|
35
|
+
const target = this.#targetFrame;
|
|
38
36
|
if (target) {
|
|
39
37
|
target.contentWindow.postMessage(message, '*');
|
|
40
38
|
}
|
|
@@ -46,3 +44,5 @@ export class IframeMessageClient extends MessageClient {
|
|
|
46
44
|
return uniqueId('hermes-iframe-message');
|
|
47
45
|
}
|
|
48
46
|
}
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=message-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/message-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAW1C;IAVH,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,EAAmB,CAAC;IACrD,aAAa,CAAqB;IAElC,IAAI,YAAY;QACd,OAAO,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU;YAC7C,CAAC,CAAE,IAAI,CAAC,aAAyC,EAAE,IAAI,IAAI;YAC3D,CAAC,CAAC,IAAI,CAAC,aAAkC,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,YACU,cAAc,oBAAoB,EAC1C,WAAoB;QAEpB,KAAK,EAAE,CAAC;QAHA,gBAAW,GAAX,WAAW,CAAuB;QAK1C,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QAEjC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAA0C,EAAE,EAAE;YAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;YAEjC,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,aAAa;gBAAE,OAAO;YAEtD,IAAI,CAAC,IAAI;mBACJ,OAAO,IAAI,KAAK,QAAQ;mBACxB,OAAO,IAAI,CAAC,EAAE,KAAK,WAAW;mBAC9B,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,EACxC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,CAAC,IAAI,CAAC,CAAI,OAAmB;QAClC,OAAO,GAAG,EAAC,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,EAAC,CAAC;QAE3F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QAEjC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,aAAc,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAES,CAAC,UAAU,CAAC;QACpB,OAAO,QAAQ,CAAC,uBAAuB,CAAW,CAAC;IACrD,CAAC;CACF","file":"message-client.js","sourcesContent":["import { uniqueId } from '@thalesrc/js-utils';\nimport { Subject } from 'rxjs';\nimport { MessageClient } from '../message-client';\nimport { MessageResponse, SuccessfulMessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';\nimport { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';\nimport { DEFAULT_CHANNEL_NAME } from './default-channel-name';\nimport { IFrame } from './iframe.type';\n\nexport class IframeMessageClient extends MessageClient {\n public [RESPONSES$] = new Subject<MessageResponse>();\n #_targetFrame: IFrame | undefined;\n\n get #targetFrame(): null | HTMLIFrameElement {\n return typeof this.#_targetFrame === 'function'\n ? (this.#_targetFrame as () => HTMLIFrameElement)() ?? null\n : this.#_targetFrame as HTMLIFrameElement ?? null;\n }\n\n constructor(\n private channelName = DEFAULT_CHANNEL_NAME,\n targetFrame?: IFrame\n ) {\n super();\n\n this.#_targetFrame = targetFrame;\n\n window.addEventListener('message', ({data, source}: MessageEvent<SuccessfulMessageResponse>) => {\n const target = this.#targetFrame;\n\n if (target && source !== target.contentWindow) return;\n\n if (!data\n || typeof data !== 'object'\n || typeof data.id === 'undefined'\n || typeof data.completed === 'undefined'\n ) {\n return;\n }\n\n this[RESPONSES$].next(data);\n });\n }\n\n public [SEND]<T>(message: Message<T>) {\n message = {...message, path: `${this.channelName}${CHANNEL_PATH_SPLITTER}${message.path}`};\n\n const target = this.#targetFrame;\n\n if (target) {\n target.contentWindow!.postMessage(message, '*');\n } else {\n window.parent.postMessage(message, '*');\n }\n }\n\n protected [GET_NEW_ID](): string {\n return uniqueId('hermes-iframe-message') as string;\n }\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageHost = void 0;
|
|
4
|
+
const js_utils_1 = require("@thalesrc/js-utils");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const message_host_1 = require("../message-host");
|
|
7
|
+
const channel_path_splitter_1 = require("./channel-path-splitter");
|
|
8
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
9
|
+
const source_id_splitter_1 = require("./source-id-splitter");
|
|
10
|
+
class IframeMessageHost extends message_host_1.MessageHost {
|
|
11
|
+
channelName;
|
|
12
|
+
#requests = new rxjs_1.Subject();
|
|
13
|
+
#sources = [];
|
|
14
|
+
#_targetFrame;
|
|
15
|
+
get #targetFrame() {
|
|
16
|
+
return typeof this.#_targetFrame === 'function'
|
|
17
|
+
? this.#_targetFrame() || null
|
|
18
|
+
: this.#_targetFrame || null;
|
|
19
|
+
}
|
|
20
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
21
|
+
super();
|
|
22
|
+
this.channelName = channelName;
|
|
23
|
+
this.#_targetFrame = targetFrame;
|
|
24
|
+
window.addEventListener('message', this.#handler);
|
|
25
|
+
this.listen(this.#requests);
|
|
26
|
+
}
|
|
27
|
+
terminate() {
|
|
28
|
+
window.removeEventListener('message', this.#handler);
|
|
29
|
+
}
|
|
30
|
+
response(message) {
|
|
31
|
+
const [sourceId, messageId] = message.id.split(source_id_splitter_1.SOURCE_ID_SPLITTER);
|
|
32
|
+
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
33
|
+
message = {
|
|
34
|
+
...message,
|
|
35
|
+
id: messageId,
|
|
36
|
+
};
|
|
37
|
+
source.postMessage(message);
|
|
38
|
+
}
|
|
39
|
+
#handler = ({ data, source }) => {
|
|
40
|
+
if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const targetFrame = this.#targetFrame;
|
|
44
|
+
if (targetFrame && targetFrame.contentWindow !== source) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const [channel, path] = data.path.split(channel_path_splitter_1.CHANNEL_PATH_SPLITTER);
|
|
48
|
+
if (channel !== this.channelName) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!this.#sources.some(([, s]) => s === source)) {
|
|
52
|
+
this.#sources.push([(0, js_utils_1.uniqueId)('hermes-iframe-source'), source]);
|
|
53
|
+
}
|
|
54
|
+
const [sourceId] = this.#sources.find(([, s]) => s === source);
|
|
55
|
+
this.#requests.next({
|
|
56
|
+
body: targetFrame ? data.body : { data: data.body, sender: source },
|
|
57
|
+
id: `${sourceId}${source_id_splitter_1.SOURCE_ID_SPLITTER}${data.id}`,
|
|
58
|
+
path,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
exports.IframeMessageHost = IframeMessageHost;
|
package/iframe/message-host.d.ts
CHANGED
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
import { MessageHost } from '../message-host';
|
|
2
|
-
import {
|
|
2
|
+
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
3
3
|
import { IFrame } from './iframe.type';
|
|
4
|
-
declare const REQUESTS$: unique symbol;
|
|
5
|
-
declare const SOURCES: unique symbol;
|
|
6
|
-
declare const HANDLER: unique symbol;
|
|
7
|
-
declare const TARGET_FRAME: unique symbol;
|
|
8
|
-
declare const _TARGET_FRAME: unique symbol;
|
|
9
4
|
export declare class IframeMessageHost extends MessageHost {
|
|
5
|
+
#private;
|
|
10
6
|
private channelName;
|
|
11
|
-
private [REQUESTS$];
|
|
12
|
-
private [SOURCES];
|
|
13
|
-
private [_TARGET_FRAME];
|
|
14
|
-
protected get [TARGET_FRAME](): null | HTMLIFrameElement;
|
|
15
7
|
constructor(channelName?: string, targetFrame?: IFrame);
|
|
16
8
|
terminate(): void;
|
|
17
|
-
protected response(message:
|
|
18
|
-
private [HANDLER];
|
|
9
|
+
protected response(message: SuccessfulMessageResponse): void;
|
|
19
10
|
}
|
|
20
|
-
export {};
|
package/iframe/message-host.js
CHANGED
|
@@ -4,45 +4,40 @@ import { MessageHost } from '../message-host';
|
|
|
4
4
|
import { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';
|
|
5
5
|
import { DEFAULT_CHANNEL_NAME } from './default-channel-name';
|
|
6
6
|
import { SOURCE_ID_SPLITTER } from './source-id-splitter';
|
|
7
|
-
const REQUESTS$ = Symbol('Requests');
|
|
8
|
-
const SOURCES = Symbol('Sources');
|
|
9
|
-
const HANDLER = Symbol('Handler');
|
|
10
|
-
const TARGET_FRAME = Symbol('Target Frame');
|
|
11
|
-
const _TARGET_FRAME = Symbol('_ Target Frame');
|
|
12
7
|
export class IframeMessageHost extends MessageHost {
|
|
13
8
|
channelName;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
get
|
|
18
|
-
return typeof this
|
|
19
|
-
? this
|
|
20
|
-
: this
|
|
9
|
+
#requests = new Subject();
|
|
10
|
+
#sources = [];
|
|
11
|
+
#_targetFrame;
|
|
12
|
+
get #targetFrame() {
|
|
13
|
+
return typeof this.#_targetFrame === 'function'
|
|
14
|
+
? this.#_targetFrame() || null
|
|
15
|
+
: this.#_targetFrame || null;
|
|
21
16
|
}
|
|
22
17
|
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
23
18
|
super();
|
|
24
19
|
this.channelName = channelName;
|
|
25
|
-
this
|
|
26
|
-
window.addEventListener('message', this
|
|
27
|
-
this.listen(this
|
|
20
|
+
this.#_targetFrame = targetFrame;
|
|
21
|
+
window.addEventListener('message', this.#handler);
|
|
22
|
+
this.listen(this.#requests);
|
|
28
23
|
}
|
|
29
24
|
terminate() {
|
|
30
|
-
window.removeEventListener('message', this
|
|
25
|
+
window.removeEventListener('message', this.#handler);
|
|
31
26
|
}
|
|
32
27
|
response(message) {
|
|
33
28
|
const [sourceId, messageId] = message.id.split(SOURCE_ID_SPLITTER);
|
|
34
|
-
const [, source] = this
|
|
29
|
+
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
35
30
|
message = {
|
|
36
31
|
...message,
|
|
37
32
|
id: messageId,
|
|
38
33
|
};
|
|
39
34
|
source.postMessage(message);
|
|
40
35
|
}
|
|
41
|
-
|
|
36
|
+
#handler = ({ data, source }) => {
|
|
42
37
|
if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {
|
|
43
38
|
return;
|
|
44
39
|
}
|
|
45
|
-
const targetFrame = this
|
|
40
|
+
const targetFrame = this.#targetFrame;
|
|
46
41
|
if (targetFrame && targetFrame.contentWindow !== source) {
|
|
47
42
|
return;
|
|
48
43
|
}
|
|
@@ -50,14 +45,16 @@ export class IframeMessageHost extends MessageHost {
|
|
|
50
45
|
if (channel !== this.channelName) {
|
|
51
46
|
return;
|
|
52
47
|
}
|
|
53
|
-
if (!this
|
|
54
|
-
this
|
|
48
|
+
if (!this.#sources.some(([, s]) => s === source)) {
|
|
49
|
+
this.#sources.push([uniqueId('hermes-iframe-source'), source]);
|
|
55
50
|
}
|
|
56
|
-
const [sourceId] = this
|
|
57
|
-
this
|
|
51
|
+
const [sourceId] = this.#sources.find(([, s]) => s === source);
|
|
52
|
+
this.#requests.next({
|
|
58
53
|
body: targetFrame ? data.body : { data: data.body, sender: source },
|
|
59
54
|
id: `${sourceId}${SOURCE_ID_SPLITTER}${data.id}`,
|
|
60
55
|
path,
|
|
61
56
|
});
|
|
62
57
|
};
|
|
63
58
|
}
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=message-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/message-host.ts"],"names":[],"mappings":"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","file":"message-host.js","sourcesContent":["import { uniqueId } from '@thalesrc/js-utils';\nimport { Subject } from 'rxjs';\nimport { MessageHost } from '../message-host';\nimport { SuccessfulMessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';\nimport { DEFAULT_CHANNEL_NAME } from './default-channel-name';\nimport { SOURCE_ID_SPLITTER } from './source-id-splitter';\nimport { IFrame } from './iframe.type';\n\nexport class IframeMessageHost extends MessageHost {\n #requests = new Subject<Message>();\n #sources: Array<[string, MessageEventSource]> = [];\n #_targetFrame: IFrame | undefined;\n\n get #targetFrame(): null | HTMLIFrameElement {\n return typeof this.#_targetFrame === 'function'\n ? (this.#_targetFrame as () => HTMLIFrameElement)() || null\n : this.#_targetFrame as HTMLIFrameElement || null;\n }\n\n constructor(\n private channelName = DEFAULT_CHANNEL_NAME,\n targetFrame?: IFrame\n ) {\n super();\n\n this.#_targetFrame = targetFrame;\n\n window.addEventListener('message', this.#handler);\n\n this.listen(this.#requests);\n }\n\n public terminate(): void {\n window.removeEventListener('message', this.#handler);\n }\n\n protected response(message: SuccessfulMessageResponse): void {\n const [sourceId, messageId] = message.id.split(SOURCE_ID_SPLITTER);\n const [, source] = this.#sources.find(([sId]) => sId === sourceId)!;\n\n message = {\n ...message,\n id: messageId,\n };\n\n (source as any).postMessage(message);\n }\n\n #handler = ({data, source}: MessageEvent<Message>) => {\n if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {\n return;\n }\n\n const targetFrame = this.#targetFrame;\n\n if (targetFrame && targetFrame.contentWindow !== source) {\n return;\n }\n\n const [channel, path] = data.path.split(CHANNEL_PATH_SPLITTER);\n\n if (channel !== this.channelName) {\n return;\n }\n\n if (!this.#sources.some(([, s]) => s === source)) {\n this.#sources.push([uniqueId('hermes-iframe-source') as string, source!]);\n }\n\n const [sourceId] = this.#sources.find(([, s]) => s === source)!;\n this.#requests.next({\n body: targetFrame ? data.body : {data: data.body, sender: source},\n id: `${sourceId}${SOURCE_ID_SPLITTER}${data.id}`,\n path,\n });\n }\n}\n"]}
|