@modularizer/plat-client 0.4.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 (233) hide show
  1. package/dist/args/coerce.d.ts +54 -0
  2. package/dist/args/coerce.d.ts.map +1 -0
  3. package/dist/args/coerce.js +236 -0
  4. package/dist/args/coerce.js.map +1 -0
  5. package/dist/args/index.d.ts +2 -0
  6. package/dist/args/index.d.ts.map +1 -0
  7. package/dist/args/index.js +2 -0
  8. package/dist/args/index.js.map +1 -0
  9. package/dist/args/scalars.d.ts +87 -0
  10. package/dist/args/scalars.d.ts.map +1 -0
  11. package/dist/args/scalars.js +22 -0
  12. package/dist/args/scalars.js.map +1 -0
  13. package/dist/args/validate.d.ts +23 -0
  14. package/dist/args/validate.d.ts.map +1 -0
  15. package/dist/args/validate.js +185 -0
  16. package/dist/args/validate.js.map +1 -0
  17. package/dist/args/z2.d.ts +27 -0
  18. package/dist/args/z2.d.ts.map +1 -0
  19. package/dist/args/z2.js +24 -0
  20. package/dist/args/z2.js.map +1 -0
  21. package/dist/client/css-transport-plugin.d.ts +19 -0
  22. package/dist/client/css-transport-plugin.d.ts.map +1 -0
  23. package/dist/client/css-transport-plugin.js +78 -0
  24. package/dist/client/css-transport-plugin.js.map +1 -0
  25. package/dist/client/file-transport-plugin.d.ts +28 -0
  26. package/dist/client/file-transport-plugin.d.ts.map +1 -0
  27. package/dist/client/file-transport-plugin.js +80 -0
  28. package/dist/client/file-transport-plugin.js.map +1 -0
  29. package/dist/client/http-transport-plugin.d.ts +27 -0
  30. package/dist/client/http-transport-plugin.d.ts.map +1 -0
  31. package/dist/client/http-transport-plugin.js +48 -0
  32. package/dist/client/http-transport-plugin.js.map +1 -0
  33. package/dist/client/index.d.ts +7 -0
  34. package/dist/client/index.d.ts.map +1 -0
  35. package/dist/client/index.js +7 -0
  36. package/dist/client/index.js.map +1 -0
  37. package/dist/client/openapi-client.d.ts +334 -0
  38. package/dist/client/openapi-client.d.ts.map +1 -0
  39. package/dist/client/openapi-client.js +910 -0
  40. package/dist/client/openapi-client.js.map +1 -0
  41. package/dist/client/proxy.d.ts +5 -0
  42. package/dist/client/proxy.d.ts.map +1 -0
  43. package/dist/client/proxy.js +353 -0
  44. package/dist/client/proxy.js.map +1 -0
  45. package/dist/client/request-builder.d.ts +5 -0
  46. package/dist/client/request-builder.d.ts.map +1 -0
  47. package/dist/client/request-builder.js +88 -0
  48. package/dist/client/request-builder.js.map +1 -0
  49. package/dist/client/rpc-transport-plugin.d.ts +17 -0
  50. package/dist/client/rpc-transport-plugin.d.ts.map +1 -0
  51. package/dist/client/rpc-transport-plugin.js +69 -0
  52. package/dist/client/rpc-transport-plugin.js.map +1 -0
  53. package/dist/client/tools.d.ts +69 -0
  54. package/dist/client/tools.d.ts.map +1 -0
  55. package/dist/client/tools.js +122 -0
  56. package/dist/client/tools.js.map +1 -0
  57. package/dist/client/transport-plugin.d.ts +62 -0
  58. package/dist/client/transport-plugin.d.ts.map +1 -0
  59. package/dist/client/transport-plugin.js +40 -0
  60. package/dist/client/transport-plugin.js.map +1 -0
  61. package/dist/client-entry.d.ts +25 -0
  62. package/dist/client-entry.d.ts.map +1 -0
  63. package/dist/client-entry.js +25 -0
  64. package/dist/client-entry.js.map +1 -0
  65. package/dist/client-server-entry.d.ts +13 -0
  66. package/dist/client-server-entry.d.ts.map +1 -0
  67. package/dist/client-server-entry.js +13 -0
  68. package/dist/client-server-entry.js.map +1 -0
  69. package/dist/client-side-python/runtime.d.ts +102 -0
  70. package/dist/client-side-python/runtime.d.ts.map +1 -0
  71. package/dist/client-side-python/runtime.js +595 -0
  72. package/dist/client-side-python/runtime.js.map +1 -0
  73. package/dist/client-side-server/bootstrap.d.ts +3 -0
  74. package/dist/client-side-server/bootstrap.d.ts.map +1 -0
  75. package/dist/client-side-server/bootstrap.js +20 -0
  76. package/dist/client-side-server/bootstrap.js.map +1 -0
  77. package/dist/client-side-server/channel.d.ts +17 -0
  78. package/dist/client-side-server/channel.d.ts.map +1 -0
  79. package/dist/client-side-server/channel.js +38 -0
  80. package/dist/client-side-server/channel.js.map +1 -0
  81. package/dist/client-side-server/identity.d.ts +116 -0
  82. package/dist/client-side-server/identity.d.ts.map +1 -0
  83. package/dist/client-side-server/identity.js +358 -0
  84. package/dist/client-side-server/identity.js.map +1 -0
  85. package/dist/client-side-server/mqtt-webrtc.d.ts +77 -0
  86. package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -0
  87. package/dist/client-side-server/mqtt-webrtc.js +575 -0
  88. package/dist/client-side-server/mqtt-webrtc.js.map +1 -0
  89. package/dist/client-side-server/protocol.d.ts +49 -0
  90. package/dist/client-side-server/protocol.d.ts.map +1 -0
  91. package/dist/client-side-server/protocol.js +13 -0
  92. package/dist/client-side-server/protocol.js.map +1 -0
  93. package/dist/client-side-server/runtime.d.ts +57 -0
  94. package/dist/client-side-server/runtime.d.ts.map +1 -0
  95. package/dist/client-side-server/runtime.js +188 -0
  96. package/dist/client-side-server/runtime.js.map +1 -0
  97. package/dist/client-side-server/server.d.ts +75 -0
  98. package/dist/client-side-server/server.d.ts.map +1 -0
  99. package/dist/client-side-server/server.js +380 -0
  100. package/dist/client-side-server/server.js.map +1 -0
  101. package/dist/client-side-server/signaling.d.ts +10 -0
  102. package/dist/client-side-server/signaling.d.ts.map +1 -0
  103. package/dist/client-side-server/signaling.js +19 -0
  104. package/dist/client-side-server/signaling.js.map +1 -0
  105. package/dist/client-side-server/source-analysis.d.ts +29 -0
  106. package/dist/client-side-server/source-analysis.d.ts.map +1 -0
  107. package/dist/client-side-server/source-analysis.js +395 -0
  108. package/dist/client-side-server/source-analysis.js.map +1 -0
  109. package/dist/generated/python-browser-sources.d.ts +2 -0
  110. package/dist/generated/python-browser-sources.d.ts.map +1 -0
  111. package/dist/generated/python-browser-sources.js +13 -0
  112. package/dist/generated/python-browser-sources.js.map +1 -0
  113. package/dist/logging.d.ts +9 -0
  114. package/dist/logging.d.ts.map +1 -0
  115. package/dist/logging.js +64 -0
  116. package/dist/logging.js.map +1 -0
  117. package/dist/python-browser-entry.d.ts +2 -0
  118. package/dist/python-browser-entry.d.ts.map +1 -0
  119. package/dist/python-browser-entry.js +2 -0
  120. package/dist/python-browser-entry.js.map +1 -0
  121. package/dist/rpc.d.ts +39 -0
  122. package/dist/rpc.d.ts.map +1 -0
  123. package/dist/rpc.js +2 -0
  124. package/dist/rpc.js.map +1 -0
  125. package/dist/server/authority-server.d.ts +27 -0
  126. package/dist/server/authority-server.d.ts.map +1 -0
  127. package/dist/server/authority-server.js +97 -0
  128. package/dist/server/authority-server.js.map +1 -0
  129. package/dist/server/cache/index.d.ts +2 -0
  130. package/dist/server/cache/index.d.ts.map +1 -0
  131. package/dist/server/cache/index.js +2 -0
  132. package/dist/server/cache/index.js.map +1 -0
  133. package/dist/server/cache/utils.d.ts +30 -0
  134. package/dist/server/cache/utils.d.ts.map +1 -0
  135. package/dist/server/cache/utils.js +116 -0
  136. package/dist/server/cache/utils.js.map +1 -0
  137. package/dist/server/core.d.ts +43 -0
  138. package/dist/server/core.d.ts.map +1 -0
  139. package/dist/server/core.js +215 -0
  140. package/dist/server/core.js.map +1 -0
  141. package/dist/server/operation-registry.d.ts +9 -0
  142. package/dist/server/operation-registry.d.ts.map +1 -0
  143. package/dist/server/operation-registry.js +16 -0
  144. package/dist/server/operation-registry.js.map +1 -0
  145. package/dist/server/param-aliases.d.ts +40 -0
  146. package/dist/server/param-aliases.d.ts.map +1 -0
  147. package/dist/server/param-aliases.js +112 -0
  148. package/dist/server/param-aliases.js.map +1 -0
  149. package/dist/server/rate-limit/index.d.ts +2 -0
  150. package/dist/server/rate-limit/index.d.ts.map +1 -0
  151. package/dist/server/rate-limit/index.js +2 -0
  152. package/dist/server/rate-limit/index.js.map +1 -0
  153. package/dist/server/rate-limit/utils.d.ts +27 -0
  154. package/dist/server/rate-limit/utils.d.ts.map +1 -0
  155. package/dist/server/rate-limit/utils.js +126 -0
  156. package/dist/server/rate-limit/utils.js.map +1 -0
  157. package/dist/server/routing.d.ts +39 -0
  158. package/dist/server/routing.d.ts.map +1 -0
  159. package/dist/server/routing.js +70 -0
  160. package/dist/server/routing.js.map +1 -0
  161. package/dist/server/token-limit/index.d.ts +2 -0
  162. package/dist/server/token-limit/index.d.ts.map +1 -0
  163. package/dist/server/token-limit/index.js +2 -0
  164. package/dist/server/token-limit/index.js.map +1 -0
  165. package/dist/server/token-limit/utils.d.ts +44 -0
  166. package/dist/server/token-limit/utils.d.ts.map +1 -0
  167. package/dist/server/token-limit/utils.js +260 -0
  168. package/dist/server/token-limit/utils.js.map +1 -0
  169. package/dist/server/tools.d.ts +33 -0
  170. package/dist/server/tools.d.ts.map +1 -0
  171. package/dist/server/tools.js +160 -0
  172. package/dist/server/tools.js.map +1 -0
  173. package/dist/server/transports.d.ts +25 -0
  174. package/dist/server/transports.d.ts.map +1 -0
  175. package/dist/server/transports.js +2 -0
  176. package/dist/server/transports.js.map +1 -0
  177. package/dist/shared/tools.d.ts +24 -0
  178. package/dist/shared/tools.d.ts.map +1 -0
  179. package/dist/shared/tools.js +86 -0
  180. package/dist/shared/tools.js.map +1 -0
  181. package/dist/spec/decorators.d.ts +41 -0
  182. package/dist/spec/decorators.d.ts.map +1 -0
  183. package/dist/spec/decorators.js +93 -0
  184. package/dist/spec/decorators.js.map +1 -0
  185. package/dist/spec/index.d.ts +3 -0
  186. package/dist/spec/index.d.ts.map +1 -0
  187. package/dist/spec/index.js +3 -0
  188. package/dist/spec/index.js.map +1 -0
  189. package/dist/spec/metadata.d.ts +5 -0
  190. package/dist/spec/metadata.d.ts.map +1 -0
  191. package/dist/spec/metadata.js +37 -0
  192. package/dist/spec/metadata.js.map +1 -0
  193. package/dist/types/client-route.d.ts +7 -0
  194. package/dist/types/client-route.d.ts.map +1 -0
  195. package/dist/types/client-route.js +2 -0
  196. package/dist/types/client-route.js.map +1 -0
  197. package/dist/types/client.d.ts +81 -0
  198. package/dist/types/client.d.ts.map +1 -0
  199. package/dist/types/client.js +14 -0
  200. package/dist/types/client.js.map +1 -0
  201. package/dist/types/endpoints.d.ts +76 -0
  202. package/dist/types/endpoints.d.ts.map +1 -0
  203. package/dist/types/endpoints.js +2 -0
  204. package/dist/types/endpoints.js.map +1 -0
  205. package/dist/types/errors.d.ts +86 -0
  206. package/dist/types/errors.d.ts.map +1 -0
  207. package/dist/types/errors.js +153 -0
  208. package/dist/types/errors.js.map +1 -0
  209. package/dist/types/http.d.ts +80 -0
  210. package/dist/types/http.d.ts.map +1 -0
  211. package/dist/types/http.js +61 -0
  212. package/dist/types/http.js.map +1 -0
  213. package/dist/types/index.d.ts +10 -0
  214. package/dist/types/index.d.ts.map +1 -0
  215. package/dist/types/index.js +10 -0
  216. package/dist/types/index.js.map +1 -0
  217. package/dist/types/openapi.d.ts +220 -0
  218. package/dist/types/openapi.d.ts.map +1 -0
  219. package/dist/types/openapi.js +11 -0
  220. package/dist/types/openapi.js.map +1 -0
  221. package/dist/types/opts.d.ts +46 -0
  222. package/dist/types/opts.d.ts.map +1 -0
  223. package/dist/types/opts.js +2 -0
  224. package/dist/types/opts.js.map +1 -0
  225. package/dist/types/plugins.d.ts +93 -0
  226. package/dist/types/plugins.d.ts.map +1 -0
  227. package/dist/types/plugins.js +5 -0
  228. package/dist/types/plugins.js.map +1 -0
  229. package/dist/types/tools.d.ts +52 -0
  230. package/dist/types/tools.d.ts.map +1 -0
  231. package/dist/types/tools.js +2 -0
  232. package/dist/types/tools.js.map +1 -0
  233. package/package.json +51 -0
