@livestore/webmesh 0.3.0-dev.37 → 0.3.0-dev.39

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 (44) hide show
  1. package/README.md +19 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/channel/{message-channel-internal.d.ts → direct-channel-internal.d.ts} +7 -7
  4. package/dist/channel/direct-channel-internal.d.ts.map +1 -0
  5. package/dist/channel/{message-channel-internal.js → direct-channel-internal.js} +22 -22
  6. package/dist/channel/direct-channel-internal.js.map +1 -0
  7. package/dist/channel/{message-channel.d.ts → direct-channel.d.ts} +3 -3
  8. package/dist/channel/direct-channel.d.ts.map +1 -0
  9. package/dist/channel/{message-channel.js → direct-channel.js} +17 -17
  10. package/dist/channel/direct-channel.js.map +1 -0
  11. package/dist/channel/proxy-channel.d.ts.map +1 -1
  12. package/dist/channel/proxy-channel.js +84 -21
  13. package/dist/channel/proxy-channel.js.map +1 -1
  14. package/dist/common.d.ts +11 -5
  15. package/dist/common.d.ts.map +1 -1
  16. package/dist/common.js +6 -1
  17. package/dist/common.js.map +1 -1
  18. package/dist/mesh-schema.d.ts +15 -15
  19. package/dist/mesh-schema.d.ts.map +1 -1
  20. package/dist/mesh-schema.js +9 -9
  21. package/dist/mesh-schema.js.map +1 -1
  22. package/dist/node.d.ts +10 -5
  23. package/dist/node.d.ts.map +1 -1
  24. package/dist/node.js +68 -30
  25. package/dist/node.js.map +1 -1
  26. package/dist/node.test.js +114 -17
  27. package/dist/node.test.js.map +1 -1
  28. package/dist/websocket-edge.d.ts +2 -1
  29. package/dist/websocket-edge.d.ts.map +1 -1
  30. package/dist/websocket-edge.js +6 -2
  31. package/dist/websocket-edge.js.map +1 -1
  32. package/package.json +3 -4
  33. package/src/channel/{message-channel-internal.ts → direct-channel-internal.ts} +29 -29
  34. package/src/channel/{message-channel.ts → direct-channel.ts} +20 -20
  35. package/src/channel/proxy-channel.ts +107 -25
  36. package/src/common.ts +12 -4
  37. package/src/mesh-schema.ts +16 -19
  38. package/src/node.test.ts +185 -17
  39. package/src/node.ts +97 -35
  40. package/src/websocket-edge.ts +7 -1
  41. package/dist/channel/message-channel-internal.d.ts.map +0 -1
  42. package/dist/channel/message-channel-internal.js.map +0 -1
  43. package/dist/channel/message-channel.d.ts.map +0 -1
  44. package/dist/channel/message-channel.js.map +0 -1
package/src/node.ts CHANGED
@@ -15,9 +15,9 @@ import {
15
15
  WebChannel,
16
16
  } from '@livestore/utils/effect'
17
17
 
18
- import { makeMessageChannel } from './channel/message-channel.js'
18
+ import { makeDirectChannel } from './channel/direct-channel.js'
19
19
  import { makeProxyChannel } from './channel/proxy-channel.js'
20
- import type { ChannelKey, MeshNodeName, MessageQueueItem, ProxyQueueItem } from './common.js'
20
+ import type { ChannelKey, ListenForChannelResult, MeshNodeName, MessageQueueItem, ProxyQueueItem } from './common.js'
21
21
  import { EdgeAlreadyExistsError, packetAsOtelAttributes } from './common.js'
22
22
  import * as WebmeshSchema from './mesh-schema.js'
23
23
  import { TimeoutSet } from './utils.js'
