@welshman/net 0.1.1 → 0.2.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/dist/lib/src/Deferred.d.ts +21 -0
  3. package/dist/lib/src/Deferred.d.ts.map +1 -0
  4. package/dist/lib/src/Deferred.js +21 -0
  5. package/dist/lib/src/Deferred.js.map +1 -0
  6. package/dist/lib/src/Emitter.d.ts +14 -0
  7. package/dist/lib/src/Emitter.d.ts.map +1 -0
  8. package/dist/lib/src/Emitter.js +18 -0
  9. package/dist/lib/src/Emitter.js.map +1 -0
  10. package/dist/lib/src/LRUCache.d.ts +42 -0
  11. package/dist/lib/src/LRUCache.d.ts.map +1 -0
  12. package/dist/lib/src/LRUCache.js +62 -0
  13. package/dist/lib/src/LRUCache.js.map +1 -0
  14. package/dist/lib/src/TaskQueue.d.ts +20 -0
  15. package/dist/lib/src/TaskQueue.d.ts.map +1 -0
  16. package/dist/lib/src/TaskQueue.js +57 -0
  17. package/dist/lib/src/TaskQueue.js.map +1 -0
  18. package/dist/lib/src/Tools.d.ts +727 -0
  19. package/dist/lib/src/Tools.d.ts.map +1 -0
  20. package/dist/lib/src/Tools.js +1224 -0
  21. package/dist/lib/src/Tools.js.map +1 -0
  22. package/dist/lib/src/index.d.ts +7 -0
  23. package/dist/lib/src/index.d.ts.map +1 -0
  24. package/dist/lib/src/index.js +7 -0
  25. package/dist/lib/src/index.js.map +1 -0
  26. package/dist/lib/src/normalize-url/index.d.ts +286 -0
  27. package/dist/lib/src/normalize-url/index.d.ts.map +1 -0
  28. package/dist/lib/src/normalize-url/index.js +252 -0
  29. package/dist/lib/src/normalize-url/index.js.map +1 -0
  30. package/{build → dist/net}/src/adapter.d.ts +5 -7
  31. package/dist/net/src/adapter.d.ts.map +1 -0
  32. package/dist/net/src/adapter.js.map +1 -0
  33. package/{build → dist/net}/src/auth.d.ts +7 -21
  34. package/dist/net/src/auth.d.ts.map +1 -0
  35. package/{build → dist/net}/src/auth.js +35 -58
  36. package/dist/net/src/auth.js.map +1 -0
  37. package/{build → dist/net}/src/context.d.ts +3 -0
  38. package/dist/net/src/context.d.ts.map +1 -0
  39. package/{build → dist/net}/src/context.js +3 -3
  40. package/dist/net/src/context.js.map +1 -0
  41. package/{build → dist/net}/src/diff.d.ts +3 -4
  42. package/dist/net/src/diff.d.ts.map +1 -0
  43. package/{build → dist/net}/src/diff.js +11 -13
  44. package/dist/net/src/diff.js.map +1 -0
  45. package/{build → dist/net}/src/index.d.ts +1 -0
  46. package/dist/net/src/index.d.ts.map +1 -0
  47. package/dist/net/src/index.js.map +1 -0
  48. package/{build → dist/net}/src/message.d.ts +1 -0
  49. package/dist/net/src/message.d.ts.map +1 -0
  50. package/dist/net/src/message.js.map +1 -0
  51. package/{build → dist/net}/src/negentropy.d.ts +2 -1
  52. package/dist/net/src/negentropy.d.ts.map +1 -0
  53. package/{build → dist/net}/src/negentropy.js +42 -18
  54. package/dist/net/src/negentropy.js.map +1 -0
  55. package/{build → dist/net}/src/policy.d.ts +16 -8
  56. package/dist/net/src/policy.d.ts.map +1 -0
  57. package/{build → dist/net}/src/policy.js +61 -83
  58. package/dist/net/src/policy.js.map +1 -0
  59. package/{build → dist/net}/src/pool.d.ts +2 -1
  60. package/dist/net/src/pool.d.ts.map +1 -0
  61. package/{build → dist/net}/src/pool.js +8 -8
  62. package/dist/net/src/pool.js.map +1 -0
  63. package/dist/net/src/publish.d.ts +44 -0
  64. package/dist/net/src/publish.d.ts.map +1 -0
  65. package/dist/net/src/publish.js +96 -0
  66. package/dist/net/src/publish.js.map +1 -0
  67. package/dist/net/src/request.d.ts +55 -0
  68. package/dist/net/src/request.d.ts.map +1 -0
  69. package/dist/net/src/request.js +212 -0
  70. package/dist/net/src/request.js.map +1 -0
  71. package/{build → dist/net}/src/socket.d.ts +11 -9
  72. package/dist/net/src/socket.d.ts.map +1 -0
  73. package/{build → dist/net}/src/socket.js +15 -8
  74. package/dist/net/src/socket.js.map +1 -0
  75. package/{build → dist/net}/src/tracker.d.ts +1 -0
  76. package/dist/net/src/tracker.d.ts.map +1 -0
  77. package/dist/net/src/tracker.js.map +1 -0
  78. package/dist/net/src/util.d.ts +2 -0
  79. package/dist/net/src/util.d.ts.map +1 -0
  80. package/{build → dist/net}/src/util.js.map +1 -1
  81. package/dist/relay/src/index.d.ts +3 -0
  82. package/dist/relay/src/index.d.ts.map +1 -0
  83. package/dist/relay/src/index.js +3 -0
  84. package/dist/relay/src/index.js.map +1 -0
  85. package/dist/relay/src/relay.d.ts +13 -0
  86. package/dist/relay/src/relay.d.ts.map +1 -0
  87. package/dist/relay/src/relay.js +48 -0
  88. package/dist/relay/src/relay.js.map +1 -0
  89. package/dist/relay/src/repository.d.ts +63 -0
  90. package/dist/relay/src/repository.d.ts.map +1 -0
  91. package/dist/relay/src/repository.js +270 -0
  92. package/dist/relay/src/repository.js.map +1 -0
  93. package/dist/tsconfig.build.tsbuildinfo +1 -0
  94. package/dist/util/src/Address.d.ts +21 -0
  95. package/dist/util/src/Address.d.ts.map +1 -0
  96. package/dist/util/src/Address.js +43 -0
  97. package/dist/util/src/Address.js.map +1 -0
  98. package/dist/util/src/Encryptable.d.ts +34 -0
  99. package/dist/util/src/Encryptable.d.ts.map +1 -0
  100. package/dist/util/src/Encryptable.js +52 -0
  101. package/dist/util/src/Encryptable.js.map +1 -0
  102. package/dist/util/src/Events.d.ts +77 -0
  103. package/dist/util/src/Events.d.ts.map +1 -0
  104. package/dist/util/src/Events.js +63 -0
  105. package/dist/util/src/Events.js.map +1 -0
  106. package/dist/util/src/Filters.d.ts +48 -0
  107. package/dist/util/src/Filters.d.ts.map +1 -0
  108. package/dist/util/src/Filters.js +185 -0
  109. package/dist/util/src/Filters.js.map +1 -0
  110. package/dist/util/src/Handler.d.ts +17 -0
  111. package/dist/util/src/Handler.d.ts.map +1 -0
  112. package/dist/util/src/Handler.js +33 -0
  113. package/dist/util/src/Handler.js.map +1 -0
  114. package/dist/util/src/Kinds.d.ts +159 -0
  115. package/dist/util/src/Kinds.d.ts.map +1 -0
  116. package/dist/util/src/Kinds.js +160 -0
  117. package/dist/util/src/Kinds.js.map +1 -0
  118. package/dist/util/src/Links.d.ts +3 -0
  119. package/dist/util/src/Links.d.ts.map +1 -0
  120. package/dist/util/src/Links.js +3 -0
  121. package/dist/util/src/Links.js.map +1 -0
  122. package/dist/util/src/List.d.ts +34 -0
  123. package/dist/util/src/List.d.ts.map +1 -0
  124. package/dist/util/src/List.js +74 -0
  125. package/dist/util/src/List.js.map +1 -0
  126. package/dist/util/src/Profile.d.ts +26 -0
  127. package/dist/util/src/Profile.d.ts.map +1 -0
  128. package/dist/util/src/Profile.js +50 -0
  129. package/dist/util/src/Profile.js.map +1 -0
  130. package/dist/util/src/Relay.d.ts +32 -0
  131. package/dist/util/src/Relay.d.ts.map +1 -0
  132. package/dist/util/src/Relay.js +49 -0
  133. package/dist/util/src/Relay.js.map +1 -0
  134. package/dist/util/src/Tags.d.ts +32 -0
  135. package/dist/util/src/Tags.d.ts.map +1 -0
  136. package/dist/util/src/Tags.js +74 -0
  137. package/dist/util/src/Tags.js.map +1 -0
  138. package/dist/util/src/Zaps.d.ts +20 -0
  139. package/dist/util/src/Zaps.d.ts.map +1 -0
  140. package/dist/util/src/Zaps.js +93 -0
  141. package/dist/util/src/Zaps.js.map +1 -0
  142. package/dist/util/src/index.d.ts +13 -0
  143. package/dist/util/src/index.d.ts.map +1 -0
  144. package/dist/util/src/index.js +13 -0
  145. package/dist/util/src/index.js.map +1 -0
  146. package/package.json +18 -21
  147. package/README.md +0 -61
  148. package/build/src/adapter.js.map +0 -1
  149. package/build/src/auth.js.map +0 -1
  150. package/build/src/context.js.map +0 -1
  151. package/build/src/diff.js.map +0 -1
  152. package/build/src/index.js.map +0 -1
  153. package/build/src/message.js.map +0 -1
  154. package/build/src/negentropy.js.map +0 -1
  155. package/build/src/policy.js.map +0 -1
  156. package/build/src/pool.js.map +0 -1
  157. package/build/src/publish.d.ts +0 -60
  158. package/build/src/publish.js +0 -120
  159. package/build/src/publish.js.map +0 -1
  160. package/build/src/request.d.ts +0 -79
  161. package/build/src/request.js +0 -191
  162. package/build/src/request.js.map +0 -1
  163. package/build/src/socket.js.map +0 -1
  164. package/build/src/tracker.js.map +0 -1
  165. package/build/src/util.d.ts +0 -3
  166. package/build/tsconfig.tsbuildinfo +0 -1
  167. /package/{build → dist/net}/src/adapter.js +0 -0
  168. /package/{build → dist/net}/src/index.js +0 -0
  169. /package/{build → dist/net}/src/message.js +0 -0
  170. /package/{build → dist/net}/src/tracker.js +0 -0
  171. /package/{build → dist/net}/src/util.js +0 -0
