@thalesrc/hermes 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +538 -0
  3. package/broadcast/default-channel-name.cjs +4 -0
  4. package/broadcast/default-channel-name.d.ts +1 -0
  5. package/broadcast/default-channel-name.js +3 -0
  6. package/broadcast/default-channel-name.js.map +1 -0
  7. package/broadcast/index.cjs +13 -0
  8. package/broadcast/index.d.ts +5 -0
  9. package/broadcast/index.js +7 -0
  10. package/broadcast/index.js.map +1 -0
  11. package/broadcast/message-client.cjs +26 -0
  12. package/broadcast/message-client.d.ts +12 -0
  13. package/broadcast/message-client.js +24 -0
  14. package/broadcast/message-client.js.map +1 -0
  15. package/broadcast/message-host.cjs +28 -0
  16. package/broadcast/message-host.d.ts +9 -0
  17. package/broadcast/message-host.js +26 -0
  18. package/broadcast/message-host.js.map +1 -0
  19. package/broadcast/message-service.cjs +13 -0
  20. package/broadcast/message-service.d.ts +8 -0
  21. package/broadcast/message-service.js +11 -0
  22. package/broadcast/message-service.js.map +1 -0
  23. package/chrome/default-connection-name.cjs +4 -0
  24. package/chrome/default-connection-name.d.ts +1 -0
  25. package/chrome/default-connection-name.js +3 -0
  26. package/chrome/default-connection-name.js.map +1 -0
  27. package/chrome/index.cjs +11 -0
  28. package/chrome/index.d.ts +4 -0
  29. package/chrome/index.js +6 -0
  30. package/chrome/index.js.map +1 -0
  31. package/chrome/message-client.cjs +41 -0
  32. package/chrome/message-client.d.ts +15 -0
  33. package/chrome/message-client.js +39 -0
  34. package/chrome/message-client.js.map +1 -0
  35. package/chrome/message-host.cjs +43 -0
  36. package/chrome/message-host.d.ts +9 -0
  37. package/chrome/message-host.js +41 -0
  38. package/chrome/message-host.js.map +1 -0
  39. package/iframe/channel-path-splitter.cjs +4 -0
  40. package/iframe/channel-path-splitter.d.ts +1 -0
  41. package/iframe/channel-path-splitter.js +3 -0
  42. package/iframe/channel-path-splitter.js.map +1 -0
  43. package/iframe/default-channel-name.cjs +4 -0
  44. package/iframe/default-channel-name.d.ts +1 -0
  45. package/iframe/default-channel-name.js +3 -0
  46. package/iframe/default-channel-name.js.map +1 -0
  47. package/iframe/iframe.type.cjs +2 -0
  48. package/iframe/iframe.type.d.ts +1 -0
  49. package/iframe/iframe.type.js +3 -0
  50. package/iframe/iframe.type.js.map +1 -0
  51. package/iframe/index.cjs +13 -0
  52. package/iframe/index.d.ts +6 -0
  53. package/iframe/index.js +7 -0
  54. package/iframe/index.js.map +1 -0
  55. package/iframe/message-client.cjs +50 -0
  56. package/iframe/message-client.d.ts +14 -0
  57. package/iframe/message-client.js +48 -0
  58. package/iframe/message-client.js.map +1 -0
  59. package/iframe/message-host.cjs +63 -0
  60. package/iframe/message-host.d.ts +11 -0
  61. package/iframe/message-host.js +61 -0
  62. package/iframe/message-host.js.map +1 -0
  63. package/iframe/message-service.cjs +13 -0
  64. package/iframe/message-service.d.ts +9 -0
  65. package/iframe/message-service.js +11 -0
  66. package/iframe/message-service.js.map +1 -0
  67. package/iframe/source-id-splitter.cjs +4 -0
  68. package/iframe/source-id-splitter.d.ts +1 -0
  69. package/iframe/source-id-splitter.js +3 -0
  70. package/iframe/source-id-splitter.js.map +1 -0
  71. package/iframe/upcoming-message.cjs +2 -0
  72. package/iframe/upcoming-message.d.ts +4 -0
  73. package/iframe/upcoming-message.js +3 -0
  74. package/iframe/upcoming-message.js.map +1 -0
  75. package/index.cjs +13 -0
  76. package/index.d.ts +7 -0
  77. package/index.js +7 -0
  78. package/index.js.map +1 -0
  79. package/listen.decorator.cjs +20 -0
  80. package/listen.decorator.d.ts +6 -0
  81. package/listen.decorator.js +19 -0
  82. package/listen.decorator.js.map +1 -0
  83. package/listener-storage.type.cjs +2 -0
  84. package/listener-storage.type.d.ts +2 -0
  85. package/listener-storage.type.js +3 -0
  86. package/listener-storage.type.js.map +1 -0
  87. package/message-client.cjs +10 -0
  88. package/message-client.d.ts +23 -0
  89. package/message-client.js +8 -0
  90. package/message-client.js.map +1 -0
  91. package/message-host.cjs +58 -0
  92. package/message-host.d.ts +26 -0
  93. package/message-host.js +56 -0
  94. package/message-host.js.map +1 -0
  95. package/message-response.type.cjs +2 -0
  96. package/message-response.type.d.ts +14 -0
  97. package/message-response.type.js +3 -0
  98. package/message-response.type.js.map +1 -0
  99. package/message.interface.cjs +2 -0
  100. package/message.interface.d.ts +6 -0
  101. package/message.interface.js +3 -0
  102. package/message.interface.js.map +1 -0
  103. package/package.json +158 -0
  104. package/request.decorator.cjs +20 -0
  105. package/request.decorator.d.ts +1 -0
  106. package/request.decorator.js +19 -0
  107. package/request.decorator.js.map +1 -0
  108. package/selectors.cjs +10 -0
  109. package/selectors.d.ts +7 -0
  110. package/selectors.js +9 -0
  111. package/selectors.js.map +1 -0
  112. package/worker/index.cjs +13 -0
  113. package/worker/index.d.ts +5 -0
  114. package/worker/index.js +7 -0
  115. package/worker/index.js.map +1 -0
  116. package/worker/message-client.cjs +174 -0
  117. package/worker/message-client.d.ts +117 -0
  118. package/worker/message-client.js +172 -0
  119. package/worker/message-client.js.map +1 -0
  120. package/worker/message-host.cjs +41 -0
  121. package/worker/message-host.d.ts +9 -0
  122. package/worker/message-host.js +39 -0
  123. package/worker/message-host.js.map +1 -0
  124. package/worker/message-service.cjs +12 -0
  125. package/worker/message-service.d.ts +8 -0
  126. package/worker/message-service.js +10 -0
  127. package/worker/message-service.js.map +1 -0
