@thalesrc/hermes 0.0.0
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/LICENSE +21 -0
- package/README.md +538 -0
- package/broadcast/default-channel-name.cjs +4 -0
- package/broadcast/default-channel-name.d.ts +1 -0
- package/broadcast/default-channel-name.js +3 -0
- package/broadcast/default-channel-name.js.map +1 -0
- package/broadcast/index.cjs +13 -0
- package/broadcast/index.d.ts +5 -0
- package/broadcast/index.js +7 -0
- package/broadcast/index.js.map +1 -0
- package/broadcast/message-client.cjs +26 -0
- package/broadcast/message-client.d.ts +12 -0
- package/broadcast/message-client.js +24 -0
- package/broadcast/message-client.js.map +1 -0
- package/broadcast/message-host.cjs +28 -0
- package/broadcast/message-host.d.ts +9 -0
- package/broadcast/message-host.js +26 -0
- package/broadcast/message-host.js.map +1 -0
- package/broadcast/message-service.cjs +13 -0
- package/broadcast/message-service.d.ts +8 -0
- package/broadcast/message-service.js +11 -0
- package/broadcast/message-service.js.map +1 -0
- package/chrome/default-connection-name.cjs +4 -0
- package/chrome/default-connection-name.d.ts +1 -0
- package/chrome/default-connection-name.js +3 -0
- package/chrome/default-connection-name.js.map +1 -0
- package/chrome/index.cjs +11 -0
- package/chrome/index.d.ts +4 -0
- package/chrome/index.js +6 -0
- package/chrome/index.js.map +1 -0
- package/chrome/message-client.cjs +41 -0
- package/chrome/message-client.d.ts +15 -0
- package/chrome/message-client.js +39 -0
- package/chrome/message-client.js.map +1 -0
- package/chrome/message-host.cjs +43 -0
- package/chrome/message-host.d.ts +9 -0
- package/chrome/message-host.js +41 -0
- package/chrome/message-host.js.map +1 -0
- package/iframe/channel-path-splitter.cjs +4 -0
- package/iframe/channel-path-splitter.d.ts +1 -0
- package/iframe/channel-path-splitter.js +3 -0
- package/iframe/channel-path-splitter.js.map +1 -0
- package/iframe/default-channel-name.cjs +4 -0
- package/iframe/default-channel-name.d.ts +1 -0
- package/iframe/default-channel-name.js +3 -0
- package/iframe/default-channel-name.js.map +1 -0
- package/iframe/iframe.type.cjs +2 -0
- package/iframe/iframe.type.d.ts +1 -0
- package/iframe/iframe.type.js +3 -0
- package/iframe/iframe.type.js.map +1 -0
- package/iframe/index.cjs +13 -0
- package/iframe/index.d.ts +6 -0
- package/iframe/index.js +7 -0
- package/iframe/index.js.map +1 -0
- package/iframe/message-client.cjs +50 -0
- package/iframe/message-client.d.ts +14 -0
- package/iframe/message-client.js +48 -0
- package/iframe/message-client.js.map +1 -0
- package/iframe/message-host.cjs +63 -0
- package/iframe/message-host.d.ts +11 -0
- package/iframe/message-host.js +61 -0
- package/iframe/message-host.js.map +1 -0
- package/iframe/message-service.cjs +13 -0
- package/iframe/message-service.d.ts +9 -0
- package/iframe/message-service.js +11 -0
- package/iframe/message-service.js.map +1 -0
- package/iframe/source-id-splitter.cjs +4 -0
- package/iframe/source-id-splitter.d.ts +1 -0
- package/iframe/source-id-splitter.js +3 -0
- package/iframe/source-id-splitter.js.map +1 -0
- package/iframe/upcoming-message.cjs +2 -0
- package/iframe/upcoming-message.d.ts +4 -0
- package/iframe/upcoming-message.js +3 -0
- package/iframe/upcoming-message.js.map +1 -0
- package/index.cjs +13 -0
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/index.js.map +1 -0
- package/listen.decorator.cjs +20 -0
- package/listen.decorator.d.ts +6 -0
- package/listen.decorator.js +19 -0
- package/listen.decorator.js.map +1 -0
- package/listener-storage.type.cjs +2 -0
- package/listener-storage.type.d.ts +2 -0
- package/listener-storage.type.js +3 -0
- package/listener-storage.type.js.map +1 -0
- package/message-client.cjs +10 -0
- package/message-client.d.ts +23 -0
- package/message-client.js +8 -0
- package/message-client.js.map +1 -0
- package/message-host.cjs +58 -0
- package/message-host.d.ts +26 -0
- package/message-host.js +56 -0
- package/message-host.js.map +1 -0
- package/message-response.type.cjs +2 -0
- package/message-response.type.d.ts +14 -0
- package/message-response.type.js +3 -0
- package/message-response.type.js.map +1 -0
- package/message.interface.cjs +2 -0
- package/message.interface.d.ts +6 -0
- package/message.interface.js +3 -0
- package/message.interface.js.map +1 -0
- package/package.json +158 -0
- package/request.decorator.cjs +20 -0
- package/request.decorator.d.ts +1 -0
- package/request.decorator.js +19 -0
- package/request.decorator.js.map +1 -0
- package/selectors.cjs +10 -0
- package/selectors.d.ts +7 -0
- package/selectors.js +9 -0
- package/selectors.js.map +1 -0
- package/worker/index.cjs +13 -0
- package/worker/index.d.ts +5 -0
- package/worker/index.js +7 -0
- package/worker/index.js.map +1 -0
- package/worker/message-client.cjs +174 -0
- package/worker/message-client.d.ts +117 -0
- package/worker/message-client.js +172 -0
- package/worker/message-client.js.map +1 -0
- package/worker/message-host.cjs +41 -0
- package/worker/message-host.d.ts +9 -0
- package/worker/message-host.js +39 -0
- package/worker/message-host.js.map +1 -0
- package/worker/message-service.cjs +12 -0
- package/worker/message-service.d.ts +8 -0
- package/worker/message-service.js +10 -0
- package/worker/message-service.js.map +1 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BroadcastMessageHost = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const message_host_1 = require("../message-host");
|
|
6
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
8
|
+
class BroadcastMessageHost extends message_host_1.MessageHost {
|
|
9
|
+
#requests$ = new rxjs_1.Subject();
|
|
10
|
+
#channel;
|
|
11
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME) {
|
|
12
|
+
super();
|
|
13
|
+
this.#channel = new BroadcastChannel(channelName);
|
|
14
|
+
this.#channel.addEventListener('message', this.#handler);
|
|
15
|
+
this[selectors_1.LISTEN](this.#requests$);
|
|
16
|
+
}
|
|
17
|
+
[selectors_1.RESPONSE](message) {
|
|
18
|
+
this.#channel.postMessage(message);
|
|
19
|
+
}
|
|
20
|
+
terminate() {
|
|
21
|
+
this.#channel.removeEventListener('message', this.#handler);
|
|
22
|
+
this.#channel.close();
|
|
23
|
+
}
|
|
24
|
+
#handler = (event) => {
|
|
25
|
+
this.#requests$.next(event.data);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.BroadcastMessageHost = BroadcastMessageHost;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageHost } from "../message-host";
|
|
2
|
+
import { MessageResponse } from "../message-response.type";
|
|
3
|
+
import { RESPONSE } from "../selectors";
|
|
4
|
+
export declare class BroadcastMessageHost extends MessageHost {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(channelName?: string);
|
|
7
|
+
protected [RESPONSE](message: MessageResponse): void;
|
|
8
|
+
terminate(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Subject } from "rxjs";
|
|
2
|
+
import { MessageHost } from "../message-host";
|
|
3
|
+
import { DEFAULT_CHANNEL_NAME } from "./default-channel-name";
|
|
4
|
+
import { LISTEN, RESPONSE } from "../selectors";
|
|
5
|
+
export class BroadcastMessageHost extends MessageHost {
|
|
6
|
+
#requests$ = new Subject();
|
|
7
|
+
#channel;
|
|
8
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME) {
|
|
9
|
+
super();
|
|
10
|
+
this.#channel = new BroadcastChannel(channelName);
|
|
11
|
+
this.#channel.addEventListener('message', this.#handler);
|
|
12
|
+
this[LISTEN](this.#requests$);
|
|
13
|
+
}
|
|
14
|
+
[RESPONSE](message) {
|
|
15
|
+
this.#channel.postMessage(message);
|
|
16
|
+
}
|
|
17
|
+
terminate() {
|
|
18
|
+
this.#channel.removeEventListener('message', this.#handler);
|
|
19
|
+
this.#channel.close();
|
|
20
|
+
}
|
|
21
|
+
#handler = (event) => {
|
|
22
|
+
this.#requests$.next(event.data);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=message-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/broadcast/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMhD,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD,UAAU,GAAG,IAAI,OAAO,EAAW,CAAC;IACpC,QAAQ,CAAmB;IAE3B,YAAY,WAAW,GAAG,oBAAoB;QAC5C,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAES,CAAC,QAAQ,CAAC,CAAC,OAAwB;QAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,QAAQ,GAAG,CAAC,KAA4B,EAAE,EAAE;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAA;CACF","file":"message-host.js","sourcesContent":["import { Subject } from \"rxjs\";\nimport { MessageHost } from \"../message-host\";\nimport { MessageResponse } from \"../message-response.type\";\nimport { Message } from \"../message.interface\";\nimport { DEFAULT_CHANNEL_NAME } from \"./default-channel-name\";\nimport { LISTEN, RESPONSE } from \"../selectors\";\n\ninterface MessageEvent<T> {\n data: T;\n}\n\nexport class BroadcastMessageHost extends MessageHost {\n #requests$ = new Subject<Message>();\n #channel: BroadcastChannel;\n\n constructor(channelName = DEFAULT_CHANNEL_NAME) {\n super();\n\n this.#channel = new BroadcastChannel(channelName);\n\n this.#channel.addEventListener('message', this.#handler);\n this[LISTEN](this.#requests$);\n }\n\n protected [RESPONSE](message: MessageResponse) {\n this.#channel.postMessage(message);\n }\n\n terminate() {\n this.#channel.removeEventListener('message', this.#handler);\n this.#channel.close();\n }\n\n #handler = (event: MessageEvent<Message>) => {\n this.#requests$.next(event.data);\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BroadcastMessageService = void 0;
|
|
4
|
+
const mixin_1 = require("@thalesrc/js-utils/class/mixin");
|
|
5
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
6
|
+
const message_client_1 = require("./message-client");
|
|
7
|
+
const message_host_1 = require("./message-host");
|
|
8
|
+
class BroadcastMessageService extends (0, mixin_1.mixin)(message_host_1.BroadcastMessageHost, message_client_1.BroadcastMessageClient) {
|
|
9
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME) {
|
|
10
|
+
super([channelName], [channelName]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.BroadcastMessageService = BroadcastMessageService;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BroadcastMessageClient } from "./message-client";
|
|
2
|
+
declare const BroadcastMessageService_base: new (args_0: [channelName?: string | undefined], args_1: [channelName?: string | undefined]) => {
|
|
3
|
+
terminate: () => void;
|
|
4
|
+
} & BroadcastMessageClient;
|
|
5
|
+
export declare class BroadcastMessageService extends BroadcastMessageService_base {
|
|
6
|
+
constructor(channelName?: string);
|
|
7
|
+
}
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { mixin } from "@thalesrc/js-utils/class/mixin";
|
|
2
|
+
import { DEFAULT_CHANNEL_NAME } from "./default-channel-name";
|
|
3
|
+
import { BroadcastMessageClient } from "./message-client";
|
|
4
|
+
import { BroadcastMessageHost } from "./message-host";
|
|
5
|
+
export class BroadcastMessageService extends mixin(BroadcastMessageHost, BroadcastMessageClient) {
|
|
6
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME) {
|
|
7
|
+
super([channelName], [channelName]);
|
|
8
|
+
}
|
|
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
|
+
export declare const DEFAULT_CONNECTION_NAME = "hermes";
|
|
@@ -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
ADDED
|
@@ -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;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { MessageClient } from '../message-client';
|
|
3
|
+
import { MessageResponse } from '../message-response.type';
|
|
4
|
+
import { Message } from '../message.interface';
|
|
5
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
6
|
+
declare const PORT: unique symbol;
|
|
7
|
+
export declare class ChromeMessageClient extends MessageClient {
|
|
8
|
+
private static readonly connections;
|
|
9
|
+
[RESPONSES$]: Observable<MessageResponse>;
|
|
10
|
+
private [PORT];
|
|
11
|
+
constructor(name?: string);
|
|
12
|
+
[SEND]<T>(message: Message<T>): void;
|
|
13
|
+
protected [GET_NEW_ID](): string;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { share } from 'rxjs/operators';
|
|
3
|
+
import { MessageClient } from '../message-client';
|
|
4
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
5
|
+
import { DEFAULT_CONNECTION_NAME } from './default-connection-name';
|
|
6
|
+
const RANDOM_ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
7
|
+
const RANDOM_ID_CHARS_LENGTH = RANDOM_ID_CHARS.length;
|
|
8
|
+
const PORT = Symbol('Port');
|
|
9
|
+
export class ChromeMessageClient extends MessageClient {
|
|
10
|
+
static connections = {};
|
|
11
|
+
[RESPONSES$];
|
|
12
|
+
[PORT];
|
|
13
|
+
constructor(name = DEFAULT_CONNECTION_NAME) {
|
|
14
|
+
super();
|
|
15
|
+
if (!(name in ChromeMessageClient.connections)) {
|
|
16
|
+
const port = chrome.runtime.connect({ name });
|
|
17
|
+
const responses = new Observable(subscriber => {
|
|
18
|
+
port.onMessage.addListener((message) => {
|
|
19
|
+
subscriber.next(message);
|
|
20
|
+
});
|
|
21
|
+
}).pipe(share());
|
|
22
|
+
ChromeMessageClient.connections[name] = { port, responses };
|
|
23
|
+
}
|
|
24
|
+
this[PORT] = ChromeMessageClient.connections[name].port;
|
|
25
|
+
this[RESPONSES$] = ChromeMessageClient.connections[name].responses;
|
|
26
|
+
}
|
|
27
|
+
[SEND](message) {
|
|
28
|
+
this[PORT].postMessage(message);
|
|
29
|
+
}
|
|
30
|
+
[GET_NEW_ID]() {
|
|
31
|
+
let result = '' + Date.now();
|
|
32
|
+
for (var i = 0; i < 10; i++) {
|
|
33
|
+
result += RANDOM_ID_CHARS.charAt(Math.floor(Math.random() * RANDOM_ID_CHARS_LENGTH));
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=message-client.js.map
|
|
@@ -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,43 @@
|
|
|
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
|
+
const selectors_1 = require("../selectors");
|
|
8
|
+
class ChromeMessageHost extends message_host_1.MessageHost {
|
|
9
|
+
static PORT_IDENTIFIER = 'portIdentifier';
|
|
10
|
+
#ports = {};
|
|
11
|
+
#requests = new rxjs_1.Subject();
|
|
12
|
+
constructor(name = default_connection_name_1.DEFAULT_CONNECTION_NAME) {
|
|
13
|
+
super();
|
|
14
|
+
chrome.runtime.onConnect.addListener((port) => {
|
|
15
|
+
if (port.name !== name) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
port.onMessage.addListener((message, incomingMessagePort) => {
|
|
19
|
+
if (!this.#ports[incomingMessagePort.sender.tab.id]) {
|
|
20
|
+
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
21
|
+
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
22
|
+
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
23
|
+
this[selectors_1.TERMINATE_MESSAGE$].next(message.id);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const newMessage = {
|
|
27
|
+
...message,
|
|
28
|
+
id: `${message.id}&${ChromeMessageHost.PORT_IDENTIFIER}=${incomingMessagePort.sender.tab.id}`,
|
|
29
|
+
};
|
|
30
|
+
this.#requests.next(newMessage);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
this[selectors_1.LISTEN](this.#requests);
|
|
34
|
+
}
|
|
35
|
+
[selectors_1.RESPONSE](message) {
|
|
36
|
+
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
37
|
+
message.id = messageId;
|
|
38
|
+
if (this.#ports[portId]) {
|
|
39
|
+
this.#ports[portId].postMessage(message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ChromeMessageHost = ChromeMessageHost;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageHost } from '../message-host';
|
|
2
|
+
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
3
|
+
import { RESPONSE } from '../selectors';
|
|
4
|
+
export declare class ChromeMessageHost extends MessageHost {
|
|
5
|
+
#private;
|
|
6
|
+
private static readonly PORT_IDENTIFIER;
|
|
7
|
+
constructor(name?: string);
|
|
8
|
+
protected [RESPONSE](message: SuccessfulMessageResponse): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { MessageHost } from '../message-host';
|
|
3
|
+
import { DEFAULT_CONNECTION_NAME } from './default-connection-name';
|
|
4
|
+
import { LISTEN, RESPONSE, TERMINATE_MESSAGE$ } from '../selectors';
|
|
5
|
+
export class ChromeMessageHost extends MessageHost {
|
|
6
|
+
static PORT_IDENTIFIER = 'portIdentifier';
|
|
7
|
+
#ports = {};
|
|
8
|
+
#requests = new Subject();
|
|
9
|
+
constructor(name = DEFAULT_CONNECTION_NAME) {
|
|
10
|
+
super();
|
|
11
|
+
chrome.runtime.onConnect.addListener((port) => {
|
|
12
|
+
if (port.name !== name) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
port.onMessage.addListener((message, incomingMessagePort) => {
|
|
16
|
+
if (!this.#ports[incomingMessagePort.sender.tab.id]) {
|
|
17
|
+
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
18
|
+
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
19
|
+
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
20
|
+
this[TERMINATE_MESSAGE$].next(message.id);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const newMessage = {
|
|
24
|
+
...message,
|
|
25
|
+
id: `${message.id}&${ChromeMessageHost.PORT_IDENTIFIER}=${incomingMessagePort.sender.tab.id}`,
|
|
26
|
+
};
|
|
27
|
+
this.#requests.next(newMessage);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
this[LISTEN](this.#requests);
|
|
31
|
+
}
|
|
32
|
+
[RESPONSE](message) {
|
|
33
|
+
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
34
|
+
message.id = messageId;
|
|
35
|
+
if (this.#ports[portId]) {
|
|
36
|
+
this.#ports[portId].postMessage(message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//# 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;AACpE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,cAAc,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,kBAAkB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC5C,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,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAES,CAAC,QAAQ,CAAC,CAAC,OAAkC;QACrD,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';\nimport { LISTEN, RESPONSE, TERMINATE_MESSAGE$ } from '../selectors';\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[TERMINATE_MESSAGE$].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
|
+
export declare const CHANNEL_PATH_SPLITTER = "__hermes_channel_splitter__";
|
|
@@ -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
|
+
export declare const DEFAULT_CHANNEL_NAME = "HermesIframeChannelDefault";
|
|
@@ -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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type IFrame = HTMLIFrameElement | (() => HTMLIFrameElement);
|
|
@@ -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; } });
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Request } from '../request.decorator';
|
|
2
|
+
export { Listen } from '../listen.decorator';
|
|
3
|
+
export { IframeMessageClient } from './message-client';
|
|
4
|
+
export { IframeMessageHost } from './message-host';
|
|
5
|
+
export { IframeMessageService } from './message-service';
|
|
6
|
+
export { UpcomingMessage } from './upcoming-message';
|
package/iframe/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Request } from '../request.decorator';
|
|
2
|
+
export { Listen } from '../listen.decorator';
|
|
3
|
+
export { IframeMessageClient } from './message-client';
|
|
4
|
+
export { IframeMessageHost } from './message-host';
|
|
5
|
+
export { IframeMessageService } from './message-service';
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -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;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { MessageClient } from '../message-client';
|
|
3
|
+
import { MessageResponse } from '../message-response.type';
|
|
4
|
+
import { Message } from '../message.interface';
|
|
5
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
6
|
+
import { IFrame } from './iframe.type';
|
|
7
|
+
export declare class IframeMessageClient extends MessageClient {
|
|
8
|
+
#private;
|
|
9
|
+
private channelName;
|
|
10
|
+
[RESPONSES$]: Subject<MessageResponse>;
|
|
11
|
+
constructor(channelName?: string, targetFrame?: IFrame);
|
|
12
|
+
[SEND]<T>(message: Message<T>): void;
|
|
13
|
+
protected [GET_NEW_ID](): string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { uniqueId } from '@thalesrc/js-utils';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { MessageClient } from '../message-client';
|
|
4
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
5
|
+
import { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';
|
|
6
|
+
import { DEFAULT_CHANNEL_NAME } from './default-channel-name';
|
|
7
|
+
export class IframeMessageClient extends MessageClient {
|
|
8
|
+
channelName;
|
|
9
|
+
[RESPONSES$] = new Subject();
|
|
10
|
+
#_targetFrame;
|
|
11
|
+
get #targetFrame() {
|
|
12
|
+
return typeof this.#_targetFrame === 'function'
|
|
13
|
+
? this.#_targetFrame() ?? null
|
|
14
|
+
: this.#_targetFrame ?? null;
|
|
15
|
+
}
|
|
16
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
17
|
+
super();
|
|
18
|
+
this.channelName = channelName;
|
|
19
|
+
this.#_targetFrame = targetFrame;
|
|
20
|
+
window.addEventListener('message', ({ data, source }) => {
|
|
21
|
+
const target = this.#targetFrame;
|
|
22
|
+
if (target && source !== target.contentWindow)
|
|
23
|
+
return;
|
|
24
|
+
if (!data
|
|
25
|
+
|| typeof data !== 'object'
|
|
26
|
+
|| typeof data.id === 'undefined'
|
|
27
|
+
|| typeof data.completed === 'undefined') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this[RESPONSES$].next(data);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
[SEND](message) {
|
|
34
|
+
message = { ...message, path: `${this.channelName}${CHANNEL_PATH_SPLITTER}${message.path}` };
|
|
35
|
+
const target = this.#targetFrame;
|
|
36
|
+
if (target) {
|
|
37
|
+
target.contentWindow.postMessage(message, '*');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
window.parent.postMessage(message, '*');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
[GET_NEW_ID]() {
|
|
44
|
+
return uniqueId('hermes-iframe-message');
|
|
45
|
+
}
|
|
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"]}
|