@@ -1,16 +1,13 @@
1
+ import { StampedEvent, SignedEvent } from "@welshman/util";
1
2
  import { Socket } from "./socket.js";
2
3
  /**
3
- * Defers sending messages when a challenge has been presented and not answered yet
4
+ * Handles auth-related message management:
5
+ * - Defers sending messages when a challenge is pending
6
+ * - Re-enqueues event/req messages once if rejected due to auth-required
4
7
  * @param socket - a Socket object
5
8
  * @return a cleanup function
6
9
  */
7
- export declare const socketPolicyDeferOnAuth: (socket: Socket) => () => void;
8
- /**
9
- * Re-enqueues event/req messages once if rejected due to auth-required
10
- * @param socket - a Socket object
11
- * @return a cleanup function
12
- */
13
- export declare const socketPolicyRetryAuthRequired: (socket: Socket) => () => void;
10
+ export declare const socketPolicyAuthBuffer: (socket: Socket) => () => void;
14
11
  /**
15
12
  * Auto-connects a closed socket when a message is sent unless there was a recent error
16
13
  * @param socket - a Socket object
@@ -29,4 +26,15 @@ export declare const socketPolicyCloseOnTimeout: (socket: Socket) => () => void;
29
26
  * @return a cleanup function
30
27
  */
