@livestore/webmesh 0.3.0-dev.4 → 0.3.0-dev.40

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 (69) hide show
  1. package/README.md +42 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/channel/direct-channel-internal.d.ts +26 -0
  4. package/dist/channel/direct-channel-internal.d.ts.map +1 -0
  5. package/dist/channel/direct-channel-internal.js +217 -0
  6. package/dist/channel/direct-channel-internal.js.map +1 -0
  7. package/dist/channel/direct-channel.d.ts +22 -0
  8. package/dist/channel/direct-channel.d.ts.map +1 -0
  9. package/dist/channel/direct-channel.js +153 -0
  10. package/dist/channel/direct-channel.js.map +1 -0
  11. package/dist/channel/proxy-channel.d.ts +3 -3
  12. package/dist/channel/proxy-channel.d.ts.map +1 -1
  13. package/dist/channel/proxy-channel.js +119 -37
  14. package/dist/channel/proxy-channel.js.map +1 -1
  15. package/dist/common.d.ts +47 -19
  16. package/dist/common.d.ts.map +1 -1
  17. package/dist/common.js +13 -5
  18. package/dist/common.js.map +1 -1
  19. package/dist/mesh-schema.d.ts +79 -13
  20. package/dist/mesh-schema.d.ts.map +1 -1
  21. package/dist/mesh-schema.js +59 -10
  22. package/dist/mesh-schema.js.map +1 -1
  23. package/dist/mod.d.ts +2 -2
  24. package/dist/mod.d.ts.map +1 -1
  25. package/dist/mod.js +2 -2
  26. package/dist/mod.js.map +1 -1
  27. package/dist/node.d.ts +51 -24
  28. package/dist/node.d.ts.map +1 -1
  29. package/dist/node.js +322 -111
  30. package/dist/node.js.map +1 -1
  31. package/dist/node.test.d.ts +1 -1
  32. package/dist/node.test.d.ts.map +1 -1
  33. package/dist/node.test.js +489 -157
  34. package/dist/node.test.js.map +1 -1
  35. package/dist/utils.d.ts +4 -4
  36. package/dist/utils.d.ts.map +1 -1
  37. package/dist/utils.js +7 -1
  38. package/dist/utils.js.map +1 -1
  39. package/dist/websocket-edge.d.ts +53 -0
  40. package/dist/websocket-edge.d.ts.map +1 -0
  41. package/dist/websocket-edge.js +89 -0
  42. package/dist/websocket-edge.js.map +1 -0
  43. package/package.json +10 -6
  44. package/src/channel/direct-channel-internal.ts +356 -0
  45. package/src/channel/direct-channel.ts +234 -0
  46. package/src/channel/proxy-channel.ts +344 -234
  47. package/src/common.ts +24 -17
  48. package/src/mesh-schema.ts +73 -20
  49. package/src/mod.ts +2 -2
  50. package/src/node.test.ts +723 -190
  51. package/src/node.ts +497 -152
  52. package/src/utils.ts +13 -2
  53. package/src/websocket-edge.ts +183 -0
  54. package/dist/channel/message-channel.d.ts +0 -20
  55. package/dist/channel/message-channel.d.ts.map +0 -1
  56. package/dist/channel/message-channel.js +0 -183
  57. package/dist/channel/message-channel.js.map +0 -1
  58. package/dist/websocket-connection.d.ts +0 -51
  59. package/dist/websocket-connection.d.ts.map +0 -1
  60. package/dist/websocket-connection.js +0 -74
  61. package/dist/websocket-connection.js.map +0 -1
  62. package/dist/websocket-server.d.ts +0 -7
  63. package/dist/websocket-server.d.ts.map +0 -1
  64. package/dist/websocket-server.js +0 -24
  65. package/dist/websocket-server.js.map +0 -1
  66. package/src/channel/message-channel.ts +0 -354
  67. package/src/websocket-connection.ts +0 -158
  68. package/src/websocket-server.ts +0 -40
  69. package/tsconfig.json +0 -11
package/src/common.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { type Effect, Schema } from '@livestore/utils/effect'
1
+ import { type Effect, Predicate, Schema } from '@livestore/utils/effect'
2
2
 
3
- import type { MessageChannelPacket, Packet, ProxyChannelPacket } from './mesh-schema.js'
3
+ import type { DirectChannelPacket, Packet, ProxyChannelPacket } from './mesh-schema.js'
4
4
 
