@thalesrc/hermes 7.3.0 → 7.5.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 +54 -8
- package/broadcast/message-client.js.map +1 -1
- package/broadcast/message-host.cjs +3 -2
- package/broadcast/message-host.d.ts +2 -1
- package/broadcast/message-host.js +3 -2
- package/broadcast/message-host.js.map +1 -1
- package/chrome/message-client.cjs +1 -1
- package/chrome/message-client.js +1 -1
- package/chrome/message-client.js.map +1 -1
- package/chrome/message-host.cjs +4 -3
- package/chrome/message-host.d.ts +2 -1
- package/chrome/message-host.js +4 -3
- package/chrome/message-host.js.map +1 -1
- package/iframe/message-client.js.map +1 -1
- package/iframe/message-host.cjs +3 -2
- package/iframe/message-host.d.ts +2 -1
- package/iframe/message-host.js +3 -2
- package/iframe/message-host.js.map +1 -1
- package/message-host.cjs +12 -7
- package/message-host.d.ts +4 -3
- package/message-host.js +13 -8
- package/message-host.js.map +1 -1
- package/message-response.type.d.ts +2 -0
- package/message-response.type.js.map +1 -1
- package/message.interface.d.ts +1 -0
- package/message.interface.js.map +1 -1
- package/package.json +1 -1
- package/request.decorator.cjs +2 -2
- package/request.decorator.js +2 -2
- package/request.decorator.js.map +1 -1
- package/selectors.cjs +4 -2
- package/selectors.d.ts +3 -1
- package/selectors.js +3 -1
- package/selectors.js.map +1 -1
- package/worker/initializer.cjs +39 -0
- package/worker/initializer.d.ts +12 -0
- package/worker/initializer.js +38 -0
- package/worker/initializer.js.map +1 -0
- package/worker/message-client.cjs +14 -30
- package/worker/message-client.d.ts +19 -5
- package/worker/message-client.js +14 -30
- package/worker/message-client.js.map +1 -1
- package/worker/message-host.cjs +146 -24
- package/worker/message-host.d.ts +120 -3
- package/worker/message-host.js +146 -24
- package/worker/message-host.js.map +1 -1
- package/worker/message-service.cjs +111 -0
- package/worker/message-service.d.ts +110 -1
- package/worker/message-service.js +111 -0
- package/worker/message-service.js.map +1 -1
package/README.md
CHANGED
|
@@ -58,7 +58,7 @@ import { Observable } from 'rxjs';
|
|
|
58
58
|
class IframeClient extends IframeMessageClient {
|
|
59
59
|
@Request('greeting')
|
|
60
60
|
sayHello(name: string): Observable<string> {
|
|
61
|
-
return null
|
|
61
|
+
return null!; // Implementation handled by decorator
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
@@ -121,7 +121,7 @@ class IframeBidirectional extends IframeMessageService {
|
|
|
121
121
|
// Send messages
|
|
122
122
|
@Request('getData')
|
|
123
123
|
requestData(): Observable<any> {
|
|
124
|
-
return null
|
|
124
|
+
return null!;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
// Receive messages
|
|
@@ -158,12 +158,12 @@ import { Observable } from 'rxjs';
|
|
|
158
158
|
class ContentScript extends ChromeMessageClient {
|
|
159
159
|
@Request('fetchData')
|
|
160
160
|
getData(query: string): Observable<any> {
|
|
161
|
-
return null
|
|
161
|
+
return null!;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
@Request('saveSettings')
|
|
165
165
|
saveSettings(settings: object): Observable<boolean> {
|
|
166
|
-
return null
|
|
166
|
+
return null!;
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -212,7 +212,7 @@ import { of, Observable } from 'rxjs';
|
|
|
212
212
|
class MainThread extends WorkerMessageService {
|
|
213
213
|
@Request('processData')
|
|
214
214
|
sendDataToWorker(data: number[]): Observable<number> {
|
|
215
|
-
return null
|
|
215
|
+
return null!;
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
@Listen('progress')
|
|
@@ -304,7 +304,7 @@ class WorkerThread extends WorkerMessageService {
|
|
|
304
304
|
|
|
305
305
|
@Request('progress')
|
|
306
306
|
reportProgress(percent: number): Observable<void> {
|
|
307
|
-
return null
|
|
307
|
+
return null!;
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
|
|
@@ -327,7 +327,7 @@ import { of, Observable } from 'rxjs';
|
|
|
327
327
|
class Tab1 extends BroadcastMessageService {
|
|
328
328
|
@Request('sync')
|
|
329
329
|
requestSync(data: any): Observable<string> {
|
|
330
|
-
return null
|
|
330
|
+
return null!;
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
@Listen('notification')
|
|
@@ -359,7 +359,7 @@ class Tab2 extends BroadcastMessageService {
|
|
|
359
359
|
|
|
360
360
|
@Request('notification')
|
|
361
361
|
sendNotification(message: string): Observable<void> {
|
|
362
|
-
return null
|
|
362
|
+
return null!;
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
|
|
@@ -533,6 +533,52 @@ const client = new ChromeMessageClient('extension-port');
|
|
|
533
533
|
- TypeScript 4.x or higher (for decorator support)
|
|
534
534
|
- Modern browser with ES2015+ support
|
|
535
535
|
|
|
536
|
+
## Development
|
|
537
|
+
|
|
538
|
+
### Testing
|
|
539
|
+
|
|
540
|
+
Hermes uses platform-specific test configurations to ensure proper testing across different environments:
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
# Run all tests (unit + browser in parallel)
|
|
544
|
+
pnpm nx test hermes
|
|
545
|
+
|
|
546
|
+
# Run specific platform tests
|
|
547
|
+
pnpm nx test:unit hermes # Core functionality (Node.js)
|
|
548
|
+
pnpm nx test:browser hermes # Web Worker tests (Chromium)
|
|
549
|
+
pnpm nx test:chrome hermes # Chrome extension tests
|
|
550
|
+
pnpm nx test:node hermes # Child process tests
|
|
551
|
+
|
|
552
|
+
# Debug browser tests with visible browser
|
|
553
|
+
pnpm nx test:browser:headed hermes
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
For detailed testing documentation, see:
|
|
557
|
+
- [TESTING-GUIDE.md](./docs/TESTING-GUIDE.md) - Comprehensive testing guide
|
|
558
|
+
- [TEST-COMMANDS.md](./docs/TEST-COMMANDS.md) - Quick command reference
|
|
559
|
+
- [TESTING-SETUP-SUMMARY.md](./docs/TESTING-SETUP-SUMMARY.md) - Setup overview
|
|
560
|
+
|
|
561
|
+
### Building
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
# Build the library
|
|
565
|
+
pnpm nx build hermes
|
|
566
|
+
|
|
567
|
+
# Build and watch for changes
|
|
568
|
+
pnpm nx build hermes --watch
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### Contributing
|
|
572
|
+
|
|
573
|
+
When adding new platform support:
|
|
574
|
+
|
|
575
|
+
1. Create platform-specific tests: `*.{platform}.spec.ts`
|
|
576
|
+
2. Add configuration: `vitest.{platform}.config.ts`
|
|
577
|
+
3. Add setup file: `setup-{platform}-test.ts`
|
|
578
|
+
4. Update test targets in `project.json`
|
|
579
|
+
|
|
580
|
+
See [TESTING-GUIDE.md](./TESTING-GUIDE.md) for details on adding new platforms.
|
|
581
|
+
|
|
536
582
|
## License
|
|
537
583
|
|
|
538
584
|
MIT © [Thalesrc](https://github.com/thalesrc)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/broadcast/message-client.ts"],"names":[],"mappings":"AAAA,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,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IAC7C,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,EAAmB,CAAC;IAExD,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;IAC3D,CAAC;IAES,CAAC,IAAI,CAAC,CAAI,OAAmB;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ,GAAG,CAAC,KAAoC,EAAE,EAAE;QAClD,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/broadcast/message-client.ts"],"names":[],"mappings":"AAAA,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,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IAC7C,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,EAAmB,CAAC;IAExD,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;IAC3D,CAAC;IAES,CAAC,IAAI,CAAC,CAAI,OAAmB;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ,GAAG,CAAC,KAAoC,EAAE,EAAE;QAClD,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IAEQ,CAAC,UAAU,CAAC;QACpB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;CACF","file":"message-client.js","sourcesContent":["import { Subject } from \"rxjs\";\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_CHANNEL_NAME } from \"./default-channel-name\";\n\ninterface MessageEvent<T> {\n data: T;\n}\n\nexport class BroadcastMessageClient extends MessageClient {\n protected [RESPONSES$] = new Subject<MessageResponse>();\n\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 }\n\n protected [SEND]<T>(message: Message<T>) {\n this.#channel.postMessage(message);\n }\n\n #handler = (event: MessageEvent<MessageResponse>) => {\n this[RESPONSES$].next(event.data);\n };\n\n protected [GET_NEW_ID](): string {\n return crypto.randomUUID();\n }\n}"]}
|
|
@@ -4,6 +4,7 @@ exports.BroadcastMessageHost = void 0;
|
|
|
4
4
|
const rxjs_1 = require("rxjs");
|
|
5
5
|
const message_host_1 = require("../message-host");
|
|
6
6
|
const default_channel_name_1 = require("./default-channel-name");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
7
8
|
class BroadcastMessageHost extends message_host_1.MessageHost {
|
|
8
9
|
#requests$ = new rxjs_1.Subject();
|
|
9
10
|
#channel;
|
|
@@ -11,9 +12,9 @@ class BroadcastMessageHost extends message_host_1.MessageHost {
|
|
|
11
12
|
super();
|
|
12
13
|
this.#channel = new BroadcastChannel(channelName);
|
|
13
14
|
this.#channel.addEventListener('message', this.#handler);
|
|
14
|
-
this.
|
|
15
|
+
this[selectors_1.LISTEN](this.#requests$);
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
[selectors_1.RESPONSE](message) {
|
|
17
18
|
this.#channel.postMessage(message);
|
|
18
19
|
}
|
|
19
20
|
terminate() {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MessageHost } from "../message-host";
|
|
2
2
|
import { MessageResponse } from "../message-response.type";
|
|
3
|
+
import { RESPONSE } from "../selectors";
|
|
3
4
|
export declare class BroadcastMessageHost extends MessageHost {
|
|
4
5
|
#private;
|
|
5
6
|
constructor(channelName?: string);
|
|
6
|
-
protected
|
|
7
|
+
protected [RESPONSE](message: MessageResponse): void;
|
|
7
8
|
terminate(): void;
|
|
8
9
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Subject } from "rxjs";
|
|
2
2
|
import { MessageHost } from "../message-host";
|
|
3
3
|
import { DEFAULT_CHANNEL_NAME } from "./default-channel-name";
|
|
4
|
+
import { LISTEN, RESPONSE } from "../selectors";
|
|
4
5
|
export class BroadcastMessageHost extends MessageHost {
|
|
5
6
|
#requests$ = new Subject();
|
|
6
7
|
#channel;
|
|
@@ -8,9 +9,9 @@ export class BroadcastMessageHost extends MessageHost {
|
|
|
8
9
|
super();
|
|
9
10
|
this.#channel = new BroadcastChannel(channelName);
|
|
10
11
|
this.#channel.addEventListener('message', this.#handler);
|
|
11
|
-
this
|
|
12
|
+
this[LISTEN](this.#requests$);
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
[RESPONSE](message) {
|
|
14
15
|
this.#channel.postMessage(message);
|
|
15
16
|
}
|
|
16
17
|
terminate() {
|
|
@@ -1 +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;
|
|
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,CAAC;CACH","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"]}
|
|
@@ -32,7 +32,7 @@ class ChromeMessageClient extends message_client_1.MessageClient {
|
|
|
32
32
|
}
|
|
33
33
|
[selectors_1.GET_NEW_ID]() {
|
|
34
34
|
let result = '' + Date.now();
|
|
35
|
-
for (
|
|
35
|
+
for (let i = 0; i < 10; i++) {
|
|
36
36
|
result += RANDOM_ID_CHARS.charAt(Math.floor(Math.random() * RANDOM_ID_CHARS_LENGTH));
|
|
37
37
|
}
|
|
38
38
|
return result;
|
package/chrome/message-client.js
CHANGED
|
@@ -29,7 +29,7 @@ export class ChromeMessageClient extends MessageClient {
|
|
|
29
29
|
}
|
|
30
30
|
[GET_NEW_ID]() {
|
|
31
31
|
let result = '' + Date.now();
|
|
32
|
-
for (
|
|
32
|
+
for (let i = 0; i < 10; i++) {
|
|
33
33
|
result += RANDOM_ID_CHARS.charAt(Math.floor(Math.random() * RANDOM_ID_CHARS_LENGTH));
|
|
34
34
|
}
|
|
35
35
|
return result;
|
|
@@ -1 +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 (
|
|
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 (let 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"]}
|
package/chrome/message-host.cjs
CHANGED
|
@@ -4,6 +4,7 @@ exports.ChromeMessageHost = void 0;
|
|
|
4
4
|
const rxjs_1 = require("rxjs");
|
|
5
5
|
const message_host_1 = require("../message-host");
|
|
6
6
|
const default_connection_name_1 = require("./default-connection-name");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
7
8
|
class ChromeMessageHost extends message_host_1.MessageHost {
|
|
8
9
|
static PORT_IDENTIFIER = 'portIdentifier';
|
|
9
10
|
#ports = {};
|
|
@@ -19,7 +20,7 @@ class ChromeMessageHost extends message_host_1.MessageHost {
|
|
|
19
20
|
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
20
21
|
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
21
22
|
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
22
|
-
this.
|
|
23
|
+
this[selectors_1.TERMINATE_MESSAGE$].next(message.id);
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
const newMessage = {
|
|
@@ -29,9 +30,9 @@ class ChromeMessageHost extends message_host_1.MessageHost {
|
|
|
29
30
|
this.#requests.next(newMessage);
|
|
30
31
|
});
|
|
31
32
|
});
|
|
32
|
-
this.
|
|
33
|
+
this[selectors_1.LISTEN](this.#requests);
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
[selectors_1.RESPONSE](message) {
|
|
35
36
|
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
36
37
|
message.id = messageId;
|
|
37
38
|
if (this.#ports[portId]) {
|
package/chrome/message-host.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MessageHost } from '../message-host';
|
|
2
2
|
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
3
|
+
import { RESPONSE } from '../selectors';
|
|
3
4
|
export declare class ChromeMessageHost extends MessageHost {
|
|
4
5
|
#private;
|
|
5
6
|
private static readonly PORT_IDENTIFIER;
|
|
6
7
|
constructor(name?: string);
|
|
7
|
-
protected
|
|
8
|
+
protected [RESPONSE](message: SuccessfulMessageResponse): void;
|
|
8
9
|
}
|
package/chrome/message-host.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Subject } from 'rxjs';
|
|
2
2
|
import { MessageHost } from '../message-host';
|
|
3
3
|
import { DEFAULT_CONNECTION_NAME } from './default-connection-name';
|
|
4
|
+
import { LISTEN, RESPONSE, TERMINATE_MESSAGE$ } from '../selectors';
|
|
4
5
|
export class ChromeMessageHost extends MessageHost {
|
|
5
6
|
static PORT_IDENTIFIER = 'portIdentifier';
|
|
6
7
|
#ports = {};
|
|
@@ -16,7 +17,7 @@ export class ChromeMessageHost extends MessageHost {
|
|
|
16
17
|
this.#ports[incomingMessagePort.sender.tab.id] = incomingMessagePort;
|
|
17
18
|
incomingMessagePort.onDisconnect.addListener(disconnectedPort => {
|
|
18
19
|
delete this.#ports[disconnectedPort.sender.tab.id];
|
|
19
|
-
this.
|
|
20
|
+
this[TERMINATE_MESSAGE$].next(message.id);
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
const newMessage = {
|
|
@@ -26,9 +27,9 @@ export class ChromeMessageHost extends MessageHost {
|
|
|
26
27
|
this.#requests.next(newMessage);
|
|
27
28
|
});
|
|
28
29
|
});
|
|
29
|
-
this
|
|
30
|
+
this[LISTEN](this.#requests);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
[RESPONSE](message) {
|
|
32
33
|
const [messageId, portId] = message.id.split(`&${ChromeMessageHost.PORT_IDENTIFIER}=`);
|
|
33
34
|
message.id = messageId;
|
|
34
35
|
if (this.#ports[portId]) {
|
|
@@ -1 +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,
|
|
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"]}
|
|
@@ -1 +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,
|
|
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,EAAE,IAAI,EAAE,MAAM,EAA2C,EAAE,EAAE;YAC/F,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,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAE7F,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"]}
|
package/iframe/message-host.cjs
CHANGED
|
@@ -7,6 +7,7 @@ const message_host_1 = require("../message-host");
|
|
|
7
7
|
const channel_path_splitter_1 = require("./channel-path-splitter");
|
|
8
8
|
const default_channel_name_1 = require("./default-channel-name");
|
|
9
9
|
const source_id_splitter_1 = require("./source-id-splitter");
|
|
10
|
+
const selectors_1 = require("../selectors");
|
|
10
11
|
class IframeMessageHost extends message_host_1.MessageHost {
|
|
11
12
|
channelName;
|
|
12
13
|
#requests = new rxjs_1.Subject();
|
|
@@ -22,12 +23,12 @@ class IframeMessageHost extends message_host_1.MessageHost {
|
|
|
22
23
|
this.channelName = channelName;
|
|
23
24
|
this.#_targetFrame = targetFrame;
|
|
24
25
|
window.addEventListener('message', this.#handler);
|
|
25
|
-
this.
|
|
26
|
+
this[selectors_1.LISTEN](this.#requests);
|
|
26
27
|
}
|
|
27
28
|
terminate() {
|
|
28
29
|
window.removeEventListener('message', this.#handler);
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
+
[selectors_1.RESPONSE](message) {
|
|
31
32
|
const [sourceId, messageId] = message.id.split(source_id_splitter_1.SOURCE_ID_SPLITTER);
|
|
32
33
|
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
33
34
|
message = {
|
package/iframe/message-host.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { MessageHost } from '../message-host';
|
|
2
2
|
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
3
3
|
import { IFrame } from './iframe.type';
|
|
4
|
+
import { RESPONSE } from '../selectors';
|
|
4
5
|
export declare class IframeMessageHost extends MessageHost {
|
|
5
6
|
#private;
|
|
6
7
|
private channelName;
|
|
7
8
|
constructor(channelName?: string, targetFrame?: IFrame);
|
|
8
9
|
terminate(): void;
|
|
9
|
-
protected
|
|
10
|
+
protected [RESPONSE](message: SuccessfulMessageResponse): void;
|
|
10
11
|
}
|
package/iframe/message-host.js
CHANGED
|
@@ -4,6 +4,7 @@ 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
|
+
import { LISTEN, RESPONSE } from '../selectors';
|
|
7
8
|
export class IframeMessageHost extends MessageHost {
|
|
8
9
|
channelName;
|
|
9
10
|
#requests = new Subject();
|
|
@@ -19,12 +20,12 @@ export class IframeMessageHost extends MessageHost {
|
|
|
19
20
|
this.channelName = channelName;
|
|
20
21
|
this.#_targetFrame = targetFrame;
|
|
21
22
|
window.addEventListener('message', this.#handler);
|
|
22
|
-
this
|
|
23
|
+
this[LISTEN](this.#requests);
|
|
23
24
|
}
|
|
24
25
|
terminate() {
|
|
25
26
|
window.removeEventListener('message', this.#handler);
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
[RESPONSE](message) {
|
|
28
29
|
const [sourceId, messageId] = message.id.split(SOURCE_ID_SPLITTER);
|
|
29
30
|
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
30
31
|
message = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/iframe/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
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';\nimport { LISTEN, RESPONSE } from '../selectors';\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"]}
|
package/message-host.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MessageHost = void 0;
|
|
4
|
-
const js_utils_1 = require("@thalesrc/js-utils");
|
|
5
4
|
const rxjs_1 = require("rxjs");
|
|
6
5
|
const operators_1 = require("rxjs/operators");
|
|
7
6
|
const selectors_1 = require("./selectors");
|
|
@@ -14,20 +13,26 @@ class MessageHost {
|
|
|
14
13
|
*
|
|
15
14
|
* Use `next(messageId)` method to terminate a message connection
|
|
16
15
|
*/
|
|
17
|
-
|
|
16
|
+
[selectors_1.TERMINATE_MESSAGE$] = new rxjs_1.Subject();
|
|
18
17
|
/**
|
|
19
18
|
* Run this method to start listening the requests
|
|
20
19
|
*/
|
|
21
|
-
|
|
20
|
+
[selectors_1.LISTEN] = (messages$) => {
|
|
22
21
|
for (const [path, listeners] of this.#getListeners()) {
|
|
23
22
|
messages$
|
|
24
23
|
.pipe((0, operators_1.filter)(({ path: messagePath }) => path === messagePath))
|
|
25
24
|
.subscribe(({ body, id }) => {
|
|
26
25
|
for (const listener of listeners) {
|
|
27
|
-
listener.call(this, body).pipe((0, operators_1.takeUntil)(this.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
listener.call(this, body).pipe((0, operators_1.takeUntil)(this[selectors_1.TERMINATE_MESSAGE$].pipe((0, operators_1.filter)(terminatedMessageId => terminatedMessageId === id)))).subscribe({
|
|
27
|
+
next: result => {
|
|
28
|
+
this[selectors_1.RESPONSE]({ completed: false, id, body: result });
|
|
29
|
+
},
|
|
30
|
+
error: error => {
|
|
31
|
+
this[selectors_1.RESPONSE]({ completed: true, id, error });
|
|
32
|
+
},
|
|
33
|
+
complete: () => {
|
|
34
|
+
this[selectors_1.RESPONSE]({ completed: true, id });
|
|
35
|
+
}
|
|
31
36
|
});
|
|
32
37
|
}
|
|
33
38
|
});
|
package/message-host.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Observable, Subject } from 'rxjs';
|
|
2
2
|
import { SuccessfulMessageResponse } from './message-response.type';
|
|
3
3
|
import { Message } from './message.interface';
|
|
4
|
+
import { LISTEN, RESPONSE, TERMINATE_MESSAGE$ } from './selectors';
|
|
4
5
|
/**
|
|
5
6
|
* Message Host
|
|
6
7
|
*/
|
|
@@ -11,15 +12,15 @@ export declare abstract class MessageHost {
|
|
|
11
12
|
*
|
|
12
13
|
* Use `next(messageId)` method to terminate a message connection
|
|
13
14
|
*/
|
|
14
|
-
protected readonly
|
|
15
|
+
protected readonly [TERMINATE_MESSAGE$]: Subject<string>;
|
|
15
16
|
/**
|
|
16
17
|
* Run this method to start listening the requests
|
|
17
18
|
*/
|
|
18
|
-
protected readonly
|
|
19
|
+
protected readonly [LISTEN]: (messages$: Observable<Message>) => void;
|
|
19
20
|
/**
|
|
20
21
|
* Build a reponse method to send the responses to the requests by using the communication methods of the platform
|
|
21
22
|
*
|
|
22
23
|
* @param message Incoming response message
|
|
23
24
|
*/
|
|
24
|
-
protected abstract
|
|
25
|
+
protected abstract [RESPONSE]<T = any>(message: SuccessfulMessageResponse<T>): void;
|
|
25
26
|
}
|
package/message-host.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { noop } from '@thalesrc/js-utils';
|
|
2
1
|
import { Subject } from 'rxjs';
|
|
3
2
|
import { filter, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { MESSAGE_LISTENERS } from './selectors';
|
|
3
|
+
import { LISTEN, MESSAGE_LISTENERS, RESPONSE, TERMINATE_MESSAGE$ } from './selectors';
|
|
5
4
|
/**
|
|
6
5
|
* Message Host
|
|
7
6
|
*/
|
|
@@ -11,20 +10,26 @@ export class MessageHost {
|
|
|
11
10
|
*
|
|
12
11
|
* Use `next(messageId)` method to terminate a message connection
|
|
13
12
|
*/
|
|
14
|
-
|
|
13
|
+
[TERMINATE_MESSAGE$] = new Subject();
|
|
15
14
|
/**
|
|
16
15
|
* Run this method to start listening the requests
|
|
17
16
|
*/
|
|
18
|
-
|
|
17
|
+
[LISTEN] = (messages$) => {
|
|
19
18
|
for (const [path, listeners] of this.#getListeners()) {
|
|
20
19
|
messages$
|
|
21
20
|
.pipe(filter(({ path: messagePath }) => path === messagePath))
|
|
22
21
|
.subscribe(({ body, id }) => {
|
|
23
22
|
for (const listener of listeners) {
|
|
24
|
-
listener.call(this, body).pipe(takeUntil(this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
listener.call(this, body).pipe(takeUntil(this[TERMINATE_MESSAGE$].pipe(filter(terminatedMessageId => terminatedMessageId === id)))).subscribe({
|
|
24
|
+
next: result => {
|
|
25
|
+
this[RESPONSE]({ completed: false, id, body: result });
|
|
26
|
+
},
|
|
27
|
+
error: error => {
|
|
28
|
+
this[RESPONSE]({ completed: true, id, error });
|
|
29
|
+
},
|
|
30
|
+
complete: () => {
|
|
31
|
+
this[RESPONSE]({ completed: true, id });
|
|
32
|
+
}
|
|
28
33
|
});
|
|
29
34
|
}
|
|
30
35
|
});
|
package/message-host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKnD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,MAAM,OAAgB,WAAW;IAC/B;;;;OAIG;IACgB,CAAC,kBAAkB,CAAC,GAAG,IAAI,OAAO,EAAU,CAAC;IAEhE;;OAEG;IACgB,CAAC,MAAM,CAAC,GAAG,CAAC,SAA8B,EAAQ,EAAE;QACrE,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrD,SAAS;iBACN,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;iBAC7D,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;gBAC1B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAqB,CAAC,IAAI,CACjD,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC,CAAC,CACpG,CAAC,SAAS,CAAC;wBACV,IAAI,EAAE,MAAM,CAAC,EAAE;4BACb,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;wBACzD,CAAC;wBACD,KAAK,EAAE,KAAK,CAAC,EAAE;4BACb,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;wBACjD,CAAC;wBACD,QAAQ,EAAE,GAAG,EAAE;4BACb,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC1C,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IASF;;OAEG;IACH,aAAa;QACX,MAAM,GAAG,GAAoB,IAAI,GAAG,EAAE,CAAC;QACvC,IAAI,YAAY,GAAI,IAAY,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAEnD,OAAO,YAAY,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAoB,EAAE,CAAC;oBAC7F,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAED,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC;QACxC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF","file":"message-host.js","sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\n\nimport { ListenerStorage } from './listener-storage.type';\nimport { SuccessfulMessageResponse } from './message-response.type';\nimport { Message } from './message.interface';\nimport { LISTEN, MESSAGE_LISTENERS, RESPONSE, TERMINATE_MESSAGE$ } from './selectors';\n\n/**\n * Message Host\n */\nexport abstract class MessageHost {\n /**\n * Message Terminator Subject\n *\n * Use `next(messageId)` method to terminate a message connection\n */\n protected readonly [TERMINATE_MESSAGE$] = new Subject<string>();\n\n /**\n * Run this method to start listening the requests\n */\n protected readonly [LISTEN] = (messages$: Observable<Message>): void => {\n for (const [path, listeners] of this.#getListeners()) {\n messages$\n .pipe(filter(({ path: messagePath }) => path === messagePath))\n .subscribe(({ body, id }) => {\n for (const listener of listeners) {\n (listener.call(this, body) as Observable<any>).pipe(\n takeUntil(this[TERMINATE_MESSAGE$].pipe(filter(terminatedMessageId => terminatedMessageId === id))),\n ).subscribe({\n next: result => {\n this[RESPONSE]({ completed: false, id, body: result });\n },\n error: error => {\n this[RESPONSE]({ completed: true, id, error });\n },\n complete: () => {\n this[RESPONSE]({ completed: true, id });\n }\n });\n }\n });\n }\n };\n\n /**\n * Build a reponse method to send the responses to the requests by using the communication methods of the platform\n *\n * @param message Incoming response message\n */\n protected abstract [RESPONSE]<T = any>(message: SuccessfulMessageResponse<T>): void;\n\n /**\n * All inherited listeners\n */\n #getListeners(): ListenerStorage {\n const map: ListenerStorage = new Map();\n let currentProto = (this as any)['__proto__' + ''];\n\n while (currentProto.constructor !== Object) {\n if (Reflect.ownKeys(currentProto.constructor).includes(MESSAGE_LISTENERS)) {\n for (const [key, handlers] of currentProto.constructor[MESSAGE_LISTENERS] as ListenerStorage) {\n map.set(key, [...(map.get(key) || []), ...handlers]);\n }\n }\n\n currentProto = currentProto.__proto__;\n }\n\n return map;\n }\n}\n"]}
|
|
@@ -8,6 +8,8 @@ type CompletedMessageResponse = Omit<Message, 'body' | 'path'> & {
|
|
|
8
8
|
};
|
|
9
9
|
export type ErrorMessageResponse = {
|
|
10
10
|
error: any;
|
|
11
|
+
id: string;
|
|
12
|
+
completed: true;
|
|
11
13
|
};
|
|
12
14
|
export type SuccessfulMessageResponse<T = any> = UncompletedMessageResponse<T> | CompletedMessageResponse;
|
|
13
15
|
export type MessageResponse<T = any> = SuccessfulMessageResponse<T> | ErrorMessageResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/message-response.type.ts"],"names":[],"mappings":"","file":"message-response.type.js","sourcesContent":["import { Message } from './message.interface';\n\ntype Omit<ObjectType, KeysType extends keyof ObjectType> = Pick<ObjectType, Exclude<keyof ObjectType, KeysType>>;\n\nexport type UncompletedMessageResponse<T = any> = Omit<Message<T>, 'path'> & { completed: false; };\ntype CompletedMessageResponse = Omit<Message, 'body' | 'path'> & { completed: true; };\n\nexport type ErrorMessageResponse = {error: any};\nexport type SuccessfulMessageResponse<T = any> = UncompletedMessageResponse<T> | CompletedMessageResponse;\n\nexport type MessageResponse<T = any> = SuccessfulMessageResponse<T> | ErrorMessageResponse;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/message-response.type.ts"],"names":[],"mappings":"","file":"message-response.type.js","sourcesContent":["import { Message } from './message.interface';\n\ntype Omit<ObjectType, KeysType extends keyof ObjectType> = Pick<ObjectType, Exclude<keyof ObjectType, KeysType>>;\n\nexport type UncompletedMessageResponse<T = any> = Omit<Message<T>, 'path'> & { completed: false; };\ntype CompletedMessageResponse = Omit<Message, 'body' | 'path'> & { completed: true; };\n\nexport type ErrorMessageResponse = {error: any; id: string; completed: true; };\nexport type SuccessfulMessageResponse<T = any> = UncompletedMessageResponse<T> | CompletedMessageResponse;\n\nexport type MessageResponse<T = any> = SuccessfulMessageResponse<T> | ErrorMessageResponse;\n"]}
|
package/message.interface.d.ts
CHANGED
package/message.interface.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/message.interface.ts"],"names":[],"mappings":"","file":"message.interface.js","sourcesContent":["export interface Message<T = any> {\n path: string;\n body: T;\n id: string;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/message.interface.ts"],"names":[],"mappings":"","file":"message.interface.js","sourcesContent":["export interface Message<T = any> {\n path: string;\n body: T;\n id: string;\n error?: any;\n}\n"]}
|