31
28
  export declare const socketPolicyReopenActive: (socket: Socket) => () => void;
29
+ export type SocketPolicyAuthOptions = {
30
+ sign: (event: StampedEvent) => Promise<SignedEvent>;
31
+ shouldAuth?: (socket: Socket) => boolean;
32
+ };
33
+ /**
34
+ * Factory function for a policy which may authenticate the socket
35
+ * @param options - SocketPolicyAuthOptions object
36
+ * @return a socket policy
37
+ */
38
+ export declare const makeSocketPolicyAuth: (options: SocketPolicyAuthOptions) => (socket: Socket) => () => void;
32
39
  export declare const defaultSocketPolicies: ((socket: Socket) => () => void)[];
40
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,YAAY,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAanE,OAAO,EAAC,MAAM,EAA4B,MAAM,aAAa,CAAA;AAG7D;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,eAuDpD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,eAmBvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,MAAM,eAsBxD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,eA0CtD,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;IACnD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;CACzC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,uBAAuB,MAAM,QAAQ,MAAM,eAcxF,CAAA;AAED,eAAO,MAAM,qBAAqB,YA3La,MAAM,kBAgMpD,CAAA"}
@@ -1,99 +1,63 @@
1
- import { on, call, sleep, spec, ago, now } from "@welshman/lib";
1
+ import { on, nthNe, always, call, sleep, ago, now } from "@welshman/lib";
2
2
  import { AUTH_JOIN } from "@welshman/util";