package/package.json ADDED
@@ -0,0 +1,158 @@
1
+ {
2
+ "name": "@thalesrc/hermes",
3
+ "version": "0.0.0",
4
+ "description": "Javascript messaging library",
5
+ "keywords": [
6
+ "javascript",
7
+ "messaging",
8
+ "send",
9
+ "message",
10
+ "chrome",
11
+ "extension",
12
+ "extensions",
13
+ "nodejs",
14
+ "child",
15
+ "process",
16
+ "webworkers"
17
+ ],
18
+ "homepage": "https://github.com/thalesrc/thalesrc/tree/main/libs/hermes#readme",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/thalesrc/thalesrc.git",
22
+ "directory": "libs/hermes"
23
+ },
24
+ "dependencies": {
25
+ "@thalesrc/js-utils": "^3.4.0",
26
+ "rxjs": "^7.8.1",
27
+ "tslib": "^2.3.0"
28
+ },
29
+ "type": "module",
30
+ "module": "./index.js",
31
+ "main": "./index.cjs",
32
+ "typings": "./index.d.ts",
33
+ "bugs": "https://github.com/thalesrc/thalesrc/issues",
34
+ "license": "MIT",
35
+ "author": {
36
+ "name": "Ali Şahin Özçelik",
37
+ "email": "alisahinozcelik@gmail.com",
38
+ "url": "https://alisah.in"
39
+ },
40
+ "funding": {
41
+ "type": "patreon",
42
+ "url": "https://www.patreon.com/alisahin"
43
+ },
44
+ "exports": {
45
+ ".": {
46
+ "default": "./index.cjs",
47
+ "import": "./index.js",
48
+ "node": "./index.cjs",
49
+ "require": "./index.cjs",
50
+ "types": "./index.d.ts"
51
+ },
52
+ "./broadcast": {
53
+ "default": "./broadcast/index.cjs",
54
+ "import": "./broadcast/index.js",
55
+ "node": "./broadcast/index.cjs",
56
+ "require": "./broadcast/index.cjs",
57
+ "types": "./broadcast/index.d.ts"
58
+ },
59
+ "./broadcast/message-client": {
60
+ "default": "./broadcast/message-client.cjs",
61
+ "import": "./broadcast/message-client.js",
62
+ "node": "./broadcast/message-client.cjs",
63
+ "require": "./broadcast/message-client.cjs",
64
+ "types": "./broadcast/message-client.d.ts"
65
+ },
66
+ "./broadcast/message-host": {
67
+ "default": "./broadcast/message-host.cjs",
68
+ "import": "./broadcast/message-host.js",
69
+ "node": "./broadcast/message-host.cjs",
70
+ "require": "./broadcast/message-host.cjs",
71
+ "types": "./broadcast/message-host.d.ts"
72
+ },
73
+ "./broadcast/message-service": {
74
+ "default": "./broadcast/message-service.cjs",
75
+ "import": "./broadcast/message-service.js",
76
+ "node": "./broadcast/message-service.cjs",
77
+ "require": "./broadcast/message-service.cjs",
78
+ "types": "./broadcast/message-service.d.ts"
79
+ },
80
+ "./chrome": {
81
+ "default": "./chrome/index.cjs",
82
+ "import": "./chrome/index.js",
83
+ "node": "./chrome/index.cjs",
84
+ "require": "./chrome/index.cjs",
85
+ "types": "./chrome/index.d.ts"
86
+ },
87
+ "./chrome/message-client": {
88
+ "default": "./chrome/message-client.cjs",
89
+ "import": "./chrome/message-client.js",
90
+ "node": "./chrome/message-client.cjs",
91
+ "require": "./chrome/message-client.cjs",
92
+ "types": "./chrome/message-client.d.ts"
93
+ },
94
+ "./chrome/message-host": {
95
+ "default": "./chrome/message-host.cjs",
96
+ "import": "./chrome/message-host.js",
97
+ "node": "./chrome/message-host.cjs",
98
+ "require": "./chrome/message-host.cjs",
99
+ "types": "./chrome/message-host.d.ts"
100
+ },
101
+ "./iframe": {
102
+ "default": "./iframe/index.cjs",
103
+ "import": "./iframe/index.js",
104
+ "node": "./iframe/index.cjs",
105
+ "require": "./iframe/index.cjs",
106
+ "types": "./iframe/index.d.ts"
107
+ },
108
+ "./iframe/message-client": {
109
+ "default": "./iframe/message-client.cjs",
110
+ "import": "./iframe/message-client.js",
111
+ "node": "./iframe/message-client.cjs",
112
+ "require": "./iframe/message-client.cjs",
113
+ "types": "./iframe/message-client.d.ts"
114
+ },
115
+ "./iframe/message-host": {
116
+ "default": "./iframe/message-host.cjs",
117
+ "import": "./iframe/message-host.js",
118
+ "node": "./iframe/message-host.cjs",
119
+ "require": "./iframe/message-host.cjs",
120
+ "types": "./iframe/message-host.d.ts"
121
+ },
122
+ "./iframe/message-service": {
123
+ "default": "./iframe/message-service.cjs",
124
+ "import": "./iframe/message-service.js",
125
+ "node": "./iframe/message-service.cjs",
126
+ "require": "./iframe/message-service.cjs",
127
+ "types": "./iframe/message-service.d.ts"
128
+ },
129
+ "./worker": {
130
+ "default": "./worker/index.cjs",
131
+ "import": "./worker/index.js",
132
+ "node": "./worker/index.cjs",
133
+ "require": "./worker/index.cjs",
134
+ "types": "./worker/index.d.ts"
135
+ },
136
+ "./worker/message-client": {
137
+ "default": "./worker/message-client.cjs",
138
+ "import": "./worker/message-client.js",
139
+ "node": "./worker/message-client.cjs",
140
+ "require": "./worker/message-client.cjs",
141
+ "types": "./worker/message-client.d.ts"
142
+ },
143
+ "./worker/message-host": {
144
+ "default": "./worker/message-host.cjs",
145
+ "import": "./worker/message-host.js",
146
+ "node": "./worker/message-host.cjs",
147
+ "require": "./worker/message-host.cjs",
148
+ "types": "./worker/message-host.d.ts"
149
+ },
150
+ "./worker/message-service": {
151
+ "default": "./worker/message-service.cjs",
152
+ "import": "./worker/message-service.js",
153
+ "node": "./worker/message-service.cjs",
154
+ "require": "./worker/message-service.cjs",
155
+ "types": "./worker/message-service.d.ts"
156
+ }
157
+ }
158
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Request = Request;
4
+ const operators_1 = require("rxjs/operators");
5
+ const selectors_1 = require("./selectors");
6
+ function Request(path) {
7
+ return function (target, key, descriptor) {
8
+ descriptor.value = function (message) {
9
+ const messageId = this[selectors_1.GET_NEW_ID]();
10
+ this[selectors_1.SEND]({ body: message, id: messageId, path });
11
+ return this[selectors_1.RESPONSES$].pipe((0, operators_1.map)((data) => {
12
+ const { error } = data;
13
+ if (error)
14
+ throw error;
15
+ return data;
16
+ }), (0, operators_1.filter)(({ id }) => id === messageId), (0, operators_1.takeWhile)((res) => !res.completed), (0, operators_1.map)(({ body }) => body));
17
+ };
18
+ return descriptor;
19
+ };
20
+ }
@@ -0,0 +1 @@
1
+ export declare function Request(path: string): MethodDecorator;
@@ -0,0 +1,19 @@
1
+ import { filter, map, takeWhile } from 'rxjs/operators';
2
+ import { GET_NEW_ID, RESPONSES$, SEND } from './selectors';
3
+ export function Request(path) {
4
+ return function (target, key, descriptor) {
5
+ descriptor.value = function (message) {
6
+ const messageId = this[GET_NEW_ID]();
7
+ this[SEND]({ body: message, id: messageId, path });
8
+ return this[RESPONSES$].pipe(map((data) => {
9
+ const { error } = data;
10
+ if (error)
11
+ throw error;
12
+ return data;
13
+ }), filter(({ id }) => id === messageId), takeWhile((res) => !res.completed), map(({ body }) => body));
14
+ };
15
+ return descriptor;
16
+ };
17
+ }
18
+
19
+ //# sourceMappingURL=request.decorator.js.map
@@ -0,0 +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,EAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;YAEjD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACX,MAAM,EAAC,KAAK,EAAC,GAAG,IAA4B,CAAC;gBAE7C,IAAI,KAAK;oBAAE,MAAM,KAAK,CAAC;gBAEvB,OAAO,IAAiC,CAAC;YAC3C,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,EAClC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAClC,GAAG,CAAC,CAAC,EAAC,IAAI,EAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,CAClD,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 map((data) => {\n const {error} = data as ErrorMessageResponse;\n\n if (error) throw error;\n\n return data as SuccessfulMessageResponse;\n }),\n filter(({id}) => id === messageId),\n takeWhile((res) => !res.completed),\n map(({body}: UncompletedMessageResponse) => body),\n );\n };\n\n return descriptor;\n };\n}\n"]}
package/selectors.cjs ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESPONSE = exports.TERMINATE_MESSAGE$ = exports.LISTEN = exports.GET_NEW_ID = exports.SEND = exports.RESPONSES$ = exports.MESSAGE_LISTENERS = void 0;
4
+ exports.MESSAGE_LISTENERS = Symbol('Message Listeners');
5
+ exports.RESPONSES$ = Symbol('Responses');
6
+ exports.SEND = Symbol('Send');
7
+ exports.GET_NEW_ID = Symbol('Get New Id');
8
+ exports.LISTEN = Symbol('Listen');
9
+ exports.TERMINATE_MESSAGE$ = Symbol('Terminate Message');
10
+ exports.RESPONSE = Symbol('Response');
package/selectors.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare const MESSAGE_LISTENERS: unique symbol;
2
+ export declare const RESPONSES$: unique symbol;
3
+ export declare const SEND: unique symbol;
4
+ export declare const GET_NEW_ID: unique symbol;
5
+ export declare const LISTEN: unique symbol;
6
+ export declare const TERMINATE_MESSAGE$: unique symbol;
7
+ export declare const RESPONSE: unique symbol;
package/selectors.js ADDED
@@ -0,0 +1,9 @@
1
+ export const MESSAGE_LISTENERS = Symbol('Message Listeners');
2
+ export const RESPONSES$ = Symbol('Responses');
3
+ export const SEND = Symbol('Send');
4
+ export const GET_NEW_ID = Symbol('Get New Id');
5
+ export const LISTEN = Symbol('Listen');
6
+ export const TERMINATE_MESSAGE$ = Symbol('Terminate Message');
7
+ export const RESPONSE = Symbol('Response');
8
+
9
+ //# sourceMappingURL=selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../libs/hermes/src/selectors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC","file":"selectors.js","sourcesContent":["export const MESSAGE_LISTENERS = Symbol('Message Listeners');\nexport const RESPONSES$ = Symbol('Responses');\nexport const SEND = Symbol('Send');\nexport const GET_NEW_ID = Symbol('Get New Id');\nexport const LISTEN = Symbol('Listen');\nexport const TERMINATE_MESSAGE$ = Symbol('Terminate Message');\nexport const RESPONSE = Symbol('Response');\n"]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listen = exports.Request = exports.WorkerMessageHost = exports.WorkerMessageClient = exports.WorkerMessageService = void 0;
4
+ var message_service_1 = require("./message-service");
5
+ Object.defineProperty(exports, "WorkerMessageService", { enumerable: true, get: function () { return message_service_1.WorkerMessageService; } });
6
+ var message_client_1 = require("./message-client");
7
+ Object.defineProperty(exports, "WorkerMessageClient", { enumerable: true, get: function () { return message_client_1.WorkerMessageClient; } });
8
+ var message_host_1 = require("./message-host");
9
+ Object.defineProperty(exports, "WorkerMessageHost", { enumerable: true, get: function () { return message_host_1.WorkerMessageHost; } });
10
+ var request_decorator_1 = require("../request.decorator");
11
+ Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return request_decorator_1.Request; } });
12
+ var listen_decorator_1 = require("../listen.decorator");
13
+ Object.defineProperty(exports, "Listen", { enumerable: true, get: function () { return listen_decorator_1.Listen; } });
@@ -0,0 +1,5 @@
1
+ export { WorkerMessageService } from './message-service';
2
+ export { WorkerMessageClient } from './message-client';
3
+ export { WorkerMessageHost } from './message-host';
4
+ export { Request } from '../request.decorator';
5
+ export { Listen } from '../listen.decorator';
@@ -0,0 +1,7 @@
1
+ export { WorkerMessageService } from './message-service';
2
+ export { WorkerMessageClient } from './message-client';
3
+ export { WorkerMessageHost } from './message-host';
4
+ export { Request } from '../request.decorator';
5
+ export { Listen } from '../listen.decorator';
6
+
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../libs/hermes/src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC","file":"index.js","sourcesContent":["export { WorkerMessageService } from './message-service';\nexport { WorkerMessageClient } from './message-client';\nexport { WorkerMessageHost } from './message-host';\nexport { Request } from '../request.decorator';\nexport { Listen } from '../listen.decorator';\n"]}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerMessageClient = void 0;
4
+ const unique_id_1 = require("@thalesrc/js-utils/unique-id");
5
+ const noop_1 = require("@thalesrc/js-utils/function/noop");
6
+ const promisify_1 = require("@thalesrc/js-utils/promise/promisify");
7
+ const rxjs_1 = require("rxjs");
8
+ const message_client_1 = require("../message-client");
9
+ const selectors_1 = require("../selectors");
10
+ /**
11
+ * WorkerMessageClient
12
+ *
13
+ * Client implementation for Web Worker communication. Sends messages to and receives
14
+ * responses from Web Workers using the Worker postMessage API.
15
+ *
16
+ * This class can be used in two contexts:
17
+ * - **Main thread**: Provide a Worker instance to communicate with that specific worker
18
+ * - **Worker thread**: Omit the worker parameter to communicate with the main thread via self
19
+ *
20
+ * The worker parameter supports multiple types for flexibility:
21
+ * - Direct Worker instance
22
+ * - Promise that resolves to a Worker (for async worker initialization)
23
+ * - Function that returns a Worker (for lazy initialization)
24
+ * - Function that returns a Promise<Worker> (for async lazy initialization)
25
+ *
26
+ * The `initialize()` method allows dynamic worker management, enabling you to switch
27
+ * workers at runtime or re-establish connections after errors.
28
+ *
29
+ * @example
30
+ * // In main thread - communicate with a specific worker
31
+ * const worker = new Worker('./worker.js');
32
+ * const client = new WorkerMessageClient(worker);
33
+ *
34
+ * @example
35
+ * // In worker thread - communicate with main thread
36
+ * const client = new WorkerMessageClient();
37
+ *
38
+ * @example
39
+ * // With async worker initialization
40
+ * const workerPromise = import('./worker.js').then(m => new m.MyWorker());
41
+ * const client = new WorkerMessageClient(workerPromise);
42
+ *
43
+ * @example
44
+ * // With lazy initialization
45
+ * const client = new WorkerMessageClient(() =>
46
+ * document.querySelector('[data-worker]') ? new Worker('./worker.js') : undefined
47
+ * );
48
+ *
49
+ * @example
50
+ * // Re-initialize with a different worker
51
+ * const client = new WorkerMessageClient();
52
+ * // Later, switch to a different worker
53
+ * client.initialize(new Worker('./different-worker.js'));
54
+ */
55
+ class WorkerMessageClient extends message_client_1.MessageClient {
56
+ /**
57
+ * Promise resolving to the Worker instance or undefined if running in worker context
58
+ * @private
59
+ */
60
+ #worker = Promise.resolve(undefined);
61
+ /**
62
+ * Unique identifier for this client instance to prevent ID collisions
63
+ * @private
64
+ */
65
+ #instanceId = Date.now();
66
+ /**
67
+ * Observable stream of message responses from the worker or main thread
68
+ */
69
+ [selectors_1.RESPONSES$] = new rxjs_1.Subject();
70
+ /**
71
+ * Creates a new WorkerMessageClient instance
72
+ *
73
+ * @param worker - Optional worker configuration:
74
+ * - Worker: Direct worker instance (main thread)
75
+ * - Promise<Worker>: Promise resolving to worker (async initialization)
76
+ * - () => Worker: Function returning worker (lazy initialization)
77
+ * - () => Promise<Worker>: Function returning promise (async lazy initialization)
78
+ * - undefined: Omit for worker thread context (uses self)
79
+ */
80
+ constructor(worker) {
81
+ super();
82
+ this.initialize(worker);
83
+ }
84
+ /**
85
+ * Initializes or re-initializes the worker connection.
86
+ *
87
+ * This method sets up message listeners for the provided worker. If a worker
88
+ * was previously initialized, it cleans up the old connection before establishing
89
+ * the new one. This allows for dynamic worker management, such as:
90
+ * - Switching between different workers at runtime
91
+ * - Re-establishing connections after worker errors
92
+ * - Lazy initialization when the worker is conditionally needed
93
+ *
94
+ * @param worker - Optional worker configuration:
95
+ * - Worker: Direct worker instance (main thread)
96
+ * - Promise<Worker>: Promise resolving to worker (async initialization)
97
+ * - () => Worker: Function returning worker (lazy initialization)
98
+ * - () => Promise<Worker>: Function returning promise (async lazy initialization)
99
+ * - undefined: Omit for worker thread context (uses self)
100
+ *
101
+ * @example
102
+ * // Switch to a different worker dynamically
103
+ * const client = new WorkerMessageClient(oldWorker);
104
+ * client.initialize(newWorker); // Cleans up old listener, sets up new one
105
+ *
106
+ * @example
107
+ * // Re-initialize after worker error
108
+ * worker.onerror = () => {
109
+ * client.initialize(new Worker('./worker.js'));
110
+ * };
111
+ */
112
+ initialize(worker) {
113
+ // Deinitialize previous worker if any
114
+ this.#worker.then(prevWorker => {
115
+ if (prevWorker) {
116
+ prevWorker.removeEventListener('message', this.#handler);
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);
137
+ }
138
+ /**
139
+ * Sends a message to the worker or main thread
140
+ *
141
+ * @param message - The message to send
142
+ * @template T - Type of the message body
143
+ * @internal Used by @Request decorator
144
+ */
145
+ [selectors_1.SEND](message) {
146
+ this.#worker.then(worker => {
147
+ if (worker) {
148
+ // Main thread: send to worker
149
+ worker.postMessage(message);
150
+ }
151
+ else {
152
+ // Worker thread: send to main thread
153
+ postMessage(message);
154
+ }
155
+ }).catch(noop_1.noop);
156
+ }
157
+ /**
158
+ * Handles incoming messages and forwards them to the responses stream
159
+ * @private
160
+ */
161
+ #handler = (event) => {
162
+ this[selectors_1.RESPONSES$].next(event.data);
163
+ };
164
+ /**
165
+ * Generates a unique message ID for tracking request-response pairs
166
+ *
167
+ * @returns Unique message identifier
168
+ * @internal Used by @Request decorator
169
+ */
170
+ [selectors_1.GET_NEW_ID]() {
171
+ return (0, unique_id_1.uniqueId)('hermes-worker-message-' + this.#instanceId);
172
+ }
173
+ }
174
+ exports.WorkerMessageClient = WorkerMessageClient;
@@ -0,0 +1,117 @@
1
+ import { Subject } from "rxjs";
2
+ import { MessageClient } from "../message-client";
3
+ import { MessageResponse } from "../message-response.type";
4
+ import { Message } from "../message.interface";
5
+ import { GET_NEW_ID, RESPONSES$, SEND } from "../selectors";
6
+ type ClientWorkerType = Worker | undefined;
7
+ type ClientWorkerPromise = Promise<ClientWorkerType>;
8
+ type ClientWorkerFactory = () => ClientWorkerType | ClientWorkerPromise;
9
+ type ClientWorkerArg = ClientWorkerType | ClientWorkerPromise | ClientWorkerFactory;
10
+ /**
11
+ * WorkerMessageClient
12
+ *
13
+ * Client implementation for Web Worker communication. Sends messages to and receives
14
+ * responses from Web Workers using the Worker postMessage API.
15
+ *
16
+ * This class can be used in two contexts:
17
+ * - **Main thread**: Provide a Worker instance to communicate with that specific worker
18
+ * - **Worker thread**: Omit the worker parameter to communicate with the main thread via self
19
+ *
20
+ * The worker parameter supports multiple types for flexibility:
21
+ * - Direct Worker instance
22
+ * - Promise that resolves to a Worker (for async worker initialization)
23
+ * - Function that returns a Worker (for lazy initialization)
24
+ * - Function that returns a Promise<Worker> (for async lazy initialization)
25
+ *
26
+ * The `initialize()` method allows dynamic worker management, enabling you to switch
27
+ * workers at runtime or re-establish connections after errors.
28
+ *
29
+ * @example
30
+ * // In main thread - communicate with a specific worker
31
+ * const worker = new Worker('./worker.js');
32
+ * const client = new WorkerMessageClient(worker);
33
+ *
34
+ * @example
35
+ * // In worker thread - communicate with main thread
36
+ * const client = new WorkerMessageClient();
37
+ *
38
+ * @example
39
+ * // With async worker initialization
40
+ * const workerPromise = import('./worker.js').then(m => new m.MyWorker());
41
+ * const client = new WorkerMessageClient(workerPromise);
42
+ *
43
+ * @example
44
+ * // With lazy initialization
45
+ * const client = new WorkerMessageClient(() =>
46
+ * document.querySelector('[data-worker]') ? new Worker('./worker.js') : undefined
47
+ * );
48
+ *
49
+ * @example
50
+ * // Re-initialize with a different worker
51
+ * const client = new WorkerMessageClient();
52
+ * // Later, switch to a different worker
53
+ * client.initialize(new Worker('./different-worker.js'));
54
+ */
55
+ export declare class WorkerMessageClient extends MessageClient {
56
+ #private;
57
+ /**
58
+ * Observable stream of message responses from the worker or main thread
59
+ */
60
+ [RESPONSES$]: Subject<MessageResponse>;
61
+ /**
62
+ * Creates a new WorkerMessageClient instance
63
+ *
64
+ * @param worker - Optional worker configuration:
65
+ * - Worker: Direct worker instance (main thread)
66
+ * - Promise<Worker>: Promise resolving to worker (async initialization)
67
+ * - () => Worker: Function returning worker (lazy initialization)
68
+ * - () => Promise<Worker>: Function returning promise (async lazy initialization)
69
+ * - undefined: Omit for worker thread context (uses self)
70
+ */
71
+ constructor(worker?: ClientWorkerArg);
72
+ /**
73
+ * Initializes or re-initializes the worker connection.
74
+ *
75
+ * This method sets up message listeners for the provided worker. If a worker
76
+ * was previously initialized, it cleans up the old connection before establishing
77
+ * the new one. This allows for dynamic worker management, such as:
78
+ * - Switching between different workers at runtime
79
+ * - Re-establishing connections after worker errors
80
+ * - Lazy initialization when the worker is conditionally needed
81
+ *
82
+ * @param worker - Optional worker configuration:
83
+ * - Worker: Direct worker instance (main thread)
84
+ * - Promise<Worker>: Promise resolving to worker (async initialization)
85
+ * - () => Worker: Function returning worker (lazy initialization)
86
+ * - () => Promise<Worker>: Function returning promise (async lazy initialization)
87
+ * - undefined: Omit for worker thread context (uses self)
88
+ *
89
+ * @example
90
+ * // Switch to a different worker dynamically
91
+ * const client = new WorkerMessageClient(oldWorker);
92
+ * client.initialize(newWorker); // Cleans up old listener, sets up new one
93
+ *
94
+ * @example
95
+ * // Re-initialize after worker error
96
+ * worker.onerror = () => {
97
+ * client.initialize(new Worker('./worker.js'));
98
+ * };
99
+ */
100
+ initialize(worker?: ClientWorkerArg): void;
101
+ /**
102
+ * Sends a message to the worker or main thread
103
+ *
104
+ * @param message - The message to send
105
+ * @template T - Type of the message body
106
+ * @internal Used by @Request decorator
107
+ */
108
+ [SEND]<T>(message: Message<T>): void;
109
+ /**
110
+ * Generates a unique message ID for tracking request-response pairs
111
+ *
112
+ * @returns Unique message identifier
113
+ * @internal Used by @Request decorator
114
+ */
115
+ protected [GET_NEW_ID](): string;
116
+ }
117
+ export {};