@thalesrc/hermes 7.4.7 → 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.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/iframe/message-client.js.map +1 -1
- package/iframe/message-host.js.map +1 -1
- package/message-host.js.map +1 -1
- package/message-response.type.d.ts +2 -0
- package/message-response.type.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/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 +147 -23
- package/worker/message-host.d.ts +123 -1
- package/worker/message-host.js +147 -23
- 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}"]}
|
|
@@ -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;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,
|
|
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"]}
|
|
@@ -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"]}
|
|
@@ -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;AAE1D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAYtC;IAXV,SAAS,GAAG,IAAI,OAAO,EAAW,CAAC;IACnC,QAAQ,GAAwC,EAAE,CAAC;IACnD,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,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAEM,SAAS;QACd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAES,CAAC,QAAQ,CAAC,CAAC,OAAkC;QACrD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAE,CAAC;QAEpE,OAAO,GAAG;YACR,GAAG,OAAO;YACV,EAAE,EAAE,SAAS;SACd,CAAC;QAED,MAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,GAAG,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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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/package.json
CHANGED
package/request.decorator.cjs
CHANGED
|
@@ -8,12 +8,12 @@ function Request(path) {
|
|
|
8
8
|
descriptor.value = function (message) {
|
|
9
9
|
const messageId = this[selectors_1.GET_NEW_ID]();
|
|
10
10
|
this[selectors_1.SEND]({ body: message, id: messageId, path });
|
|
11
|
-
return this[selectors_1.RESPONSES$].pipe((0, operators_1.map)((data) => {
|
|
11
|
+
return this[selectors_1.RESPONSES$].pipe((0, operators_1.filter)(({ id }) => id === messageId), (0, operators_1.map)((data) => {
|
|
12
12
|
const { error } = data;
|
|
13
13
|
if (error)
|
|
14
14
|
throw error;
|
|
15
15
|
return data;
|
|
16
|
-
}), (0, operators_1.
|
|
16
|
+
}), (0, operators_1.takeWhile)((res) => !res.completed), (0, operators_1.map)(({ body }) => body));
|
|
17
17
|
};
|
|
18
18
|
return descriptor;
|
|
19
19
|
};
|
package/request.decorator.js
CHANGED
|
@@ -5,12 +5,12 @@ export function Request(path) {
|
|
|
5
5
|
descriptor.value = function (message) {
|
|
6
6
|
const messageId = this[GET_NEW_ID]();
|
|
7
7
|
this[SEND]({ body: message, id: messageId, path });
|
|
8
|
-
return this[RESPONSES$].pipe(map((data) => {
|
|
8
|
+
return this[RESPONSES$].pipe(filter(({ id }) => id === messageId), map((data) => {
|
|
9
9
|
const { error } = data;
|
|
10
10
|
if (error)
|
|
11
11
|
throw error;
|
|
12
12
|
return data;
|
|
13
|
-
}),
|
|
13
|
+
}), takeWhile((res) => !res.completed), map(({ body }) => body));
|
|
14
14
|
};
|
|
15
15
|
return descriptor;
|
|
16
16
|
};
|
package/request.decorator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../libs/hermes/src/request.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,UAAS,MAAM,EAAE,GAAG,EAAE,UAAwC;QACnE,UAAU,CAAC,KAAK,GAAG,UAA8B,OAAY;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/request.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,UAAS,MAAM,EAAE,GAAG,EAAE,UAAwC;QACnE,UAAU,CAAC,KAAK,GAAG,UAA8B,OAAY;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEnD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAC1B,MAAM,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,EAClC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACX,MAAM,EAAE,KAAK,EAAE,GAAG,IAA4B,CAAC;gBAE/C,IAAI,KAAK;oBAAE,MAAM,KAAK,CAAC;gBAEvB,OAAO,IAAiC,CAAC;YAC3C,CAAC,CAAC,EACF,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAClC,GAAG,CAAC,CAAC,EAAE,IAAI,EAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,CACpD,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","file":"request.decorator.js","sourcesContent":["import { filter, map, takeWhile } from 'rxjs/operators';\n\nimport { MessageClient } from './message-client';\nimport { GET_NEW_ID, RESPONSES$, SEND } from './selectors';\nimport { ErrorMessageResponse, SuccessfulMessageResponse, UncompletedMessageResponse } from './message-response.type';\n\nexport function Request(path: string): MethodDecorator {\n return function(target, key, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {\n descriptor.value = function(this: MessageClient, message: any) {\n const messageId = this[GET_NEW_ID]();\n\n this[SEND]({ body: message, id: messageId, path });\n\n return this[RESPONSES$].pipe(\n filter(({id}) => id === messageId),\n map((data) => {\n const { error } = data as ErrorMessageResponse;\n\n if (error) throw error;\n\n return data as SuccessfulMessageResponse;\n }),\n takeWhile((res) => !res.completed),\n map(({ body }: UncompletedMessageResponse) => body),\n );\n };\n\n return descriptor;\n };\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initializer = initializer;
|
|
4
|
+
const noop_1 = require("@thalesrc/js-utils/function/noop");
|
|
5
|
+
const promisify_1 = require("@thalesrc/js-utils/promise/promisify");
|
|
6
|
+
/**
|
|
7
|
+
* Initializes a Web Worker or the worker context for message communication.
|
|
8
|
+
* @param prevWorker The previous worker promise to deinitialize
|
|
9
|
+
* @param worker The new worker argument (Worker instance, promise, or factory function)
|
|
10
|
+
* @param handler The message event handler to attach
|
|
11
|
+
* @returns A promise resolving to the initialized Worker or undefined if in worker context
|
|
12
|
+
*/
|
|
13
|
+
function initializer(prevWorker, worker, handler) {
|
|
14
|
+
// Deinitialize previous worker if any
|
|
15
|
+
prevWorker.then(pw => {
|
|
16
|
+
if (pw) {
|
|
17
|
+
pw.removeEventListener('message', handler);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
removeEventListener('message', handler);
|
|
21
|
+
}
|
|
22
|
+
}).catch(noop_1.noop);
|
|
23
|
+
// Resolve worker parameter: execute function if provided, otherwise use value directly
|
|
24
|
+
const _worker = typeof worker === 'function' ? worker() : worker;
|
|
25
|
+
// Ensure worker is wrapped in a promise for consistent async handling
|
|
26
|
+
const newWorker = (0, promisify_1.promisify)(_worker);
|
|
27
|
+
// Set up message listener once worker is resolved
|
|
28
|
+
newWorker.then(worker => {
|
|
29
|
+
if (worker) {
|
|
30
|
+
// Main thread context: listen to specific worker
|
|
31
|
+
worker.addEventListener('message', handler);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Worker thread context: listen to messages from main thread
|
|
35
|
+
addEventListener('message', handler);
|
|
36
|
+
}
|
|
37
|
+
}).catch(noop_1.noop);
|
|
38
|
+
return newWorker;
|
|
39
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ClientWorkerType = Worker | undefined;
|
|
2
|
+
export type ClientWorkerPromise = Promise<ClientWorkerType>;
|
|
3
|
+
export type ClientWorkerFactory = () => ClientWorkerType | ClientWorkerPromise;
|
|
4
|
+
export type ClientWorkerArg = ClientWorkerType | ClientWorkerPromise | ClientWorkerFactory;
|
|
5
|
+
/**
|
|
6
|
+
* Initializes a Web Worker or the worker context for message communication.
|
|
7
|
+
* @param prevWorker The previous worker promise to deinitialize
|
|
8
|
+
* @param worker The new worker argument (Worker instance, promise, or factory function)
|
|
9
|
+
* @param handler The message event handler to attach
|
|
10
|
+
* @returns A promise resolving to the initialized Worker or undefined if in worker context
|
|
11
|
+
*/
|
|
12
|
+
export declare function initializer(prevWorker: ClientWorkerPromise, worker: ClientWorkerArg, handler: (event: MessageEvent) => void): Promise<Worker | undefined>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { noop } from "@thalesrc/js-utils/function/noop";
|
|
2
|
+
import { promisify } from "@thalesrc/js-utils/promise/promisify";
|
|
3
|
+
/**
|
|
4
|
+
* Initializes a Web Worker or the worker context for message communication.
|
|
5
|
+
* @param prevWorker The previous worker promise to deinitialize
|
|
6
|
+
* @param worker The new worker argument (Worker instance, promise, or factory function)
|
|
7
|
+
* @param handler The message event handler to attach
|
|
8
|
+
* @returns A promise resolving to the initialized Worker or undefined if in worker context
|
|
9
|
+
*/
|
|
10
|
+
export function initializer(prevWorker, worker, handler) {
|
|
11
|
+
// Deinitialize previous worker if any
|
|
12
|
+
prevWorker.then(pw => {
|
|
13
|
+
if (pw) {
|
|
14
|
+
pw.removeEventListener('message', handler);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
removeEventListener('message', handler);
|
|
18
|
+
}
|
|
19
|
+
}).catch(noop);
|
|
20
|
+
// Resolve worker parameter: execute function if provided, otherwise use value directly
|
|
21
|
+
const _worker = typeof worker === 'function' ? worker() : worker;
|
|
22
|
+
// Ensure worker is wrapped in a promise for consistent async handling
|
|
23
|
+
const newWorker = promisify(_worker);
|
|
24
|
+
// Set up message listener once worker is resolved
|
|
25
|
+
newWorker.then(worker => {
|
|
26
|
+
if (worker) {
|
|
27
|
+
// Main thread context: listen to specific worker
|
|
28
|
+
worker.addEventListener('message', handler);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Worker thread context: listen to messages from main thread
|
|
32
|
+
addEventListener('message', handler);
|
|
33
|
+
}
|
|
34
|
+
}).catch(noop);
|
|
35
|
+
return newWorker;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/hermes/src/worker/initializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAOjE;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,UAA+B,EAC/B,MAAuB,EACvB,OAAsC;IAEtC,sCAAsC;IACtC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QACnB,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEf,uFAAuF;IACvF,MAAM,OAAO,GAAuD,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACrH,sEAAsE;IACtE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAErC,kDAAkD;IAClD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACtB,IAAI,MAAM,EAAE,CAAC;YACX,iDAAiD;YACjD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,6DAA6D;YAC7D,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEf,OAAO,SAAS,CAAC;AACnB,CAAC","file":"initializer.js","sourcesContent":["import { noop } from \"@thalesrc/js-utils/function/noop\";\nimport { promisify } from \"@thalesrc/js-utils/promise/promisify\";\n\nexport type ClientWorkerType = Worker | undefined;\nexport type ClientWorkerPromise = Promise<ClientWorkerType>;\nexport type ClientWorkerFactory = () => ClientWorkerType | ClientWorkerPromise;\nexport type ClientWorkerArg = ClientWorkerType | ClientWorkerPromise | ClientWorkerFactory;\n\n/**\n * Initializes a Web Worker or the worker context for message communication.\n * @param prevWorker The previous worker promise to deinitialize\n * @param worker The new worker argument (Worker instance, promise, or factory function)\n * @param handler The message event handler to attach\n * @returns A promise resolving to the initialized Worker or undefined if in worker context\n */\nexport function initializer(\n prevWorker: ClientWorkerPromise,\n worker: ClientWorkerArg,\n handler: (event: MessageEvent) => void\n) {\n // Deinitialize previous worker if any\n prevWorker.then(pw => {\n if (pw) {\n pw.removeEventListener('message', handler);\n } else {\n removeEventListener('message', handler);\n }\n }).catch(noop);\n\n // Resolve worker parameter: execute function if provided, otherwise use value directly\n const _worker: ClientWorkerType | ClientWorkerPromise | undefined = typeof worker === 'function' ? worker() : worker;\n // Ensure worker is wrapped in a promise for consistent async handling\n const newWorker = promisify(_worker);\n\n // Set up message listener once worker is resolved\n newWorker.then(worker => {\n if (worker) {\n // Main thread context: listen to specific worker\n worker.addEventListener('message', handler);\n } else {\n // Worker thread context: listen to messages from main thread\n addEventListener('message', handler);\n }\n }).catch(noop);\n\n return newWorker;\n}\n"]}
|
|
@@ -3,10 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WorkerMessageClient = void 0;
|
|
4
4
|
const unique_id_1 = require("@thalesrc/js-utils/unique-id");
|
|
5
5
|
const noop_1 = require("@thalesrc/js-utils/function/noop");
|
|
6
|
-
const promisify_1 = require("@thalesrc/js-utils/promise/promisify");
|
|
7
6
|
const rxjs_1 = require("rxjs");
|
|
8
7
|
const message_client_1 = require("../message-client");
|
|
9
8
|
const selectors_1 = require("../selectors");
|
|
9
|
+
const initializer_1 = require("./initializer");
|
|
10
|
+
const WORKER = Symbol('Client Worker');
|
|
11
|
+
const HANDLER = Symbol('Client Message Handler');
|
|
12
|
+
const INSTANCE_ID = Symbol('Client Instance ID');
|
|
10
13
|
/**
|
|
11
14
|
* WorkerMessageClient
|
|
12
15
|
*
|
|
@@ -57,12 +60,12 @@ class WorkerMessageClient extends message_client_1.MessageClient {
|
|
|
57
60
|
* Promise resolving to the Worker instance or undefined if running in worker context
|
|
58
61
|
* @private
|
|
59
62
|
*/
|
|
60
|
-
|
|
63
|
+
[WORKER] = Promise.resolve(undefined);
|
|
61
64
|
/**
|
|
62
65
|
* Unique identifier for this client instance to prevent ID collisions
|
|
63
66
|
* @private
|
|
64
67
|
*/
|
|
65
|
-
|
|
68
|
+
[INSTANCE_ID] = '' + Math.floor(Math.random() * 10000);
|
|
66
69
|
/**
|
|
67
70
|
* Observable stream of message responses from the worker or main thread
|
|
68
71
|
*/
|
|
@@ -110,30 +113,11 @@ class WorkerMessageClient extends message_client_1.MessageClient {
|
|
|
110
113
|
* };
|
|
111
114
|
*/
|
|
112
115
|
initialize(worker) {
|
|
113
|
-
//
|
|
114
|
-
this
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
else {
|
|
119
|
-
removeEventListener('message', this.#handler);
|
|
120
|
-
}
|
|
121
|
-
}).catch(noop_1.noop);
|
|
122
|
-
// Resolve worker parameter: execute function if provided, otherwise use value directly
|
|
123
|
-
const _worker = typeof worker === 'function' ? worker() : worker;
|
|
124
|
-
// Ensure worker is wrapped in a promise for consistent async handling
|
|
125
|
-
this.#worker = (0, promisify_1.promisify)(_worker);
|
|
126
|
-
// Set up message listener once worker is resolved
|
|
127
|
-
this.#worker.then(worker => {
|
|
128
|
-
if (worker) {
|
|
129
|
-
// Main thread context: listen to specific worker
|
|
130
|
-
worker.addEventListener('message', this.#handler);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
// Worker thread context: listen to messages from main thread
|
|
134
|
-
addEventListener('message', this.#handler);
|
|
135
|
-
}
|
|
136
|
-
}).catch(noop_1.noop);
|
|
116
|
+
// Ensure WORKER is initialized if not already
|
|
117
|
+
if (!this[WORKER]) {
|
|
118
|
+
this[WORKER] = Promise.resolve(undefined);
|
|
119
|
+
}
|
|
120
|
+
this[WORKER] = (0, initializer_1.initializer)(this[WORKER], worker, this[HANDLER]);
|
|
137
121
|
}
|
|
138
122
|
/**
|
|
139
123
|
* Sends a message to the worker or main thread
|
|
@@ -143,7 +127,7 @@ class WorkerMessageClient extends message_client_1.MessageClient {
|
|
|
143
127
|
* @internal Used by @Request decorator
|
|
144
128
|
*/
|
|
145
129
|
[selectors_1.SEND](message) {
|
|
146
|
-
this
|
|
130
|
+
this[WORKER].then(worker => {
|
|
147
131
|
if (worker) {
|
|
148
132
|
// Main thread: send to worker
|
|
149
133
|
worker.postMessage(message);
|
|
@@ -158,7 +142,7 @@ class WorkerMessageClient extends message_client_1.MessageClient {
|
|
|
158
142
|
* Handles incoming messages and forwards them to the responses stream
|
|
159
143
|
* @private
|
|
160
144
|
*/
|
|
161
|
-
|
|
145
|
+
[HANDLER] = (event) => {
|
|
162
146
|
this[selectors_1.RESPONSES$].next(event.data);
|
|
163
147
|
};
|
|
164
148
|
/**
|
|
@@ -168,7 +152,7 @@ class WorkerMessageClient extends message_client_1.MessageClient {
|
|
|
168
152
|
* @internal Used by @Request decorator
|
|
169
153
|
*/
|
|
170
154
|
[selectors_1.GET_NEW_ID]() {
|
|
171
|
-
return (0, unique_id_1.uniqueId)('hermes-worker-message-' + this
|
|
155
|
+
return (0, unique_id_1.uniqueId)('hermes-worker-message-' + this[INSTANCE_ID]);
|
|
172
156
|
}
|
|
173
157
|
}
|
|
174
158
|
exports.WorkerMessageClient = WorkerMessageClient;
|
|
@@ -3,10 +3,10 @@ import { MessageClient } from "../message-client";
|
|
|
3
3
|
import { MessageResponse } from "../message-response.type";
|
|
4
4
|
import { Message } from "../message.interface";
|
|
5
5
|
import { GET_NEW_ID, RESPONSES$, SEND } from "../selectors";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import { ClientWorkerArg } from "./initializer";
|
|
7
|
+
declare const WORKER: unique symbol;
|
|
8
|
+
declare const HANDLER: unique symbol;
|
|
9
|
+
declare const INSTANCE_ID: unique symbol;
|
|
10
10
|
/**
|
|
11
11
|
* WorkerMessageClient
|
|
12
12
|
*
|
|
@@ -53,7 +53,16 @@ type ClientWorkerArg = ClientWorkerType | ClientWorkerPromise | ClientWorkerFact
|
|
|
53
53
|
* client.initialize(new Worker('./different-worker.js'));
|
|
54
54
|
*/
|
|
55
55
|
export declare class WorkerMessageClient extends MessageClient {
|
|
56
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Promise resolving to the Worker instance or undefined if running in worker context
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
private [WORKER];
|
|
61
|
+
/**
|
|
62
|
+
* Unique identifier for this client instance to prevent ID collisions
|
|
63
|
+
* @private
|
|
64
|
+
*/
|
|
65
|
+
private [INSTANCE_ID];
|
|
57
66
|
/**
|
|
58
67
|
* Observable stream of message responses from the worker or main thread
|
|
59
68
|
*/
|
|
@@ -106,6 +115,11 @@ export declare class WorkerMessageClient extends MessageClient {
|
|
|
106
115
|
* @internal Used by @Request decorator
|
|
107
116
|
*/
|
|
108
117
|
[SEND]<T>(message: Message<T>): void;
|
|
118
|
+
/**
|
|
119
|
+
* Handles incoming messages and forwards them to the responses stream
|
|
120
|
+
* @private
|
|
121
|
+
*/
|
|
122
|
+
private [HANDLER];
|
|
109
123
|
/**
|
|
110
124
|
* Generates a unique message ID for tracking request-response pairs
|
|
111
125
|
*
|