3
- import { isClientAuth, isClientClose, isClientEvent, isClientReq, ClientMessageType, isRelayOk, isRelayClosed, } from "./message.js";
3
+ import { isClientAuth, isClientClose, isClientEvent, isClientReq, isClientNegClose, isRelayOk, isRelayEose, isRelayClosed, } from "./message.js";
4
4
  import { SocketStatus, SocketEvent } from "./socket.js";
5
- import { AuthState, AuthStatus, AuthStateEvent } from "./auth.js";
5
+ import { AuthStatus, AuthStateEvent } from "./auth.js";
6
6
  /**
7
- * Defers sending messages when a challenge has been presented and not answered yet
7
+ * Handles auth-related message management:
8
+ * - Defers sending messages when a challenge is pending
9
+ * - Re-enqueues event/req messages once if rejected due to auth-required
8
10
  * @param socket - a Socket object
9
11
  * @return a cleanup function
10
12
  */
11
- export const socketPolicyDeferOnAuth = (socket) => {
12
- const buffer = [];
13
- const authState = new AuthState(socket);
14
- const okStatuses = [AuthStatus.None, AuthStatus.Ok];
13
+ export const socketPolicyAuthBuffer = (socket) => {
14
+ const { None, Ok, DeniedSignature, Forbidden } = AuthStatus;
15
+ const terminalStatuses = [Ok, DeniedSignature, Forbidden];
16
+ let buffer = [];
15
17
  const unsubscribers = [
16
- // Pause sending certain messages when we're not authenticated
17
- on(socket, SocketEvent.Enqueue, (message) => {
18
- // If we're closing a request, but it never got sent, remove both from the queue
19
- // Otherwise, always send CLOSE
20
- if (isClientClose(message)) {
21
- const req = buffer.find(spec([ClientMessageType.Req, message[1]]));
22
- if (req) {
23
- socket._sendQueue.remove(req);
24
- socket._sendQueue.remove(message);
25
- }
26
- return;
27
- }
18
+ on(socket, SocketEvent.Sending, (message) => {
28
19
  // Always allow sending auth
29
20
  if (isClientAuth(message))
30
21
  return;
31
22
  // Always allow sending join requests
32
23
  if (isClientEvent(message) && message[1].kind === AUTH_JOIN)
33
24
  return;
34
- // If we're not ok, remove the message and save it for later
35
- if (!okStatuses.includes(authState.status)) {
36
- buffer.push(message);
37
- socket._sendQueue.remove(message);
25
+ // If the auth flow is complete, no need to buffer anymore
26
+ if (terminalStatuses.includes(socket.auth.status))
27
+ return;
28
+ // If the client is closing a req, remove both from our buffer
29
+ // Otherwise, if auth isn't done, hang on to recent messages in case we need to replay them
30
+ if (isClientClose(message) || isClientNegClose(message)) {
31
+ buffer = buffer.filter(nthNe(1, message[1]));
38
32
  }
39
- }),
40
- // Send buffered messages when we get successful auth
41
- on(authState, AuthStateEvent.Status, (status) => {
42
- if (okStatuses.includes(status) && buffer.length > 0) {
43
- for (const message of buffer.splice(0)) {
44
- socket.send(message);
45
- }
33
+ else {
34
+ buffer = buffer.slice(-50).concat([message]);
46
35
  }
47
36
  }),
48
- ];
49
- return () => {
50
- unsubscribers.forEach(call);
51
- authState.cleanup();
52
- };
53
- };
54
- /**
55
- * Re-enqueues event/req messages once if rejected due to auth-required
56
- * @param socket - a Socket object
57
- * @return a cleanup function
58
- */
59
- export const socketPolicyRetryAuthRequired = (socket) => {
60
- const retried = new Set();
61
- const pending = new Map();
62
- const unsubscribers = [
63
- // Watch outgoing events and requests and keep a copy
64
- on(socket, SocketEvent.Send, (message) => {
65
- if (isClientEvent(message)) {
66
- const [_, event] = message;
67
- if (!retried.has(event.id) && event.kind !== AUTH_JOIN) {
68
- pending.set(event.id, message);
69
- }
37
+ on(socket, SocketEvent.Receiving, (message) => {
38
+ // If the client is closing a request during auth, don't tell the caller, we'll retry it
39
+ if (isRelayClosed(message) && message[2]?.startsWith("auth-required:")) {
40
+ socket._recvQueue.remove(message);
70
41
  }
71
- if (isClientReq(message)) {
72
- const [_, id] = message;
73
- if (!retried.has(id)) {
74
- pending.set(id, message);
75
- }
42
+ // If we get an eose but we're in the middle of authenticating, wait
43
+ if (isRelayEose(message) && ![None, Ok].includes(socket.auth.status)) {
44
+ socket._recvQueue.remove(message);
45
+ }
46
+ // If the client is rejecting an event during auth, don't tell the caller, we'll retry it
47
+ if (isRelayOk(message) && !message[2] && message[3]?.startsWith("auth-required:")) {
48
+ socket._recvQueue.remove(message);
76
49
  }
77
50
  }),
78
- // If a message is rejected with auth-required, re-enqueue it one time
79
- on(socket, SocketEvent.Receive, (message) => {
80
- if (isRelayOk(message)) {
81
- const [_, id, ok, detail] = message;
82
- const pendingMessage = pending.get(id);
83
- if (pendingMessage && !ok && detail?.startsWith("auth-required:")) {
84
- socket.send(pendingMessage);
85
- retried.add(id);
86
- }
87
- pending.delete(id);
88
- }
89
- if (isRelayClosed(message)) {
90
- const [_, id, detail] = message;
91
- const pendingMessage = pending.get(id);
92
- if (pendingMessage && detail?.startsWith("auth-required:")) {
93
- socket.send(pendingMessage);
94
- retried.add(id);
51
+ on(socket.auth, AuthStateEvent.Status, (status) => {
52
+ // Send buffered messages when we get successful auth. In any case, clear them out
53
+ // if the auth flow is complete
54
+ if (status === Ok) {
55
+ for (const message of buffer.splice(0)) {
56
+ socket.send(message);
95
57
  }
96
- pending.delete(id);
58
+ }
59
+ else if (terminalStatuses.includes(socket.auth.status)) {
60
+ buffer = [];
97
61
  }
98
62
  }),
99
63
  ];
@@ -106,19 +70,16 @@ export const socketPolicyRetryAuthRequired = (socket) => {
106
70
  */
107
71
  export const socketPolicyConnectOnSend = (socket) => {
108
72
  let lastError = 0;
109
- let currentStatus = SocketStatus.Closed;
110
73
  const unsubscribers = [
111
74
  on(socket, SocketEvent.Status, (newStatus) => {
112
75
  // Keep track of the most recent error
113
76
  if (newStatus === SocketStatus.Error) {
114
77
  lastError = now();
115
78
  }
116
- // Keep track of the current status
117
- currentStatus = newStatus;
118
79
  }),
119
- on(socket, SocketEvent.Enqueue, (message) => {
80
+ on(socket, SocketEvent.Sending, (message) => {
120
81
  // When a new message is sent, make sure the socket is open (unless there was a recent error)
121
- if (currentStatus === SocketStatus.Closed && lastError < ago(30)) {
82
+ if (socket.status === SocketStatus.Closed && lastError < ago(30)) {
122
83
  socket.open();
123
84
  }
124
85
  }),
@@ -192,9 +153,26 @@ export const socketPolicyReopenActive = (socket) => {
192
153
  ];
193
154
  return () => unsubscribers.forEach(call);
194
155
  };
156
+ /**
157
+ * Factory function for a policy which may authenticate the socket
158
+ * @param options - SocketPolicyAuthOptions object
159
+ * @return a socket policy
160
+ */
161
+ export const makeSocketPolicyAuth = (options) => (socket) => {
162
+ const shouldAuth = options.shouldAuth || always(true);
163
+ const unsubscribers = [
164
+ on(socket.auth, AuthStateEvent.Status, (status) => {
165
+ if (status === AuthStatus.Requested && shouldAuth(socket)) {
166
+ socket.auth.doAuth(options.sign);
167
+ }
168
+ }),
169
+ ];
170
+ return () => {
171
+ unsubscribers.forEach(call);
172
+ };
173
+ };
195
174
  export const defaultSocketPolicies = [
196
- socketPolicyDeferOnAuth,
197
- socketPolicyRetryAuthRequired,
175
+ socketPolicyAuthBuffer,
198
176
  socketPolicyConnectOnSend,
199
177
  socketPolicyCloseOnTimeout,
200
178
  socketPolicyReopenActive,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/policy.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export declare class Pool {
9
9
  readonly options: PoolOptions;
10
10
  _data: Map<string, Socket>;
11
11
  _subs: PoolSubscription[];
12
- static getSingleton(): Pool;
12
+ static get(): Pool;
13
13
  constructor(options?: PoolOptions);
14
14
  has(url: string): boolean;
15
15
  makeSocket(url: string): Socket;
@@ -18,3 +18,4 @@ export declare class Pool {
18
18
  remove(url: string): void;
19
19
  clear(): void;
20
20
  }
21
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAGlC,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,6CAAgC,WAQvE,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;AAEvD,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CACrC,CAAA;AAED,eAAO,IAAI,aAAa,EAAE,IAAI,CAAA;AAE9B,qBAAa,IAAI;IAYH,QAAQ,CAAC,OAAO,EAAE,WAAW;IAXzC,KAAK,sBAA4B;IACjC,KAAK,EAAE,gBAAgB,EAAE,CAAK;IAE9B,MAAM,CAAC,GAAG;gBAQW,OAAO,GAAE,WAAgB;IAE9C,GAAG,CAAC,GAAG,EAAE,MAAM;IAIf,UAAU,CAAC,GAAG,EAAE,MAAM;IAQtB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmBzB,SAAS,CAAC,EAAE,EAAE,gBAAgB;IAQ9B,MAAM,CAAC,GAAG,EAAE,MAAM;IAUlB,KAAK;CAKN"}
@@ -14,7 +14,7 @@ export class Pool {
14
14
  options;
15
15
  _data = new Map();
16
16
  _subs = [];
17
- static getSingleton() {
17
+ static get() {
18
18
  if (!poolSingleton) {
19
19
  poolSingleton = new Pool();
20
20
  }
@@ -34,16 +34,16 @@ export class Pool {
34
34
  }
35
35
  get(_url) {
36
36
  const url = normalizeRelayUrl(_url);
37
- const oldSocket = this._data.get(url);
38
- if (oldSocket) {
39
- return oldSocket;
37
+ const socket = this._data.get(url);
38
+ if (socket) {
39
+ return socket;
40
40
  }
41
- const socket = this.makeSocket(url);
42
- this._data.set(url, socket);
41
+ const newSocket = this.makeSocket(url);
42
+ this._data.set(url, newSocket);
43
43
  for (const cb of this._subs) {
44
- cb(socket);
44
+ cb(newSocket);
45
45
  }
46
- return socket;
46
+ return newSocket;
47
47
  }
48
48
  subscribe(cb) {
49
49
  this._subs.push(cb);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAA;AACpC,OAAO,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,QAAQ,GAAG,qBAAqB,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;IAE9B,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAQD,MAAM,CAAC,IAAI,aAAmB,CAAA;AAE9B,MAAM,OAAO,IAAI;IAYM;IAXrB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACjC,KAAK,GAAuB,EAAE,CAAA;IAE9B,MAAM,CAAC,GAAG;QACR,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,IAAI,IAAI,EAAE,CAAA;QAC5B,CAAC;QAED,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,YAAqB,UAAuB,EAAE;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAElD,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACrC,CAAC;QAED,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAElC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAEtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAE9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,CAAA;QACf,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,SAAS,CAAC,EAAoB;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEnB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAElC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,EAAE,CAAA;YAEhB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,KAAK;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ import { SignedEvent } from "@welshman/util";
2
+ import { AdapterContext } from "./adapter.js";
3
+ export declare enum PublishStatus {
4
+ Sending = "publish:status:sending",
5
+ Pending = "publish:status:pending",
6
+ Success = "publish:status:success",
7
+ Failure = "publish:status:failure",
8
+ Timeout = "publish:status:timeout",
9
+ Aborted = "publish:status:aborted"
10
+ }
11
+ export type PublishResult = {
12
+ status: PublishStatus;
13
+ detail: string;
14
+ };
15
+ export type PublishOneOptions = {
16
+ event: SignedEvent;
17
+ relay: string;
18
+ signal?: AbortSignal;
19
+ timeout?: number;
20
+ context?: AdapterContext;
21
+ onSuccess?: (detail: string) => void;
22
+ onFailure?: (detail: string) => void;
23
+ onPending?: () => void;
24
+ onTimeout?: () => void;
25
+ onAborted?: () => void;
26
+ onComplete?: () => void;
27
+ };
28
+ export declare const publishOne: (options: PublishOneOptions) => Promise<unknown>;
29
+ export type PublishStatusByRelay = Record<string, PublishStatus>;
30
+ export type PublishOptions = {
31
+ event: SignedEvent;
32
+ relays: string[];
33
+ signal?: AbortSignal;
34
+ timeout?: number;
35
+ context?: AdapterContext;
36
+ onSuccess?: (detail: string, relay: string) => void;
37
+ onFailure?: (detail: string, relay: string) => void;
38
+ onPending?: (relay: string) => void;
39
+ onTimeout?: (relay: string) => void;
40
+ onAborted?: (relay: string) => void;
41
+ onComplete?: () => void;
42
+ };
43
+ export declare const publish: (options: PublishOptions) => Promise<PublishStatusByRelay>;
44
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAe,cAAc,EAAa,MAAM,cAAc,CAAA;AAErE,oBAAY,aAAa;IACvB,OAAO,2BAA2B;IAClC,OAAO,2BAA2B;IAClC,OAAO,2BAA2B;IAClC,OAAO,2BAA2B;IAClC,OAAO,2BAA2B;IAClC,OAAO,2BAA2B;CACnC;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,qBAmDjD,CAAA;AAEJ,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,OAAO,GAAU,SAAS,cAAc,kCAkDpD,CAAA"}
@@ -0,0 +1,96 @@
1
+ import { ClientMessageType, isRelayOk } from "./message.js";
2
+ import { AdapterEvent, getAdapter } from "./adapter.js";
3
+ export var PublishStatus;
4
+ (function (PublishStatus) {
5
+ PublishStatus["Sending"] = "publish:status:sending";
6
+ PublishStatus["Pending"] = "publish:status:pending";
7
+ PublishStatus["Success"] = "publish:status:success";
8
+ PublishStatus["Failure"] = "publish:status:failure";
9
+ PublishStatus["Timeout"] = "publish:status:timeout";
10
+ PublishStatus["Aborted"] = "publish:status:aborted";
11
+ })(PublishStatus || (PublishStatus = {}));
12
+ export const publishOne = (options) => new Promise(resolve => {
13
+ const adapter = getAdapter(options.relay, options.context);
14
+ let status = PublishStatus.Pending;
15
+ options.onPending?.();
16
+ const cleanup = () => {
17
+ options.onComplete?.();
18
+ adapter.cleanup();
19
+ resolve(status);
20
+ };
21
+ adapter.on(AdapterEvent.Receive, (message, url) => {
22
+ if (isRelayOk(message)) {
23
+ const [_, id, ok, detail] = message;
24
+ if (id !== options.event.id)
25
+ return;
26
+ if (ok) {
27
+ status = PublishStatus.Success;
28
+ options.onSuccess?.(detail);
29
+ }
30
+ else {
31
+ status = PublishStatus.Failure;
32
+ options.onFailure?.(detail);
33
+ }
34
+ cleanup();
35
+ }
36
+ });
37
+ options.signal?.addEventListener("abort", () => {
38
+ if (status === PublishStatus.Pending) {
39
+ status = PublishStatus.Aborted;
40
+ options.onAborted?.();
41
+ }
42
+ cleanup();
43
+ });
44
+ setTimeout(() => {
45
+ if (status === PublishStatus.Pending) {
46
+ status = PublishStatus.Timeout;
47
+ options.onTimeout?.();
48
+ }
49
+ cleanup();
50
+ }, options.timeout || 10_000);
51
+ adapter.send([ClientMessageType.Event, options.event]);
52
+ });
53
+ export const publish = async (options) => {
54
+ const { event, timeout, signal, context } = options;
55
+ const status = {};
56
+ const completed = new Set();
57
+ const relays = new Set(options.relays);
58
+ if (relays.size !== options.relays.length) {
59
+ console.warn("Non-unique relays passed to publish");
60
+ }
61
+ await Promise.all(options.relays.map(relay => publishOne({
62
+ event,
63
+ relay,
64
+ signal,
65
+ timeout,
66
+ context,
67
+ onSuccess: (detail) => {
68
+ status[relay] = PublishStatus.Success;
69
+ options.onSuccess?.(detail, relay);
70
+ },
71
+ onFailure: (detail) => {
72
+ status[relay] = PublishStatus.Failure;
73
+ options.onFailure?.(detail, relay);
74
+ },
75
+ onPending: () => {
76
+ status[relay] = PublishStatus.Pending;
77
+ options.onPending?.(relay);
78
+ },
79
+ onTimeout: () => {
80
+ status[relay] = PublishStatus.Timeout;
81
+ options.onTimeout?.(relay);
82
+ },
83
+ onAborted: () => {
84
+ status[relay] = PublishStatus.Aborted;
85
+ options.onAborted?.(relay);
86
+ },
87
+ onComplete: () => {
88
+ completed.add(relay);
89
+ if (completed.size === relays.size) {
90
+ options.onComplete?.();
91
+ }
92
+ },
93
+ })));
94
+ return status;
95
+ };
96
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Deferred } from "@welshman/lib";
2
+ import { Filter, TrustedEvent } from "@welshman/util";
3
+ import { AdapterContext } from "./adapter.js";
4
+ import { Tracker } from "./tracker.js";
5
+ export type RequestOneOptions = {
6
+ relay: string;
7
+ filters: Filter[];
8
+ signal?: AbortSignal;
9
+ tracker?: Tracker;
10
+ context?: AdapterContext;
11
+ autoClose?: boolean;
12
+ isEventValid?: (event: TrustedEvent, url: string) => boolean;
13
+ isEventDeleted?: (event: TrustedEvent, url: string) => boolean;
14
+ onEvent?: (event: TrustedEvent, url: string) => void;
15
+ onDeleted?: (event: unknown, url: string) => void;
16
+ onInvalid?: (event: unknown, url: string) => void;
17
+ onFiltered?: (event: TrustedEvent, url: string) => void;
18
+ onDuplicate?: (event: TrustedEvent, url: string) => void;
19
+ onDisconnect?: (url: string) => void;
20
+ onEose?: (url: string) => void;
21
+ onClose?: () => void;
22
+ };
23
+ export declare const requestOne: (options: RequestOneOptions) => Deferred<TrustedEvent[], TrustedEvent[]>;
24
+ export type RequestOptions = Omit<RequestOneOptions, "relay"> & {
25
+ relays: string[];
26
+ threshold?: number;
27
+ };
28
+ export declare const request: (options: RequestOptions) => Promise<TrustedEvent[]>;
29
+ export type LoaderOptions = {
30
+ delay: number;
31
+ timeout?: number;
32
+ threshold?: number;
33
+ context?: AdapterContext;
34
+ isEventValid?: (event: TrustedEvent, url: string) => boolean;
35
+ isEventDeleted?: (event: TrustedEvent, url: string) => boolean;
36
+ };
37
+ export type LoadOptions = {
38
+ relays: string[];
39
+ filters: Filter[];
40
+ signal?: AbortSignal;
41
+ onEvent?: (event: TrustedEvent, url: string) => void;
42
+ onDisconnect?: (url: string) => void;
43
+ onEose?: (url: string) => void;
44
+ onClose?: () => void;
45
+ };
46
+ /**
47
+ * Creates a convenience function which returns a promise of events from a request.
48
+ * It may return early if filter cardinality is known, and it delays requests in order
49
+ * to implement batching
50
+ * @param options - LoaderOptions
51
+ * @returns - a load function
52
+ */
53
+ export declare const makeLoader: (options: LoaderOptions) => (request: LoadOptions) => Promise<Deferred<TrustedEvent[]>>;
54
+ export declare const load: (request: LoadOptions) => Promise<Deferred<TrustedEvent[]>>;
55
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,QAAQ,EAKT,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,MAAM,EAIN,YAAY,EAEb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAa,cAAc,EAAe,MAAM,cAAc,CAAA;AAGrE,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAA;AAgBpC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IAC5D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACxD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,6CAkGpD,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,OAAO,GAAU,SAAS,cAAc,4BAgCpD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IAC5D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAC/D,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,aAAa,gEA+F7C,CAAA;AAEJ,eAAO,MAAM,IAAI,6DAA0D,CAAA"}