@@ -0,0 +1,575 @@
1
+ import * as mqttModule from 'mqtt';
2
+ import { createClientSideServerTransportPlugin } from '../client/css-transport-plugin.js';
3
+ import { createRTCDataChannelAdapter } from './channel.js';
4
+ import { buildClientSideServerIdentityChallenge, clientSideServerPublicKeysEqual, getOrCreateClientSideServerIdentityKeyPair, loadTrustedClientSideServerRecordFromMap, resolveTrustedClientSideServerFromAuthorities, loadTrustedClientSideServerRecord, trustClientSideServerFromAuthorityRecord, saveTrustedClientSideServerRecordToMap, signClientSideServerChallenge, toClientSideServerPublicIdentity, trustClientSideServerOnFirstUse, verifyClientSideServerChallenge, verifySignedClientSideServerAuthorityRecord, } from './identity.js';
5
+ import { isClientSideServerPeerMessage, } from './protocol.js';
6
+ import { parseClientSideServerAddress, } from './signaling.js';
7
+ export const DEFAULT_CLIENT_SIDE_SERVER_MQTT_BROKER = 'wss://broker.emqx.io:8084/mqtt';
8
+ export const DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC = 'mrtchat/plat-css';
9
+ export const DEFAULT_CLIENT_SIDE_SERVER_ICE_SERVERS = [
10
+ { urls: 'stun:stun.l.google.com:19302' },
11
+ { urls: 'stun:stun1.l.google.com:19302' },
12
+ { urls: 'stun:stun2.l.google.com:19302' },
13
+ { urls: 'stun:stun3.l.google.com:19302' },
14
+ { urls: 'stun:stun4.l.google.com:19302' },
15
+ ];
16
+ let defaultPeerPool;
17
+ let defaultTransportPlugin;
18
+ export class ClientSideServerMQTTWebRTCServer {
19
+ options;
20
+ mqtt;
21
+ serverInstanceId;
22
+ unsubscribeByConnection = new Map();
23
+ peers = new Map();
24
+ pendingCandidates = new Map();
25
+ announceTimer;
26
+ identityKeyPair;
27
+ publicIdentity;
28
+ constructor(options) {
29
+ this.options = options;
30
+ this.serverInstanceId = `${options.serverName}:${randomId('server')}`;
31
+ }
32
+ get connectionUrl() {
33
+ return `css://${this.options.serverName}`;
34
+ }
35
+ async start() {
36
+ if (this.mqtt)
37
+ return;
38
+ await this.ensureIdentity();
39
+ this.mqtt = await connectToBroker(this.options);
40
+ this.mqtt.on('message', (_topic, payload) => {
41
+ void this.onMessage(payload);
42
+ });
43
+ await subscribe(this.mqtt, this.options.mqttTopic ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC);
44
+ await this.announce();
45
+ const intervalMs = this.options.announceIntervalMs ?? 30_000;
46
+ this.announceTimer = setInterval(() => {
47
+ void this.announce();
48
+ }, intervalMs);
49
+ }
50
+ async stop() {
51
+ if (this.announceTimer) {
52
+ clearInterval(this.announceTimer);
53
+ this.announceTimer = undefined;
54
+ }
55
+ for (const unsubscribe of this.unsubscribeByConnection.values()) {
56
+ unsubscribe();
57
+ }
58
+ this.unsubscribeByConnection.clear();
59
+ for (const peer of this.peers.values()) {
60
+ peer.close();
61
+ }
62
+ this.peers.clear();
63
+ if (this.mqtt) {
64
+ await endClient(this.mqtt);
65
+ this.mqtt = undefined;
66
+ }
67
+ }
68
+ async announce() {
69
+ if (!this.mqtt)
70
+ return;
71
+ await publish(this.mqtt, this.options.mqttTopic ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC, {
72
+ protocol: 'plat-css-v1',
73
+ kind: 'announce',
74
+ senderId: this.serverInstanceId,
75
+ serverName: this.options.serverName,
76
+ identity: this.publicIdentity,
77
+ authorityRecord: this.options.identity?.authorityRecord,
78
+ at: Date.now(),
79
+ });
80
+ }
81
+ async onMessage(payload) {
82
+ const message = parseSignalingMessage(payload);
83
+ if (!message || message.senderId === this.serverInstanceId)
84
+ return;
85
+ if (message.targetId && message.targetId !== this.options.serverName && message.targetId !== this.serverInstanceId)
86
+ return;
87
+ if (message.kind === 'offer' && message.targetId === this.options.serverName && message.connectionId && message.description) {
88
+ await this.acceptOffer(message);
89
+ return;
90
+ }
91
+ if (message.kind === 'ice'
92
+ && (message.targetId === this.options.serverName || message.targetId === this.serverInstanceId)
93
+ && message.connectionId
94
+ && message.candidate) {
95
+ const peer = this.peers.get(message.connectionId);
96
+ if (peer?.remoteDescription) {
97
+ await peer.addIceCandidate(new RTCIceCandidate(message.candidate));
98
+ }
99
+ else {
100
+ const pending = this.pendingCandidates.get(message.connectionId) ?? [];
101
+ pending.push(message.candidate);
102
+ this.pendingCandidates.set(message.connectionId, pending);
103
+ }
104
+ }
105
+ }
106
+ async acceptOffer(message) {
107
+ if (!this.mqtt || !message.connectionId || !message.description)
108
+ return;
109
+ await this.ensureIdentity();
110
+ const peer = new RTCPeerConnection({
111
+ iceServers: this.options.iceServers ?? DEFAULT_CLIENT_SIDE_SERVER_ICE_SERVERS,
112
+ });
113
+ this.peers.set(message.connectionId, peer);
114
+ peer.onicecandidate = (event) => {
115
+ if (!event.candidate || !this.mqtt)
116
+ return;
117
+ void publish(this.mqtt, this.options.mqttTopic ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC, {
118
+ protocol: 'plat-css-v1',
119
+ kind: 'ice',
120
+ senderId: this.serverInstanceId,
121
+ targetId: message.senderId,
122
+ serverName: this.options.serverName,
123
+ connectionId: message.connectionId,
124
+ candidate: event.candidate.toJSON(),
125
+ at: Date.now(),
126
+ });
127
+ };
128
+ peer.onconnectionstatechange = () => {
129
+ if (peer.connectionState === 'failed' || peer.connectionState === 'closed' || peer.connectionState === 'disconnected') {
130
+ this.unsubscribeByConnection.get(message.connectionId)?.();
131
+ this.unsubscribeByConnection.delete(message.connectionId);
132
+ this.peers.delete(message.connectionId);
133
+ }
134
+ };
135
+ peer.ondatachannel = (event) => {
136
+ const unsubscribe = this.options.server.serveChannel(createRTCDataChannelAdapter(event.channel));
137
+ this.unsubscribeByConnection.set(message.connectionId, unsubscribe);
138
+ event.channel.addEventListener('close', () => {
139
+ unsubscribe();
140
+ this.unsubscribeByConnection.delete(message.connectionId);
141
+ }, { once: true });
142
+ };
143
+ await peer.setRemoteDescription(new RTCSessionDescription(message.description));
144
+ for (const candidate of this.pendingCandidates.get(message.connectionId) ?? []) {
145
+ await peer.addIceCandidate(new RTCIceCandidate(candidate));
146
+ }
147
+ this.pendingCandidates.delete(message.connectionId);
148
+ const answer = await peer.createAnswer();
149
+ await peer.setLocalDescription(answer);
150
+ await publish(this.mqtt, this.options.mqttTopic ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC, {
151
+ protocol: 'plat-css-v1',
152
+ kind: 'answer',
153
+ senderId: this.serverInstanceId,
154
+ targetId: message.senderId,
155
+ serverName: this.options.serverName,
156
+ connectionId: message.connectionId,
157
+ description: answer,
158
+ identity: this.publicIdentity,
159
+ authorityRecord: this.options.identity?.authorityRecord,
160
+ challengeNonce: message.challengeNonce,
161
+ challengeSignature: message.challengeNonce
162
+ ? await signClientSideServerChallenge(this.identityKeyPair, buildClientSideServerIdentityChallenge({
163
+ serverName: this.options.serverName,
164
+ connectionId: message.connectionId,
165
+ challengeNonce: message.challengeNonce,
166
+ }))
167
+ : undefined,
168
+ at: Date.now(),
169
+ });
170
+ }
171
+ async ensureIdentity() {
172
+ if (this.identityKeyPair && this.publicIdentity)
173
+ return;
174
+ const storageKey = this.options.identity?.keyPairStorageKey ?? `plat-css:keypair:${this.options.serverName}`;
175
+ this.identityKeyPair = this.options.identity?.keyPair
176
+ ?? await getOrCreateClientSideServerIdentityKeyPair({
177
+ storage: this.options.identity?.storage,
178
+ storageKey,
179
+ });
180
+ this.publicIdentity = await toClientSideServerPublicIdentity(this.identityKeyPair);
181
+ }
182
+ }
183
+ export function createClientSideServerMQTTWebRTCTransportPlugin(options = {}) {
184
+ if (isDefaultMQTTWebRTCOptions(options)) {
185
+ defaultTransportPlugin ??= createClientSideServerMQTTWebRTCTransportPluginInternal(options);
186
+ return defaultTransportPlugin;
187
+ }
188
+ return createClientSideServerMQTTWebRTCTransportPluginInternal(options);
189
+ }
190
+ function createClientSideServerMQTTWebRTCTransportPluginInternal(options) {
191
+ const pool = createClientSideServerMQTTWebRTCPeerPool(options);
192
+ return createClientSideServerTransportPlugin({
193
+ connect: async ({ address }) => {
194
+ const session = await pool.connect(address);
195
+ return {
196
+ send: (message) => session.send(message),
197
+ subscribe: (listener) => session.subscribe(listener),
198
+ close: () => undefined,
199
+ };
200
+ },
201
+ });
202
+ }
203
+ export function createClientSideServerMQTTWebRTCPeerPool(options = {}) {
204
+ if (isDefaultMQTTWebRTCOptions(options)) {
205
+ defaultPeerPool ??= createClientSideServerMQTTWebRTCPeerPoolInternal(options);
206
+ return defaultPeerPool;
207
+ }
208
+ return createClientSideServerMQTTWebRTCPeerPoolInternal(options);
209
+ }
210
+ function createClientSideServerMQTTWebRTCPeerPoolInternal(options) {
211
+ const sessions = new Map();
212
+ const normalizeAddress = (input) => typeof input === 'string' ? parseClientSideServerAddress(input) : input;
213
+ const connect = async (input) => {
214
+ const address = normalizeAddress(input);
215
+ const existing = sessions.get(address.href);
216
+ if (existing) {
217
+ const session = await existing;
218
+ if (session.isOpen())
219
+ return session;
220
+ sessions.delete(address.href);
221
+ }
222
+ const created = createClientSideServerMQTTWebRTCPeerSession(address, options);
223
+ sessions.set(address.href, created);
224
+ try {
225
+ return await created;
226
+ }
227
+ catch (error) {
228
+ sessions.delete(address.href);
229
+ throw error;
230
+ }
231
+ };
232
+ return {
233
+ connect,
234
+ async close(input) {
235
+ const address = normalizeAddress(input);
236
+ const existing = sessions.get(address.href);
237
+ if (!existing)
238
+ return;
239
+ sessions.delete(address.href);
240
+ const session = await existing;
241
+ await session.close?.();
242
+ },
243
+ async closeAll() {
244
+ const pending = Array.from(sessions.values());
245
+ sessions.clear();
246
+ for (const sessionPromise of pending) {
247
+ const session = await sessionPromise;
248
+ await session.close?.();
249
+ }
250
+ },
251
+ };
252
+ }
253
+ async function createClientSideServerMQTTWebRTCPeerSession(address, options) {
254
+ const webrtc = await resolveClientWebRTCImplementation();
255
+ const mqtt = await connectToBroker(options);
256
+ const topic = options.mqttTopic ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_TOPIC;
257
+ const peerId = `${options.clientIdPrefix ?? 'client'}:${randomId('peer')}`;
258
+ const connectionId = randomId('conn');
259
+ const challengeNonce = randomId('challenge');
260
+ const peer = new webrtc.RTCPeerConnection({
261
+ iceServers: options.iceServers ?? DEFAULT_CLIENT_SIDE_SERVER_ICE_SERVERS,
262
+ });
263
+ const dataChannel = peer.createDataChannel(`plat-css:${connectionId}`);
264
+ const ready = deferred();
265
+ const timeoutMs = options.connectionTimeoutMs ?? (typeof RTCPeerConnection !== 'undefined' ? 15_000 : 30_000);
266
+ const cleanupCallbacks = [];
267
+ const pendingCandidates = [];
268
+ const expectedIdentity = await resolveExpectedServerIdentity(address.serverName, options.identity);
269
+ let open = true;
270
+ await subscribe(mqtt, topic);
271
+ const onMessage = async (_topic, payload) => {
272
+ const message = parseSignalingMessage(payload);
273
+ if (!message || message.senderId === peerId || message.targetId !== peerId || message.connectionId !== connectionId) {
274
+ return;
275
+ }
276
+ if (message.kind === 'answer' && message.description) {
277
+ await verifyServerIdentityForAnswer({
278
+ serverName: address.serverName,
279
+ connectionId,
280
+ challengeNonce,
281
+ message,
282
+ optionsIdentity: options.identity,
283
+ expectedIdentity,
284
+ });
285
+ await peer.setRemoteDescription(webrtc.createSessionDescription(message.description));
286
+ if (!expectedIdentity && message.authorityRecord && options.identity?.authority?.publicKeyJwk) {
287
+ const trusted = await trustClientSideServerFromAuthorityRecord(message.authorityRecord, options.identity.authority.publicKeyJwk, {
288
+ storage: options.identity?.knownHostsStorage,
289
+ storageKey: options.identity?.knownHostsStorageKey,
290
+ });
291
+ if (options.identity?.knownHosts) {
292
+ saveTrustedClientSideServerRecordToMap(options.identity.knownHosts, trusted);
293
+ }
294
+ }
295
+ else if (!expectedIdentity && options.identity?.trustOnFirstUse !== false && message.identity) {
296
+ const trusted = await trustClientSideServerOnFirstUse(address.serverName, message.identity, {
297
+ storage: options.identity?.knownHostsStorage,
298
+ storageKey: options.identity?.knownHostsStorageKey,
299
+ });
300
+ if (options.identity?.knownHosts) {
301
+ saveTrustedClientSideServerRecordToMap(options.identity.knownHosts, trusted);
302
+ }
303
+ }
304
+ for (const candidate of pendingCandidates.splice(0, pendingCandidates.length)) {
305
+ await peer.addIceCandidate(webrtc.createIceCandidate(candidate));
306
+ }
307
+ return;
308
+ }
309
+ if (message.kind === 'ice' && message.candidate) {
310
+ if (peer.remoteDescription) {
311
+ await peer.addIceCandidate(webrtc.createIceCandidate(message.candidate));
312
+ }
313
+ else {
314
+ pendingCandidates.push(message.candidate);
315
+ }
316
+ }
317
+ };
318
+ mqtt.on('message', onMessage);
319
+ cleanupCallbacks.push(() => mqtt.off('message', onMessage));
320
+ peer.onicecandidate = (event) => {
321
+ if (!event.candidate)
322
+ return;
323
+ void publish(mqtt, topic, {
324
+ protocol: 'plat-css-v1',
325
+ kind: 'ice',
326
+ senderId: peerId,
327
+ targetId: address.serverName,
328
+ connectionId,
329
+ candidate: webrtc.serializeIceCandidate(event.candidate),
330
+ at: Date.now(),
331
+ });
332
+ };
333
+ peer.onconnectionstatechange = () => {
334
+ if (peer.connectionState === 'failed') {
335
+ ready.reject(new Error(`WebRTC connection to ${address.serverName} failed`));
336
+ }
337
+ if (peer.connectionState === 'failed' || peer.connectionState === 'closed' || peer.connectionState === 'disconnected') {
338
+ open = false;
339
+ }
340
+ };
341
+ dataChannel.addEventListener('open', () => ready.resolve(), { once: true });
342
+ dataChannel.addEventListener('error', () => ready.reject(new Error(`Data channel to ${address.serverName} failed`)), { once: true });
343
+ dataChannel.addEventListener('close', () => {
344
+ open = false;
345
+ ready.reject(new Error(`Data channel to ${address.serverName} closed before becoming ready`));
346
+ }, { once: true });
347
+ const offer = await peer.createOffer();
348
+ await peer.setLocalDescription(offer);
349
+ await publish(mqtt, topic, {
350
+ protocol: 'plat-css-v1',
351
+ kind: 'offer',
352
+ senderId: peerId,
353
+ targetId: address.serverName,
354
+ serverName: address.serverName,
355
+ connectionId,
356
+ description: offer,
357
+ challengeNonce,
358
+ at: Date.now(),
359
+ });
360
+ const timer = setTimeout(() => {
361
+ ready.reject(new Error(`Timed out connecting to client-side server ${address.serverName}`));
362
+ }, timeoutMs);
363
+ cleanupCallbacks.push(() => clearTimeout(timer));
364
+ await ready.promise;
365
+ const channel = createRTCDataChannelAdapter(dataChannel);
366
+ const originalClose = channel.close?.bind(channel);
367
+ return {
368
+ ...channel,
369
+ address,
370
+ connectionId,
371
+ peerId,
372
+ connectedAt: Date.now(),
373
+ isOpen: () => open && dataChannel.readyState === 'open',
374
+ async sendPeer(event, data) {
375
+ await channel.send({
376
+ platcss: 'peer',
377
+ event,
378
+ data,
379
+ fromPeerId: peerId,
380
+ fromServerName: address.serverName,
381
+ });
382
+ },
383
+ subscribePeer(listener) {
384
+ return channel.subscribe(async (message) => {
385
+ if (isClientSideServerPeerMessage(message)) {
386
+ await listener(message);
387
+ }
388
+ });
389
+ },
390
+ async close() {
391
+ if (!open)
392
+ return;
393
+ open = false;
394
+ for (const cleanup of cleanupCallbacks)
395
+ cleanup();
396
+ await originalClose?.();
397
+ await peer.close();
398
+ await endClient(mqtt);
399
+ },
400
+ };
401
+ }
402
+ async function resolveExpectedServerIdentity(serverName, options) {
403
+ const mapped = loadTrustedClientSideServerRecordFromMap(options?.knownHosts, serverName);
404
+ if (mapped)
405
+ return mapped;
406
+ if (options?.authorityServers?.length) {
407
+ const trusted = await resolveTrustedClientSideServerFromAuthorities(serverName, options.authorityServers, {
408
+ storage: options?.knownHostsStorage,
409
+ storageKey: options?.knownHostsStorageKey,
410
+ });
411
+ if (trusted) {
412
+ if (options.knownHosts) {
413
+ saveTrustedClientSideServerRecordToMap(options.knownHosts, trusted);
414
+ }
415
+ return trusted;
416
+ }
417
+ }
418
+ const authorityResolved = options?.authorityResolver ? await options.authorityResolver(serverName) : null;
419
+ if (authorityResolved)
420
+ return authorityResolved;
421
+ const stored = loadTrustedClientSideServerRecord(serverName, {
422
+ storage: options?.knownHostsStorage,
423
+ storageKey: options?.knownHostsStorageKey,
424
+ });
425
+ if (stored && options?.knownHosts) {
426
+ saveTrustedClientSideServerRecordToMap(options.knownHosts, stored);
427
+ }
428
+ return stored;
429
+ }
430
+ async function verifyServerIdentityForAnswer(input) {
431
+ const { message, serverName, connectionId, challengeNonce, expectedIdentity } = input;
432
+ if (!message.identity || !message.challengeSignature) {
433
+ if (expectedIdentity) {
434
+ throw new Error(`Server ${serverName} did not provide identity proof`);
435
+ }
436
+ return;
437
+ }
438
+ if (message.authorityRecord && input.optionsIdentity?.authority?.publicKeyJwk) {
439
+ const authorityOk = await verifySignedClientSideServerAuthorityRecord(message.authorityRecord, input.optionsIdentity.authority.publicKeyJwk);
440
+ if (!authorityOk) {
441
+ throw new Error(`Server ${serverName} provided an invalid authority record`);
442
+ }
443
+ if (!clientSideServerPublicKeysEqual(message.authorityRecord.publicKeyJwk, message.identity.publicKeyJwk)) {
444
+ throw new Error(`Server ${serverName} authority record does not match presented identity`);
445
+ }
446
+ }
447
+ const verified = await verifyClientSideServerChallenge(message.identity.publicKeyJwk, buildClientSideServerIdentityChallenge({
448
+ serverName,
449
+ connectionId,
450
+ challengeNonce,
451
+ }), message.challengeSignature);
452
+ if (!verified) {
453
+ throw new Error(`Server ${serverName} failed identity challenge verification`);
454
+ }
455
+ if (expectedIdentity && !clientSideServerPublicKeysEqual(expectedIdentity.publicKeyJwk, message.identity.publicKeyJwk)) {
456
+ throw new Error(`Server ${serverName} presented an unexpected public key`);
457
+ }
458
+ }
459
+ export function createClientSideServerMQTTWebRTCServer(options) {
460
+ return new ClientSideServerMQTTWebRTCServer(options);
461
+ }
462
+ async function connectToBroker(options) {
463
+ const client = resolveMqttConnect()(options.mqttBroker ?? DEFAULT_CLIENT_SIDE_SERVER_MQTT_BROKER, options.mqttOptions);
464
+ await new Promise((resolve, reject) => {
465
+ const onConnect = () => {
466
+ cleanup();
467
+ resolve();
468
+ };
469
+ const onError = (error) => {
470
+ cleanup();
471
+ reject(error);
472
+ };
473
+ const cleanup = () => {
474
+ client.off('connect', onConnect);
475
+ client.off('error', onError);
476
+ };
477
+ client.on('connect', onConnect);
478
+ client.on('error', onError);
479
+ });
480
+ return client;
481
+ }
482
+ function resolveMqttConnect() {
483
+ const defaultExport = mqttModule.default;
484
+ const connect = mqttModule.connect
485
+ ?? defaultExport?.connect
486
+ ?? defaultExport;
487
+ if (typeof connect !== 'function') {
488
+ throw new Error('The loaded mqtt module does not expose a connect function');
489
+ }
490
+ return connect;
491
+ }
492
+ function subscribe(client, topic) {
493
+ return new Promise((resolve, reject) => {
494
+ client.subscribe(topic, (error) => {
495
+ if (error)
496
+ reject(error);
497
+ else
498
+ resolve();
499
+ });
500
+ });
501
+ }
502
+ function publish(client, topic, message) {
503
+ return new Promise((resolve, reject) => {
504
+ client.publish(topic, JSON.stringify(message), (error) => {
505
+ if (error)
506
+ reject(error);
507
+ else
508
+ resolve();
509
+ });
510
+ });
511
+ }
512
+ function endClient(client) {
513
+ return new Promise((resolve) => {
514
+ client.end(false, {}, () => resolve());
515
+ });
516
+ }
517
+ function parseSignalingMessage(payload) {
518
+ try {
519
+ const text = payload instanceof Uint8Array ? new TextDecoder().decode(payload) : String(payload);
520
+ const parsed = JSON.parse(text);
521
+ if (parsed?.protocol !== 'plat-css-v1' || typeof parsed.kind !== 'string' || typeof parsed.senderId !== 'string') {
522
+ return null;
523
+ }
524
+ return parsed;
525
+ }
526
+ catch {
527
+ return null;
528
+ }
529
+ }
530
+ function randomId(prefix) {
531
+ if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {
532
+ return `${prefix}-${crypto.randomUUID()}`;
533
+ }
534
+ return `${prefix}-${Math.random().toString(36).slice(2)}`;
535
+ }
536
+ function isDefaultMQTTWebRTCOptions(options) {
537
+ return Object.keys(options).length === 0;
538
+ }
539
+ function deferred() {
540
+ let resolve;
541
+ let reject;
542
+ const promise = new Promise((res, rej) => {
543
+ resolve = res;
544
+ reject = rej;
545
+ });
546
+ return { promise, resolve, reject };
547
+ }
548
+ async function resolveClientWebRTCImplementation() {
549
+ if (typeof RTCPeerConnection !== 'undefined') {
550
+ return {
551
+ RTCPeerConnection,
552
+ createSessionDescription: (description) => new RTCSessionDescription(description),
553
+ createIceCandidate: (candidate) => new RTCIceCandidate(candidate),
554
+ serializeIceCandidate: (candidate) => candidate.toJSON(),
555
+ };
556
+ }
557
+ try {
558
+ const dynamicImport = new Function('m', 'return import(m)');
559
+ const wrtcModule = await dynamicImport('@roamhq/wrtc');
560
+ const wrtc = wrtcModule.default ?? wrtcModule;
561
+ if (typeof wrtc?.RTCPeerConnection === 'function') {
562
+ return {
563
+ RTCPeerConnection: wrtc.RTCPeerConnection,
564
+ createSessionDescription: (description) => new wrtc.RTCSessionDescription(description),
565
+ createIceCandidate: (candidate) => new wrtc.RTCIceCandidate(candidate),
566
+ serializeIceCandidate: (candidate) => candidate.toJSON(),
567
+ };
568
+ }
569
+ }
570
+ catch (error) {
571
+ throw new Error(`Node css:// support requires @roamhq/wrtc to be available: ${error instanceof Error ? error.message : String(error)}`);
572
+ }
573
+ throw new Error('Node css:// support requires @roamhq/wrtc to expose RTCPeerConnection');
574
+ }
575
+ //# sourceMappingURL=mqtt-webrtc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt-webrtc.js","sourceRoot":"","sources":["../../../typescript/src/client-side-server/mqtt-webrtc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { PLATRPCEventKind } from '../rpc';
2
+ export interface ClientSideServerRequest {
3
+ jsonrpc: '2.0';
4
+ id: string;
5
+ operationId?: string;
6
+ method: string;
7
+ path: string;
8
+ headers?: Record<string, string>;
9
+ input?: unknown;
10
+ cancel?: boolean;
11
+ }
12
+ export interface ClientSideServerSuccessResponse {
13
+ jsonrpc: '2.0';
14
+ id: string;
15
+ ok: true;
16
+ result: unknown;
17
+ }
18
+ export interface ClientSideServerErrorResponse {
19
+ jsonrpc: '2.0';
20
+ id: string;
21
+ ok: false;
22
+ error: {
23
+ status?: number;
24
+ message: string;
25
+ data?: unknown;
26
+ };
27
+ }
28
+ export interface ClientSideServerEventMessage {
29
+ jsonrpc: '2.0';
30
+ id: string;
31
+ ok: true;
32
+ event: PLATRPCEventKind;
33
+ data?: unknown;
34
+ }
35
+ export interface ClientSideServerPeerMessage {
36
+ platcss: 'peer';
37
+ event: string;
38
+ data?: unknown;
39
+ fromPeerId?: string;
40
+ fromServerName?: string;
41
+ }
42
+ export type ClientSideServerResponse = ClientSideServerSuccessResponse | ClientSideServerErrorResponse;
43
+ export type ClientSideServerRPCMessage = ClientSideServerRequest | ClientSideServerResponse | ClientSideServerEventMessage;
44
+ export type ClientSideServerMessage = ClientSideServerRPCMessage | ClientSideServerPeerMessage;
45
+ export declare function isClientSideServerPeerMessage(message: ClientSideServerMessage): message is ClientSideServerPeerMessage;
46
+ export declare function isClientSideServerRequestMessage(message: ClientSideServerMessage): message is ClientSideServerRequest;
47
+ export declare function isClientSideServerEventMessage(message: ClientSideServerMessage): message is ClientSideServerEventMessage;
48
+ export declare function isClientSideServerResponseMessage(message: ClientSideServerMessage): message is ClientSideServerResponse;
49
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../typescript/src/client-side-server/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;IACR,KAAK,EAAE,gBAAgB,CAAA;IACvB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,wBAAwB,GAChC,+BAA+B,GAC/B,6BAA6B,CAAA;AAEjC,MAAM,MAAM,0BAA0B,GAClC,uBAAuB,GACvB,wBAAwB,GACxB,4BAA4B,CAAA;AAEhC,MAAM,MAAM,uBAAuB,GAC/B,0BAA0B,GAC1B,2BAA2B,CAAA;AAE/B,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,2BAA2B,CAEtH;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,uBAAuB,CAErH;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,4BAA4B,CAExH;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,IAAI,wBAAwB,CAErC"}