5
5
  export type ProxyQueueItem = {
6
6
  packet: typeof ProxyChannelPacket.Type
@@ -8,29 +8,36 @@ export type ProxyQueueItem = {
8
8
  }
9
9
 
10
10
  export type MessageQueueItem = {
11
- packet: typeof MessageChannelPacket.Type
12
- respondToSender: (msg: typeof MessageChannelPacket.Type) => Effect.Effect<void>
11
+ packet: typeof DirectChannelPacket.Type
12
+ respondToSender: (msg: typeof DirectChannelPacket.Type) => Effect.Effect<void>
13
13
  }
14
14
 
15
15
  export type MeshNodeName = string
16
16
 
17
17
  export type ChannelName = string
18
- export type ChannelKey = `${MeshNodeName}-${ChannelName}`
18
+ export type ChannelKey = `target:${MeshNodeName}, channelName:${ChannelName}`
19
19
 
20
20
  // TODO actually use this to avoid timeouts in certain cases
21
- export class NoConnectionRouteSignal extends Schema.TaggedError<NoConnectionRouteSignal>()(
22
- 'NoConnectionRouteSignal',
23
- {},
24
- ) {}
25
-
26
- export class ConnectionAlreadyExistsError extends Schema.TaggedError<ConnectionAlreadyExistsError>()(
27
- 'ConnectionAlreadyExistsError',
28
- {
29
- target: Schema.String,
30
- },
31
- ) {}
21
+ // export class NoConnectionRouteSignal extends Schema.TaggedError<NoConnectionRouteSignal>()(
22
+ // 'NoConnectionRouteSignal',
23
+ // {},
24
+ // ) {}
25
+
26
+ export class EdgeAlreadyExistsError extends Schema.TaggedError<EdgeAlreadyExistsError>()('EdgeAlreadyExistsError', {
27
+ target: Schema.String,
28
+ }) {}
32
29
 
33
30
  export const packetAsOtelAttributes = (packet: typeof Packet.Type) => ({
34
31
  packetId: packet.id,
35
- ...(packet._tag !== 'MessageChannelResponseSuccess' && packet._tag !== 'ProxyChannelPayload' ? { packet } : {}),
32
+ 'span.label':
33
+ packet.id + (Predicate.hasProperty(packet, 'reqId') && packet.reqId !== undefined ? ` for ${packet.reqId}` : ''),
34
+ ...(packet._tag !== 'DirectChannelResponseSuccess' && packet._tag !== 'ProxyChannelPayload' ? { packet } : {}),
35
+ })
36
+
37
+ export const ListenForChannelResult = Schema.Struct({
38
+ channelName: Schema.String,
39
+ source: Schema.String,
40
+ mode: Schema.Union(Schema.Literal('proxy'), Schema.Literal('direct')),
36
41
  })
42
+
43
+ export type ListenForChannelResult = typeof ListenForChannelResult.Type
@@ -16,28 +16,40 @@ const defaultPacketFields = {
16
16
 
17
17
  const remainingHopsUndefined = Schema.Undefined.pipe(Schema.optional)
18
18
 
19
- // Needs to go through already existing MessageChannel connections, times out otherwise
20
- export class MessageChannelRequest extends Schema.TaggedStruct('MessageChannelRequest', {
19
+ /**
20
+ * Needs to go through already existing DirectChannel edges, times out otherwise
21
+ *
22
+ * Can't yet contain the `port` because the request might be duplicated while forwarding to multiple nodes.
23
+ * We need a clear path back to the sender to avoid this, thus we respond with a separate
24
+ * `DirectChannelResponseSuccess` which contains the `port`.
25
+ */
26
+ export class DirectChannelRequest extends Schema.TaggedStruct('DirectChannelRequest', {
21
27
  ...defaultPacketFields,
22
- remainingHops: remainingHopsUndefined,
28
+ remainingHops: Schema.Array(Schema.String).pipe(Schema.optional),
29
+ channelVersion: Schema.Number,
30
+ /** Only set if the request is in response to an incoming request */
31
+ reqId: Schema.UndefinedOr(Schema.String),
32
+ /**
33
+ * Additionally to the `source` field, we use this field to track whether the instance of a
34
+ * source has changed.
35
+ */
36
+ sourceId: Schema.String,
23
37
  }) {}
24
38
 
25
- export class MessageChannelResponseSuccess extends Schema.TaggedStruct('MessageChannelResponseSuccess', {
39
+ export class DirectChannelResponseSuccess extends Schema.TaggedStruct('DirectChannelResponseSuccess', {
26
40
  ...defaultPacketFields,
27
41
  reqId: Schema.String,
28
42
  port: Transferable.MessagePort,
29
43
  // Since we can't copy this message, we need to follow the exact route back to the sender
30
44
  remainingHops: Schema.Array(Schema.String),
45
+ channelVersion: Schema.Number,
31
46
  }) {}
32
47
 
33
- export class MessageChannelResponseNoTransferables extends Schema.TaggedStruct(
34
- 'MessageChannelResponseNoTransferables',
35
- {
36
- ...defaultPacketFields,
37
- reqId: Schema.String,
38
- remainingHops: Schema.Array(Schema.String),
39
- },
40
- ) {}
48
+ export class DirectChannelResponseNoTransferables extends Schema.TaggedStruct('DirectChannelResponseNoTransferables', {
49
+ ...defaultPacketFields,
50
+ reqId: Schema.String,
51
+ remainingHops: Schema.Array(Schema.String),
52
+ }) {}
41
53
 
42
54
  export class ProxyChannelRequest extends Schema.TaggedStruct('ProxyChannelRequest', {
43
55
  ...defaultPacketFields,
@@ -68,20 +80,51 @@ export class ProxyChannelPayloadAck extends Schema.TaggedStruct('ProxyChannelPay
68
80
  }) {}
69
81
 
70
82
  /**
71
- * Broadcast to all nodes when a new connection is added.
83
+ * Broadcast to all nodes when a new edge is added.
72
84
  * Mostly used for auto-reconnect purposes.
73
85
  */
74
- // TODO actually use for this use case
75
- export class NetworkConnectionAdded extends Schema.TaggedStruct('NetworkConnectionAdded', {
86
+ export class NetworkEdgeAdded extends Schema.TaggedStruct('NetworkEdgeAdded', {
76
87
  id,
77
88
  source: Schema.String,
78
89
  target: Schema.String,
79
90
  }) {}
80
91
 
81
- export class MessageChannelPacket extends Schema.Union(
82
- MessageChannelRequest,
83
- MessageChannelResponseSuccess,
84
- MessageChannelResponseNoTransferables,
92
+ export class NetworkTopologyRequest extends Schema.TaggedStruct('NetworkTopologyRequest', {
93
+ id,
94
+ hops: Schema.Array(Schema.String),
95
+ /** Always fixed to who requested the topology */
96
+ source: Schema.String,
97
+ target: Schema.Literal('-'),
98
+ }) {}
99
+
100
+ export class NetworkTopologyResponse extends Schema.TaggedStruct('NetworkTopologyResponse', {
101
+ id,
102
+ reqId: Schema.String,
103
+ remainingHops: Schema.Array(Schema.String),
104
+ nodeName: Schema.String,
105
+ edges: Schema.Array(Schema.String),
106
+ /** Always fixed to who requested the topology */
107
+ source: Schema.String,
108
+ target: Schema.Literal('-'),
109
+ }) {}
110
+
111
+ export const BroadcastChannelPacket = Schema.TaggedStruct('BroadcastChannelPacket', {
112
+ id,
113
+ channelName: Schema.String,
114
+ /**
115
+ * The payload is expected to be encoded/decoded by the send/listen schema.
116
+ * Transferables are not supported.
117
+ */
118
+ payload: Schema.Any,
119
+ hops: Schema.Array(Schema.String),
120
+ source: Schema.String,
121
+ target: Schema.Literal('-'),
122
+ })
123
+
124
+ export class DirectChannelPacket extends Schema.Union(
125
+ DirectChannelRequest,
126
+ DirectChannelResponseSuccess,
127
+ DirectChannelResponseNoTransferables,
85
128
  ) {}
86
129
 
87
130
  export class ProxyChannelPacket extends Schema.Union(
@@ -91,4 +134,14 @@ export class ProxyChannelPacket extends Schema.Union(
91
134
  ProxyChannelPayloadAck,
92
135
  ) {}
93
136
 
94
- export class Packet extends Schema.Union(MessageChannelPacket, ProxyChannelPacket, NetworkConnectionAdded) {}
137
+ export class Packet extends Schema.Union(
138
+ DirectChannelPacket,
139
+ ProxyChannelPacket,
140
+ NetworkEdgeAdded,
141
+ NetworkTopologyRequest,
142
+ NetworkTopologyResponse,
143
+ BroadcastChannelPacket,
144
+ ) {}
145
+
146
+ export class DirectChannelPing extends Schema.TaggedStruct('DirectChannelPing', {}) {}
147
+ export class DirectChannelPong extends Schema.TaggedStruct('DirectChannelPong', {}) {}
package/src/mod.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './websocket-connection.js'
1
+ export * from './websocket-edge.js'
2
2
  export * from './node.js'
3
3
  export * as WebmeshSchema from './mesh-schema.js'
4
- export { ConnectionAlreadyExistsError } from './common.js'
4
+ export { EdgeAlreadyExistsError } from './common.js'