@@ -63,8 +63,16 @@ export interface MeshNode<TName extends MeshNodeName = MeshNodeName> {
63
63
 
64
64
  removeEdge: (targetNodeName: MeshNodeName) => Effect.Effect<void, Cause.NoSuchElementException>
65
65
 
66
+ hasChannel: ({
67
+ target,
68
+ channelName,
69
+ }: {
70
+ target: MeshNodeName
71
+ channelName: string
72
+ }) => Effect.Effect<boolean, never, Scope.Scope>
73
+
66
74
  /**
67
- * Tries to broker a MessageChannel edge between the nodes, otherwise will proxy messages via hop-nodes
75
+ * Tries to broker a DirectChannel edge between the nodes, otherwise will proxy messages via hop-nodes
68
76
  *
69
77
  * For a channel to successfully open, both sides need to have a edge and call `makeChannel`.
70
78
  *
@@ -91,9 +99,9 @@ export interface MeshNode<TName extends MeshNodeName = MeshNodeName> {
91
99
  send: Schema.Schema<MsgSend, any>
92
100
  }
93
101
  /**
94
- * If possible, prefer using a MessageChannel with transferables (i.e. transferring memory instead of copying it).
102
+ * If possible, prefer using a DirectChannel with transferables (i.e. transferring memory instead of copying it).
95
103
  */
96
- mode: 'messagechannel' | 'proxy'
104
+ mode: 'direct' | 'proxy'
97
105
  /**
98
106
  * Amount of time before we consider a channel creation failed and retry when a new edge is available
99
107
  *
@@ -102,6 +110,8 @@ export interface MeshNode<TName extends MeshNodeName = MeshNodeName> {
102
110
  timeout?: Duration.DurationInput
103
111
  }) => Effect.Effect<WebChannel.WebChannel<MsgListen, MsgSend>, never, Scope.Scope>
104
112
 
113
+ listenForChannel: Stream.Stream<ListenForChannelResult>
114
+
105
115
  /**
106
116
  * Creates a WebChannel that is broadcasted to all connected nodes.
107
117
  * Messages won't be buffered for nodes that join the network after the broadcast channel has been created.
@@ -142,22 +152,26 @@ export const makeMeshNode = <TName extends MeshNodeName>(
142
152
  }
143
153
  >()
144
154
 
155
+ const channelRequestsQueue = yield* Queue.unbounded<ListenForChannelResult>().pipe(
156
+ Effect.acquireRelease(Queue.shutdown),
157
+ )
158
+
145
159
  type RequestId = string
146
160
  const topologyRequestsMap = new Map<RequestId, Map<MeshNodeName, Set<MeshNodeName>>>()
147
161
 
148
162
  type BroadcastChannelName = string
149
163
  const broadcastChannelListenQueueMap = new Map<BroadcastChannelName, Queue.Queue<any>>()
150
164
 
151
- const checkTransferableEdges = (packet: typeof WebmeshSchema.MessageChannelPacket.Type) => {
165
+ const checkTransferableEdges = (packet: typeof WebmeshSchema.DirectChannelPacket.Type) => {
152
166
  if (
153
- (packet._tag === 'MessageChannelRequest' &&
167
+ (packet._tag === 'DirectChannelRequest' &&
154
168
  (edgeChannels.size === 0 ||
155
169
  // Either if direct edge does not support transferables ...
156
170
  edgeChannels.get(packet.target)?.channel.supportsTransferables === false)) ||
157
171
  // ... or if no forward-edges support transferables
158
172
  ![...edgeChannels.values()].some((c) => c.channel.supportsTransferables === true)
159
173
  ) {
160
- return WebmeshSchema.MessageChannelResponseNoTransferables.make({
174
+ return WebmeshSchema.DirectChannelResponseNoTransferables.make({
161
175
  reqId: packet.id,
162
176
  channelName: packet.channelName,
163
177
  // NOTE for now we're "pretending" that the message is coming from the target node
@@ -274,6 +288,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
274
288
  if (edgeChannels.has(packet.target)) {
275
289
  const edgeChannel = edgeChannels.get(packet.target)!.channel
276
290
  const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName]
291
+ yield* Effect.annotateCurrentSpan({ hasDirectEdge: true })
277
292
  yield* edgeChannel.send({ ...packet, hops })
278
293
  }
279
294
  // In this case we have an expected route back we should follow
@@ -304,18 +319,22 @@ export const makeMeshNode = <TName extends MeshNodeName>(
304
319
  // Optimization: filter out edge where packet just came from
305
320
  const edgesToForwardTo = Array.from(edgeChannels)
306
321
  .filter(([name]) => name !== packet.source)
307
- .map(([_, con]) => con.channel)
322
+ .map(([name, con]) => ({ name, channel: con.channel }))
308
323
 
309
324
  // TODO if hops-depth=0, we should fail right away with no route found
310
325
  if (hops.length === 0 && edgesToForwardTo.length === 0 && LS_DEV) {
311
- console.log(nodeName, 'no route found', packet._tag, 'TODO handle better')
326
+ yield* Effect.logWarning(nodeName, 'no route found to', packet.target, packet._tag, 'TODO handle better')
312
327
  // TODO return a expected failure
313
328
  }
314
329
 
315
330
  const packetToSend = { ...packet, hops }
316
331
  // console.debug(nodeName, 'sendPacket:forwarding', packetToSend)
317
332
 
318
- yield* Effect.forEach(edgesToForwardTo, (con) => con.send(packetToSend), { concurrency: 'unbounded' })
333
+ yield* Effect.annotateCurrentSpan({ edgesToForwardTo: edgesToForwardTo.map(({ name }) => name) })
334
+
335
+ yield* Effect.forEach(edgesToForwardTo, ({ channel }) => channel.send(packetToSend), {
336
+ concurrency: 'unbounded',
337
+ })
319
338
  }
320
339
  }).pipe(
321
340
  Effect.withSpan(`sendPacket:${packet._tag}:${packet.source}→${packet.target}`, {
@@ -341,7 +360,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
341
360
  Effect.gen(function* () {
342
361
  const packet = yield* Schema.decodeUnknown(WebmeshSchema.Packet)(message)
343
362
 
344
- // console.debug(nodeName, 'received', packet._tag, packet.source, packet.target)
363
+ // console.debug(nodeName, 'recv', packet._tag, packet.source, packet.target)
345
364
 
346
365
  if (handledPacketIds.has(packet.id)) return
347
366
  handledPacketIds.add(packet.id)
@@ -359,13 +378,13 @@ export const makeMeshNode = <TName extends MeshNodeName>(
359
378
  const channelKey = `target:${packet.source}, channelName:${packet.channelName}` satisfies ChannelKey
360
379
 
361
380
  if (!channelMap.has(channelKey)) {
362
- const queue = yield* Queue.unbounded<MessageQueueItem | ProxyQueueItem>().pipe(
381
+ const channelQueue = yield* Queue.unbounded<MessageQueueItem | ProxyQueueItem>().pipe(
363
382
  Effect.acquireRelease(Queue.shutdown),
364
383
  )
365
- channelMap.set(channelKey, { queue, debugInfo: undefined })
384
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: undefined })
366
385
  }
367
386
 
368
- const queue = channelMap.get(channelKey)!.queue
387
+ const channelQueue = channelMap.get(channelKey)!.queue
369
388
 
370
389
  const respondToSender = (outgoingPacket: typeof WebmeshSchema.Packet.Type) =>
371
390
  edgeChannel
@@ -379,12 +398,20 @@ export const makeMeshNode = <TName extends MeshNodeName>(
379
398
  )
380
399
 
381
400
  if (Schema.is(WebmeshSchema.ProxyChannelPacket)(packet)) {
382
- yield* Queue.offer(queue, { packet, respondToSender })
383
- } else if (Schema.is(WebmeshSchema.MessageChannelPacket)(packet)) {
384
- yield* Queue.offer(queue, { packet, respondToSender })
401
+ yield* Queue.offer(channelQueue, { packet, respondToSender })
402
+ } else if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
403
+ yield* Queue.offer(channelQueue, { packet, respondToSender })
404
+ }
405
+
406
+ if (packet._tag === 'ProxyChannelRequest' || packet._tag === 'DirectChannelRequest') {
407
+ yield* Queue.offer(channelRequestsQueue, {
408
+ channelName: packet.channelName,
409
+ source: packet.source,
410
+ mode: packet._tag === 'ProxyChannelRequest' ? 'proxy' : 'direct',
411
+ })
385
412
  }
386
413
  } else {
387
- if (Schema.is(WebmeshSchema.MessageChannelPacket)(packet)) {
414
+ if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
388
415
  const noTransferableResponse = checkTransferableEdges(packet)
389
416
  if (noTransferableResponse !== undefined) {
390
417
  yield* Effect.spanEvent(`No transferable edges found for ${packet.source}→${packet.target}`)
@@ -417,7 +444,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
417
444
  })
418
445
  yield* sendPacket(edgeAddedPacket).pipe(Effect.orDie)
419
446
  }).pipe(
420
- Effect.annotateLogs({ 'addEdge:target': targetNodeName }),
447
+ Effect.annotateLogs({ 'addEdge:target': targetNodeName, nodeName }),
421
448
  Effect.withSpan(`addEdge:${nodeName}→${targetNodeName}`, {
422
449
  attributes: { supportsTransferables: edgeChannel.supportsTransferables },
423
450
  }),
@@ -434,13 +461,16 @@ export const makeMeshNode = <TName extends MeshNodeName>(
434
461
  edgeChannels.delete(targetNodeName)
435
462
  })
436
463
 
464
+ const hasChannel: MeshNode['hasChannel'] = ({ target, channelName }) =>
465
+ Effect.sync(() => channelMap.has(`target:${target}, channelName:${channelName}`))
466
+
437
467
  // TODO add heartbeat to detect dead edges (for both e2e and proxying)
438
468
  // TODO when a channel is established in the same origin, we can use a weblock to detect disconnects
439
469
  const makeChannel: MeshNode['makeChannel'] = ({
440
470
  target,
441
471
  channelName,
442
472
  schema: inputSchema,
443
- // TODO in the future we could have a mode that prefers messagechannels and then falls back to proxies if needed
473
+ // TODO in the future we could have a mode that prefers directs and then falls back to proxies if needed
444
474
  mode,
445
475
  timeout = Duration.seconds(1),
446
476
  }) =>
@@ -454,24 +484,24 @@ export const makeMeshNode = <TName extends MeshNodeName>(
454
484
  shouldNeverHappen(`Channel ${channelKey} already exists`, existingChannel)
455
485
  }
456
486
  } else {
457
- const queue = yield* Queue.unbounded<MessageQueueItem | ProxyQueueItem>().pipe(
487
+ const channelQueue = yield* Queue.unbounded<MessageQueueItem | ProxyQueueItem>().pipe(
458
488
  Effect.acquireRelease(Queue.shutdown),
459
489
  )
460
- channelMap.set(channelKey, { queue, debugInfo: undefined })
490
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: undefined })
461
491
  }
462
492
 
463
- const queue = channelMap.get(channelKey)!.queue as Queue.Queue<any>
493
+ const channelQueue = channelMap.get(channelKey)!.queue as Queue.Queue<any>
464
494
 
465
495
  yield* Effect.addFinalizer(() => Effect.sync(() => channelMap.delete(channelKey)))
466
496
 
467
- if (mode === 'messagechannel') {
497
+ if (mode === 'direct') {
468
498
  const incomingPacketsQueue = yield* Queue.unbounded<any>().pipe(Effect.acquireRelease(Queue.shutdown))
469
499
 
470
500
  // We're we're draining the queue into another new queue.
471
501
  // It's a bit of a mystery why this is needed, since the unit tests also work without it.
472
502
  // But for the LiveStore devtools to actually work, we need to do this.
473
503
  // We should figure out some day why this is needed and further simplify if possible.
474
- yield* Queue.takeBetween(queue, 1, 10).pipe(
504
+ yield* Queue.takeBetween(channelQueue, 1, 10).pipe(
475
505
  Effect.tap((_) => Queue.offerAll(incomingPacketsQueue, _)),
476
506
  Effect.forever,
477
507
  Effect.interruptible,
@@ -480,7 +510,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
480
510
  )
481
511
 
482
512
  // NOTE already retries internally when transferables are required
483
- const { webChannel, initialEdgeDeferred } = yield* makeMessageChannel({
513
+ const { webChannel, initialEdgeDeferred } = yield* makeDirectChannel({
484
514
  nodeName,
485
515
  incomingPacketsQueue,
486
516
  newEdgeAvailablePubSub,
@@ -491,7 +521,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
491
521
  checkTransferableEdges,
492
522
  })
493
523
 
494
- channelMap.set(channelKey, { queue, debugInfo: { channel: webChannel, target } })
524
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: { channel: webChannel, target } })
495
525
 
496
526
  yield* initialEdgeDeferred
497
527
 
@@ -503,11 +533,11 @@ export const makeMeshNode = <TName extends MeshNodeName>(
503
533
  target,
504
534
  channelName,
505
535
  schema,
506
- queue,
536
+ queue: channelQueue,
507
537
  sendPacket,
508
538
  })
509
539
 
510
- channelMap.set(channelKey, { queue, debugInfo: { channel, target } })
540
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: { channel, target } })
511
541
 
512
542
  return channel
513
543
  }
@@ -516,9 +546,34 @@ export const makeMeshNode = <TName extends MeshNodeName>(
516
546
  Effect.withSpanScoped(`makeChannel:${nodeName}→${target}(${channelName})`, {
517
547
  attributes: { target, channelName, mode, timeout },
518
548
  }),
519
- Effect.annotateLogs({ nodeName }),
549
+ Effect.annotateLogs({ nodeName, target, channelName }),
520
550
  )
521
551
 
552
+ // TODO consider supporting multiple listeners
553
+ // TODO also provide a way to allow for reconnects
554
+ let listenAlreadyStarted = false
555
+ const listenForChannel: MeshNode['listenForChannel'] = Stream.suspend(() => {
556
+ if (listenAlreadyStarted) {
557
+ return shouldNeverHappen('listenForChannel already started')
558
+ }
559
+ listenAlreadyStarted = true
560
+
561
+ const hash = (res: ListenForChannelResult) => `${res.channelName}:${res.source}:${res.mode}`
562
+ type HashedListenForChannelResult = string
563
+ const seen = new Set<HashedListenForChannelResult>()
564
+
565
+ return Stream.fromQueue(channelRequestsQueue).pipe(
566
+ Stream.filter((res) => {
567
+ const hashed = hash(res)
568
+ if (seen.has(hashed)) {
569
+ return false
570
+ }
571
+ seen.add(hashed)
572
+ return true
573
+ }),
574
+ )
575
+ })
576
+
522
577
  const makeBroadcastChannel: MeshNode['makeBroadcastChannel'] = ({ channelName, schema }) =>
523
578
  Effect.scopeWithCloseable((scope) =>
524
579
  Effect.gen(function* () {
@@ -560,7 +615,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
560
615
  send,
561
616
  listen,
562
617
  closedDeferred,
563
- supportsTransferables: true,
618
+ supportsTransferables: false,
564
619
  schema: { listen: schema, send: schema },
565
620
  shutdown: Scope.close(scope, Exit.void),
566
621
  debugInfo,
@@ -609,7 +664,7 @@ export const makeMeshNode = <TName extends MeshNodeName>(
609
664
  ping: (payload) => {
610
665
  Effect.gen(function* () {
611
666
  const msg = (via: string) =>
612
- WebChannel.DebugPingMessage.make({ message: `ping from ${nodeName} via edge ${via}`, payload })
667
+ WebChannel.DebugPingMessage.make({ message: `ping from ${nodeName} via ${via}`, payload })
613
668
 
614
669
  for (const [channelName, con] of edgeChannels) {
615
670
  yield* Effect.logDebug(`sending ping via edge ${channelName}`)
@@ -617,7 +672,11 @@ export const makeMeshNode = <TName extends MeshNodeName>(
617
672
  }
618
673
 
619
674
  for (const [channelKey, channel] of channelMap) {
620
- if (channel.debugInfo === undefined) continue
675
+ if (channel.debugInfo === undefined) {
676
+ yield* Effect.logDebug(`channel ${channelKey} has no debug info`)
677
+ continue
678
+ }
679
+ // if (channel.debugInfo === undefined) continue
621
680
  yield* Effect.logDebug(`sending ping via channel ${channelKey}`)
622
681
  yield* channel.debugInfo.channel.send(msg(`channel ${channelKey}`) as any)
623
682
  }
@@ -640,8 +699,9 @@ export const makeMeshNode = <TName extends MeshNodeName>(
640
699
  yield* Effect.logDebug(`Waiting ${timeoutMs}ms for topology response`)
641
700
  yield* Effect.sleep(timeoutMs)
642
701
 
702
+ yield* Effect.logDebug(`Topology response (from ${nodeName}):`)
643
703
  for (const [key, value] of item) {
644
- yield* Effect.logDebug(`node '${key}' is connected to: ${Array.from(value.values()).join(', ')}`)
704
+ yield* Effect.logDebug(` node '${key}' has edge to: ${Array.from(value.values()).join(', ')}`)
645
705
  }
646
706
  }).pipe(Effect.provide(runtime), Effect.tapCauseLogPretty, Effect.runPromise),
647
707
  }
@@ -650,7 +710,9 @@ export const makeMeshNode = <TName extends MeshNodeName>(
650
710
  nodeName,
651
711
  addEdge,
652
712
  removeEdge,
713
+ hasChannel,
653
714
  makeChannel,
715
+ listenForChannel,
654
716
  makeBroadcastChannel,
655
717
  edgeKeys,
656
718
  debug,
@@ -42,14 +42,16 @@ export type SocketType =
42
42
  export const connectViaWebSocket = ({
43
43
  node,
44
44
  url,
45
+ openTimeout,
45
46
  }: {
46
47
  node: MeshNode
47
48
  url: string
49
+ openTimeout?: number
48
50
  }): Effect.Effect<void, never, Scope.Scope | HttpClient.HttpClient> =>
49
51
  Effect.gen(function* () {
50
52
  const disconnected = yield* Deferred.make<void>()
51
53
 
52
- const socket = yield* Socket.makeWebSocket(url, { openTimeout: 50 })
54
+ const socket = yield* Socket.makeWebSocket(url, { openTimeout })
53
55
 
54
56
  const edgeChannel = yield* makeWebSocketEdge({
55
57
  socket,
@@ -106,6 +108,9 @@ export const makeWebSocketEdge = ({
106
108
  Stream.catchTag(
107
109
  'SocketError',
108
110
  Effect.fn(function* (error) {
111
+ // yield* Effect.logError(`[websocket-edge] Socket error`, error)
112
+ // In the case of the socket being closed, we're interrupting the stream
113
+ // and close the WebChannel (which can be observed from the outside)
109
114
  if (error.reason === 'Close') {
110
115
  yield* isConnectedLatch.close
111
116
  yield* Deferred.succeed(closedDeferred, undefined)
@@ -123,6 +128,7 @@ export const makeWebSocketEdge = ({
123
128
  yield* Deferred.succeed(fromDeferred, msg.from)
124
129
  } else {
125
130
  const decodedPayload = yield* Schema.decode(schema.listen)(msg.payload)
131
+ // yield* Effect.logDebug(`[websocket-edge] recv from ${msg.from}: ${decodedPayload._tag}`, decodedPayload)
126
132
  yield* Queue.offer(listenQueue, decodedPayload)
127
133
  }
128
134
  }),
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-channel-internal.d.ts","sourceRoot":"","sources":["../../src/channel/message-channel-internal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAEL,MAAM,EAIN,KAAK,EAEL,KAAK,EAEL,UAAU,EACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAA0B,MAAM,cAAc,CAAA;AACjH,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAA;IACtB,kDAAkD;IAClD,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACnD,sBAAsB,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACnD,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxF,sBAAsB,EAAE,CACtB,MAAM,EAAE,OAAO,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAChD,OAAO,UAAU,CAAC,qCAAqC,CAAC,IAAI,GAAG,SAAS,CAAA;IAC7E,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CACpD;AAOD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,gJAWxC,sBAAsB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,6EAA6E;IAC7E,KAAK,EAAE,KAAK,CAAC,cAAc,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;CACjB,KAAG,MAAM,CAAC,MAAM,CACf,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/B,OAAO,UAAU,CAAC,qCAAqC,CAAC,IAAI,EAC5D,KAAK,CAAC,KAAK,CAuS2D,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-channel-internal.js","sourceRoot":"","sources":["../../src/channel/message-channel-internal.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-channel.d.ts","sourceRoot":"","sources":["../../src/channel/message-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,MAAM,EAMN,KAAK,EAGL,UAAU,EACX,MAAM,yBAAyB,CAAA;AAIhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAG3E;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,8HAShC,sBAAsB;gBAyLS,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;;sBAI9D,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-channel.js","sourceRoot":"","sources":["../../src/channel/message-channel.ts"],"names":[],"mappings":"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"}