tool-db 2.5.0 → 2.5.3

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 (208) hide show
  1. package/README.md +82 -1
  2. package/bundle.js +1 -0
  3. package/dist/adapters-base/networkAdapter.d.ts +58 -0
  4. package/dist/adapters-base/networkAdapter.js +216 -0
  5. package/dist/adapters-base/networkAdapter.js.map +1 -0
  6. package/dist/adapters-base/storageAdapter.d.ts +11 -0
  7. package/dist/adapters-base/storageAdapter.js +36 -0
  8. package/dist/adapters-base/storageAdapter.js.map +1 -0
  9. package/dist/adapters-base/userAdapter.d.ts +15 -0
  10. package/dist/adapters-base/userAdapter.js +42 -0
  11. package/dist/adapters-base/userAdapter.js.map +1 -0
  12. package/dist/crdt/baseCrdt.d.ts +9 -0
  13. package/dist/crdt/baseCrdt.js +27 -0
  14. package/dist/crdt/baseCrdt.js.map +1 -0
  15. package/dist/crdt/counterCrdt.d.ts +30 -0
  16. package/dist/crdt/counterCrdt.js +106 -0
  17. package/dist/crdt/counterCrdt.js.map +1 -0
  18. package/dist/crdt/listCrdt.d.ts +42 -0
  19. package/dist/crdt/listCrdt.js +159 -0
  20. package/dist/crdt/listCrdt.js.map +1 -0
  21. package/dist/crdt/mapCrdt.d.ts +32 -0
  22. package/dist/crdt/mapCrdt.js +118 -0
  23. package/dist/crdt/mapCrdt.js.map +1 -0
  24. package/dist/index.d.ts +34 -0
  25. package/dist/index.js +83 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/logger.d.ts +2 -0
  28. package/dist/logger.js +29 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/messageHandlers/handleCrdtGet.d.ts +2 -0
  31. package/dist/messageHandlers/handleCrdtGet.js +29 -0
  32. package/dist/messageHandlers/handleCrdtGet.js.map +1 -0
  33. package/dist/messageHandlers/handleCrdtPut.d.ts +2 -0
  34. package/dist/messageHandlers/handleCrdtPut.js +93 -0
  35. package/dist/messageHandlers/handleCrdtPut.js.map +1 -0
  36. package/dist/messageHandlers/handleGet.d.ts +2 -0
  37. package/dist/messageHandlers/handleGet.js +29 -0
  38. package/dist/messageHandlers/handleGet.js.map +1 -0
  39. package/dist/messageHandlers/handlePing.d.ts +2 -0
  40. package/dist/messageHandlers/handlePing.js +36 -0
  41. package/dist/messageHandlers/handlePing.js.map +1 -0
  42. package/dist/messageHandlers/handlePong.d.ts +2 -0
  43. package/dist/messageHandlers/handlePong.js +26 -0
  44. package/dist/messageHandlers/handlePong.js.map +1 -0
  45. package/dist/messageHandlers/handlePut.d.ts +2 -0
  46. package/dist/messageHandlers/handlePut.js +57 -0
  47. package/dist/messageHandlers/handlePut.js.map +1 -0
  48. package/dist/messageHandlers/handleQuery.d.ts +2 -0
  49. package/dist/messageHandlers/handleQuery.js +23 -0
  50. package/dist/messageHandlers/handleQuery.js.map +1 -0
  51. package/dist/messageHandlers/handleSubscribe.d.ts +2 -0
  52. package/dist/messageHandlers/handleSubscribe.js +44 -0
  53. package/dist/messageHandlers/handleSubscribe.js.map +1 -0
  54. package/dist/server.d.ts +1 -0
  55. package/dist/server.js +9 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/shared.d.ts +2 -0
  58. package/dist/shared.js +7 -0
  59. package/dist/shared.js.map +1 -0
  60. package/dist/toolDbAnonSignIn.d.ts +2 -0
  61. package/dist/toolDbAnonSignIn.js +7 -0
  62. package/dist/toolDbAnonSignIn.js.map +1 -0
  63. package/dist/toolDbClientOnMessage.d.ts +2 -0
  64. package/dist/toolDbClientOnMessage.js +59 -0
  65. package/dist/toolDbClientOnMessage.js.map +1 -0
  66. package/dist/toolDbCrdtGet.d.ts +9 -0
  67. package/dist/toolDbCrdtGet.js +77 -0
  68. package/dist/toolDbCrdtGet.js.map +1 -0
  69. package/dist/toolDbCrdtPut.d.ts +9 -0
  70. package/dist/toolDbCrdtPut.js +63 -0
  71. package/dist/toolDbCrdtPut.js.map +1 -0
  72. package/dist/toolDbGet.d.ts +9 -0
  73. package/dist/toolDbGet.js +77 -0
  74. package/dist/toolDbGet.js.map +1 -0
  75. package/dist/toolDbKeysSignIn.d.ts +2 -0
  76. package/dist/toolDbKeysSignIn.js +16 -0
  77. package/dist/toolDbKeysSignIn.js.map +1 -0
  78. package/dist/toolDbPut.d.ts +9 -0
  79. package/dist/toolDbPut.js +69 -0
  80. package/dist/toolDbPut.js.map +1 -0
  81. package/dist/toolDbQueryKeys.d.ts +8 -0
  82. package/dist/toolDbQueryKeys.js +66 -0
  83. package/dist/toolDbQueryKeys.js.map +1 -0
  84. package/dist/toolDbSignIn.d.ts +2 -0
  85. package/dist/toolDbSignIn.js +27 -0
  86. package/dist/toolDbSignIn.js.map +1 -0
  87. package/dist/toolDbSignUp.d.ts +2 -0
  88. package/dist/toolDbSignUp.js +101 -0
  89. package/dist/toolDbSignUp.js.map +1 -0
  90. package/dist/toolDbSubscribe.d.ts +9 -0
  91. package/dist/toolDbSubscribe.js +50 -0
  92. package/dist/toolDbSubscribe.js.map +1 -0
  93. package/dist/toolDbVerificationWrapper.d.ts +2 -0
  94. package/dist/toolDbVerificationWrapper.js +98 -0
  95. package/dist/toolDbVerificationWrapper.js.map +1 -0
  96. package/dist/tooldb.d.ts +108 -0
  97. package/dist/tooldb.js +286 -0
  98. package/dist/tooldb.js.map +1 -0
  99. package/dist/types/message.d.ts +100 -0
  100. package/dist/types/message.js +17 -0
  101. package/dist/types/message.js.map +1 -0
  102. package/dist/types/tooldb.d.ts +84 -0
  103. package/dist/types/tooldb.js +3 -0
  104. package/dist/types/tooldb.js.map +1 -0
  105. package/dist/utils/catchReturn.d.ts +1 -0
  106. package/dist/utils/catchReturn.js +8 -0
  107. package/dist/utils/catchReturn.js.map +1 -0
  108. package/dist/utils/encoding/arrayBufferToHex.d.ts +1 -0
  109. package/dist/utils/encoding/arrayBufferToHex.js +19 -0
  110. package/dist/utils/encoding/arrayBufferToHex.js.map +1 -0
  111. package/dist/utils/encoding/arrayBufferToString.d.ts +1 -0
  112. package/dist/utils/encoding/arrayBufferToString.js +12 -0
  113. package/dist/utils/encoding/arrayBufferToString.js.map +1 -0
  114. package/dist/utils/encoding/hexToArrayBuffer.d.ts +1 -0
  115. package/dist/utils/encoding/hexToArrayBuffer.js +15 -0
  116. package/dist/utils/encoding/hexToArrayBuffer.js.map +1 -0
  117. package/dist/utils/encoding/hexToString.d.ts +1 -0
  118. package/dist/utils/encoding/hexToString.js +12 -0
  119. package/dist/utils/encoding/hexToString.js.map +1 -0
  120. package/dist/utils/encoding/hexToUint8.d.ts +1 -0
  121. package/dist/utils/encoding/hexToUint8.js +8 -0
  122. package/dist/utils/encoding/hexToUint8.js.map +1 -0
  123. package/dist/utils/encoding/stringToArrayBuffer.d.ts +1 -0
  124. package/dist/utils/encoding/stringToArrayBuffer.js +12 -0
  125. package/dist/utils/encoding/stringToArrayBuffer.js.map +1 -0
  126. package/dist/utils/getPeerSignature.d.ts +2 -0
  127. package/dist/utils/getPeerSignature.js +9 -0
  128. package/dist/utils/getPeerSignature.js.map +1 -0
  129. package/dist/utils/getTimestamp.d.ts +1 -0
  130. package/dist/utils/getTimestamp.js +7 -0
  131. package/dist/utils/getTimestamp.js.map +1 -0
  132. package/dist/utils/proofOfWork.d.ts +4 -0
  133. package/dist/utils/proofOfWork.js +16 -0
  134. package/dist/utils/proofOfWork.js.map +1 -0
  135. package/dist/utils/randomAnimal.d.ts +1 -0
  136. package/dist/utils/randomAnimal.js +77 -0
  137. package/dist/utils/randomAnimal.js.map +1 -0
  138. package/dist/utils/sha1.d.ts +1 -0
  139. package/dist/utils/sha1.js +13 -0
  140. package/dist/utils/sha1.js.map +1 -0
  141. package/dist/utils/sha256.d.ts +3 -0
  142. package/dist/utils/sha256.js +13 -0
  143. package/dist/utils/sha256.js.map +1 -0
  144. package/dist/utils/textRandom.d.ts +1 -0
  145. package/dist/utils/textRandom.js +15 -0
  146. package/dist/utils/textRandom.js.map +1 -0
  147. package/dist/utils/uniq.d.ts +1 -0
  148. package/dist/utils/uniq.js +7 -0
  149. package/dist/utils/uniq.js.map +1 -0
  150. package/dist/utils/verifyMessage.d.ts +8 -0
  151. package/dist/utils/verifyMessage.js +129 -0
  152. package/dist/utils/verifyMessage.js.map +1 -0
  153. package/dist/utils/verifyPeer.d.ts +2 -0
  154. package/dist/utils/verifyPeer.js +15 -0
  155. package/dist/utils/verifyPeer.js.map +1 -0
  156. package/lib/adapters-base/networkAdapter.ts +217 -215
  157. package/lib/adapters-base/storageAdapter.ts +35 -35
  158. package/lib/adapters-base/userAdapter.ts +49 -49
  159. package/lib/crdt/baseCrdt.ts +21 -21
  160. package/lib/crdt/counterCrdt.ts +111 -111
  161. package/lib/crdt/listCrdt.ts +190 -190
  162. package/lib/crdt/mapCrdt.ts +119 -119
  163. package/lib/index.ts +42 -42
  164. package/lib/logger.ts +30 -30
  165. package/lib/messageHandlers/handleCrdtGet.ts +29 -29
  166. package/lib/messageHandlers/handleCrdtPut.ts +118 -118
  167. package/lib/messageHandlers/handleGet.ts +29 -29
  168. package/lib/messageHandlers/handlePing.ts +40 -40
  169. package/lib/messageHandlers/handlePong.ts +30 -30
  170. package/lib/messageHandlers/handlePut.ts +54 -54
  171. package/lib/messageHandlers/handleQuery.ts +25 -25
  172. package/lib/messageHandlers/handleSubscribe.ts +46 -46
  173. package/lib/server.ts +7 -7
  174. package/lib/shared.ts +5 -5
  175. package/lib/toolDbAnonSignIn.ts +5 -5
  176. package/lib/toolDbClientOnMessage.ts +75 -75
  177. package/lib/toolDbCrdtGet.ts +82 -82
  178. package/lib/toolDbCrdtPut.ts +77 -77
  179. package/lib/toolDbGet.ts +80 -80
  180. package/lib/toolDbKeysSignIn.ts +16 -16
  181. package/lib/toolDbPut.ts +83 -83
  182. package/lib/toolDbQueryKeys.ts +64 -64
  183. package/lib/toolDbSignIn.ts +31 -31
  184. package/lib/toolDbSignUp.ts +71 -71
  185. package/lib/toolDbSubscribe.ts +53 -53
  186. package/lib/toolDbVerificationWrapper.ts +55 -55
  187. package/lib/tooldb.ts +316 -314
  188. package/lib/types/message.ts +133 -133
  189. package/lib/types/tooldb.ts +97 -89
  190. package/lib/utils/catchReturn.ts +4 -4
  191. package/lib/utils/encoding/arrayBufferToHex.ts +18 -18
  192. package/lib/utils/encoding/arrayBufferToString.ts +8 -8
  193. package/lib/utils/encoding/hexToArrayBuffer.ts +13 -13
  194. package/lib/utils/encoding/hexToString.ts +8 -8
  195. package/lib/utils/encoding/hexToUint8.ts +5 -5
  196. package/lib/utils/encoding/stringToArrayBuffer.ts +8 -8
  197. package/lib/utils/getPeerSignature.ts +12 -12
  198. package/lib/utils/getTimestamp.ts +3 -3
  199. package/lib/utils/proofOfWork.ts +16 -16
  200. package/lib/utils/randomAnimal.ts +77 -77
  201. package/lib/utils/sha1.ts +7 -7
  202. package/lib/utils/sha256.ts +7 -7
  203. package/lib/utils/textRandom.ts +11 -11
  204. package/lib/utils/uniq.ts +3 -3
  205. package/lib/utils/verifyMessage.ts +88 -88
  206. package/lib/utils/verifyPeer.ts +15 -15
  207. package/package.json +4 -3
  208. package/tsconfig.json +14 -14
@@ -1,215 +1,217 @@
1
- import {
2
- ToolDb,
3
- PingMessage,
4
- ToolDbMessage,
5
- Peer,
6
- getPeerSignature,
7
- textRandom,
8
- uniq,
9
- } from "..";
10
-
11
- export default class ToolDbNetworkAdapter {
12
- private _clientToSend: Record<string, (message: string) => void> = {};
13
-
14
- private _isClientConnected: Record<string, () => boolean> = {};
15
-
16
- private _clientIsServer: Record<string, boolean> = {};
17
-
18
- private _tooldb: ToolDb;
19
-
20
- constructor(db: ToolDb) {
21
- this._tooldb = db;
22
-
23
- if (this.tooldb.options.server) {
24
- this.getMeAsPeer().then((meAsPeer) => {
25
- this.tooldb.serverPeers.push(meAsPeer);
26
- });
27
- }
28
- }
29
-
30
- get clientToSend() {
31
- return this._clientToSend;
32
- }
33
-
34
- get isClientConnected() {
35
- return this._isClientConnected;
36
- }
37
-
38
- get tooldb() {
39
- return this._tooldb;
40
- }
41
-
42
- public getMeAsPeer() {
43
- const timestamp = new Date().getTime();
44
- return getPeerSignature(
45
- this.tooldb.peerAccount,
46
- this.tooldb.options.topic,
47
- timestamp,
48
- this.tooldb.options.host,
49
- this.tooldb.options.port
50
- ).then((signature) => {
51
- return {
52
- topic: this.tooldb.options.topic,
53
- timestamp: timestamp,
54
- host: this.tooldb.options.host,
55
- port: this.tooldb.options.port,
56
- address: this.tooldb.peerAccount.getAddress() || "",
57
- sig: signature,
58
- } as Peer;
59
- });
60
- }
61
-
62
- /**
63
- * Check if the specified client is connected or not
64
- * @param clientId Client ID
65
- * @returns boolean
66
- */
67
- public isConnected(clientId: string) {
68
- return this._isClientConnected[clientId]
69
- ? this._isClientConnected[clientId]()
70
- : false;
71
- }
72
-
73
- /**
74
- * Check if the specified client is a server/relay
75
- * @param clientId Client ID
76
- * @returns boolean
77
- */
78
- public isServer(clientId: string) {
79
- return this._clientIsServer[clientId] || false;
80
- }
81
-
82
- public craftPingMessage() {
83
- return this.getMeAsPeer().then((meAsPeer) => {
84
- return JSON.stringify({
85
- type: "ping",
86
- clientId: this.getClientAddress(),
87
- to: [this.getClientAddress()],
88
- isServer: this.tooldb.options.server,
89
- id: textRandom(10),
90
- peer: meAsPeer,
91
- } as PingMessage);
92
- });
93
- }
94
-
95
- /**
96
- * Execute the function to send a message to the specified client ID
97
- * @param clientId Client ID
98
- * @param message Message
99
- */
100
- private executeSendToClient(clientId: string, message: string) {
101
- if (this._clientToSend[clientId]) {
102
- this._clientToSend[clientId](message);
103
- }
104
- }
105
-
106
- public getClientAddress() {
107
- // This is not a good idea to use on all adapters, so it should be replaced
108
- // if its causing issues. The only reason we use the last 20 chars is to
109
- // muse the same peer address as the webrtc adapter.
110
- return (this.tooldb.peerAccount.getAddress() || "").slice(-20);
111
- }
112
-
113
- public onClientDisconnect(clientId: string) {
114
- delete this._clientToSend[clientId];
115
- delete this._clientIsServer[clientId];
116
- }
117
-
118
- /**
119
- * Should be called as a message payload handler
120
- * This function will take care of processing the messages and also making sure
121
- * we use the correct response methods troughout the adapter.
122
- * @param message message payload
123
- * @param clientId Client ID (can be null for ping/pong)
124
- * @param setClientId Callback to set the client id on the parent class
125
- */
126
- public onClientMessage(
127
- message: string,
128
- clientId: string | null,
129
- setClientId: (clientId: string) => void
130
- ) {
131
- // this.tooldb.logger("onClientMessage", clientId);
132
-
133
- if (clientId && !this.tooldb.processedOutHashes[clientId]) {
134
- this.tooldb.processedOutHashes[clientId] = [];
135
- }
136
-
137
- try {
138
- const parsedMessage = JSON.parse(message) as ToolDbMessage;
139
- // We assume the first messages to arrive will always be ping or pong.
140
- // Only after that we can get the client id for this socket.
141
- if (parsedMessage.type === "ping" || parsedMessage.type === "pong") {
142
- const cid = parsedMessage.clientId;
143
- setClientId(cid);
144
- this.tooldb.onPeerConnect(cid);
145
- this._clientIsServer[cid] = parsedMessage.isServer;
146
- this.tooldb.processedOutHashes[cid] = [];
147
- this.tooldb.clientOnMessage(parsedMessage, cid);
148
- } else if (clientId) {
149
- this.tooldb.clientOnMessage(parsedMessage, clientId);
150
- }
151
- } catch (e) {
152
- this.tooldb.logger("Got message ERR", message);
153
- this.tooldb.logger(e);
154
- }
155
- }
156
-
157
- /**
158
- * Sends a message to all peers connected to us
159
- * This function takes care of the message deduplication, making sure we dont send
160
- * the same message twice to the same peer.
161
- * @param msg message data
162
- * @param crossServerOnly If this message should be send to server peers only
163
- * @param isRelay if we should relay this message
164
- */
165
- public sendToAll(msg: ToolDbMessage, crossServerOnly = false) {
166
- const to = uniq([...msg.to, this.getClientAddress()]);
167
-
168
- const finalMessage = JSON.stringify({ ...msg, to });
169
-
170
- const filteredConns = Object.keys(this.clientToSend)
171
- .filter((id) => !to.includes(id))
172
- .filter((clientId) => this.isConnected(clientId));
173
-
174
- filteredConns.forEach((clientId) => {
175
- if ((crossServerOnly && this.isServer(clientId)) || !crossServerOnly) {
176
- this.tooldb.logger(to, "Sent out to:", clientId);
177
-
178
- if (msg.type === "put" || msg.type === "crdtPut") {
179
- if (!this.tooldb.processedOutHashes[clientId].includes(msg.data.h)) {
180
- this.executeSendToClient(clientId, finalMessage);
181
- this.tooldb.processedOutHashes[clientId].push(msg.data.h);
182
- }
183
- } else {
184
- this.executeSendToClient(clientId, finalMessage);
185
- }
186
- }
187
- // } else {
188
- // this.tooldb.logger("Fitlered out;", clientId);
189
- // }
190
- });
191
- }
192
-
193
- /**
194
- * Sends a message to a single peer.
195
- * This function also takes care of the message deduplication.
196
- * @param clientId Peer/Client id we want to send to.
197
- * @param msg message data
198
- */
199
- public sendToClientId(clientId: string, msg: ToolDbMessage) {
200
- const to = uniq([...msg.to, this.getClientAddress()]);
201
- const finalMessage = JSON.stringify({ ...msg, to });
202
-
203
- if (msg.type === "put" || msg.type === "crdtPut") {
204
- if (
205
- clientId &&
206
- !this.tooldb.processedOutHashes[clientId].includes(msg.data.h)
207
- ) {
208
- this.executeSendToClient(clientId, finalMessage);
209
- this.tooldb.processedOutHashes[clientId].push(msg.data.h);
210
- }
211
- } else {
212
- this.executeSendToClient(clientId, finalMessage);
213
- }
214
- }
215
- }
1
+ import {
2
+ ToolDb,
3
+ PingMessage,
4
+ ToolDbMessage,
5
+ Peer,
6
+ getPeerSignature,
7
+ textRandom,
8
+ uniq,
9
+ } from "..";
10
+
11
+ export default class ToolDbNetworkAdapter {
12
+ private _clientToSend: Record<string, (message: string) => void> = {};
13
+
14
+ private _isClientConnected: Record<string, () => boolean> = {};
15
+
16
+ private _clientIsServer: Record<string, boolean> = {};
17
+
18
+ private _tooldb: ToolDb;
19
+
20
+ constructor(db: ToolDb) {
21
+ this._tooldb = db;
22
+
23
+ setTimeout(() => {
24
+ if (this.tooldb.options.server) {
25
+ this.getMeAsPeer().then((meAsPeer) => {
26
+ this.tooldb.serverPeers.push(meAsPeer);
27
+ });
28
+ }
29
+ }, 100);
30
+ }
31
+
32
+ get clientToSend() {
33
+ return this._clientToSend;
34
+ }
35
+
36
+ get isClientConnected() {
37
+ return this._isClientConnected;
38
+ }
39
+
40
+ get tooldb() {
41
+ return this._tooldb;
42
+ }
43
+
44
+ public getMeAsPeer() {
45
+ const timestamp = new Date().getTime();
46
+ return getPeerSignature(
47
+ this.tooldb.peerAccount,
48
+ this.tooldb.options.topic,
49
+ timestamp,
50
+ this.tooldb.options.host,
51
+ this.tooldb.options.port
52
+ ).then((signature) => {
53
+ return {
54
+ topic: this.tooldb.options.topic,
55
+ timestamp: timestamp,
56
+ host: this.tooldb.options.host,
57
+ port: this.tooldb.options.port,
58
+ address: this.tooldb.peerAccount.getAddress() || "",
59
+ sig: signature,
60
+ } as Peer;
61
+ });
62
+ }
63
+
64
+ /**
65
+ * Check if the specified client is connected or not
66
+ * @param clientId Client ID
67
+ * @returns boolean
68
+ */
69
+ public isConnected(clientId: string) {
70
+ return this._isClientConnected[clientId]
71
+ ? this._isClientConnected[clientId]()
72
+ : false;
73
+ }
74
+
75
+ /**
76
+ * Check if the specified client is a server/relay
77
+ * @param clientId Client ID
78
+ * @returns boolean
79
+ */
80
+ public isServer(clientId: string) {
81
+ return this._clientIsServer[clientId] || false;
82
+ }
83
+
84
+ public craftPingMessage() {
85
+ return this.getMeAsPeer().then((meAsPeer) => {
86
+ return JSON.stringify({
87
+ type: "ping",
88
+ clientId: this.getClientAddress(),
89
+ to: [this.getClientAddress()],
90
+ isServer: this.tooldb.options.server,
91
+ id: textRandom(10),
92
+ peer: meAsPeer,
93
+ } as PingMessage);
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Execute the function to send a message to the specified client ID
99
+ * @param clientId Client ID
100
+ * @param message Message
101
+ */
102
+ private executeSendToClient(clientId: string, message: string) {
103
+ if (this._clientToSend[clientId]) {
104
+ this._clientToSend[clientId](message);
105
+ }
106
+ }
107
+
108
+ public getClientAddress() {
109
+ // This is not a good idea to use on all adapters, so it should be replaced
110
+ // if its causing issues. The only reason we use the last 20 chars is to
111
+ // muse the same peer address as the webrtc adapter.
112
+ return (this.tooldb.peerAccount.getAddress() || "").slice(-20);
113
+ }
114
+
115
+ public onClientDisconnect(clientId: string) {
116
+ delete this._clientToSend[clientId];
117
+ delete this._clientIsServer[clientId];
118
+ }
119
+
120
+ /**
121
+ * Should be called as a message payload handler
122
+ * This function will take care of processing the messages and also making sure
123
+ * we use the correct response methods troughout the adapter.
124
+ * @param message message payload
125
+ * @param clientId Client ID (can be null for ping/pong)
126
+ * @param setClientId Callback to set the client id on the parent class
127
+ */
128
+ public onClientMessage(
129
+ message: string,
130
+ clientId: string | null,
131
+ setClientId: (clientId: string) => void
132
+ ) {
133
+ // this.tooldb.logger("onClientMessage", clientId);
134
+
135
+ if (clientId && !this.tooldb.processedOutHashes[clientId]) {
136
+ this.tooldb.processedOutHashes[clientId] = [];
137
+ }
138
+
139
+ try {
140
+ const parsedMessage = JSON.parse(message) as ToolDbMessage;
141
+ // We assume the first messages to arrive will always be ping or pong.
142
+ // Only after that we can get the client id for this socket.
143
+ if (parsedMessage.type === "ping" || parsedMessage.type === "pong") {
144
+ const cid = parsedMessage.clientId;
145
+ setClientId(cid);
146
+ this.tooldb.onPeerConnect(cid);
147
+ this._clientIsServer[cid] = parsedMessage.isServer;
148
+ this.tooldb.processedOutHashes[cid] = [];
149
+ this.tooldb.clientOnMessage(parsedMessage, cid);
150
+ } else if (clientId) {
151
+ this.tooldb.clientOnMessage(parsedMessage, clientId);
152
+ }
153
+ } catch (e) {
154
+ this.tooldb.logger("Got message ERR", message);
155
+ this.tooldb.logger(e);
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Sends a message to all peers connected to us
161
+ * This function takes care of the message deduplication, making sure we dont send
162
+ * the same message twice to the same peer.
163
+ * @param msg message data
164
+ * @param crossServerOnly If this message should be send to server peers only
165
+ * @param isRelay if we should relay this message
166
+ */
167
+ public sendToAll(msg: ToolDbMessage, crossServerOnly = false) {
168
+ const to = uniq([...msg.to, this.getClientAddress()]);
169
+
170
+ const finalMessage = JSON.stringify({ ...msg, to });
171
+
172
+ const filteredConns = Object.keys(this.clientToSend)
173
+ .filter((id) => !to.includes(id))
174
+ .filter((clientId) => this.isConnected(clientId));
175
+
176
+ filteredConns.forEach((clientId) => {
177
+ if ((crossServerOnly && this.isServer(clientId)) || !crossServerOnly) {
178
+ this.tooldb.logger(to, "Sent out to:", clientId);
179
+
180
+ if (msg.type === "put" || msg.type === "crdtPut") {
181
+ if (!this.tooldb.processedOutHashes[clientId].includes(msg.data.h)) {
182
+ this.executeSendToClient(clientId, finalMessage);
183
+ this.tooldb.processedOutHashes[clientId].push(msg.data.h);
184
+ }
185
+ } else {
186
+ this.executeSendToClient(clientId, finalMessage);
187
+ }
188
+ }
189
+ // } else {
190
+ // this.tooldb.logger("Fitlered out;", clientId);
191
+ // }
192
+ });
193
+ }
194
+
195
+ /**
196
+ * Sends a message to a single peer.
197
+ * This function also takes care of the message deduplication.
198
+ * @param clientId Peer/Client id we want to send to.
199
+ * @param msg message data
200
+ */
201
+ public sendToClientId(clientId: string, msg: ToolDbMessage) {
202
+ const to = uniq([...msg.to, this.getClientAddress()]);
203
+ const finalMessage = JSON.stringify({ ...msg, to });
204
+
205
+ if (msg.type === "put" || msg.type === "crdtPut") {
206
+ if (
207
+ clientId &&
208
+ !this.tooldb.processedOutHashes[clientId].includes(msg.data.h)
209
+ ) {
210
+ this.executeSendToClient(clientId, finalMessage);
211
+ this.tooldb.processedOutHashes[clientId].push(msg.data.h);
212
+ }
213
+ } else {
214
+ this.executeSendToClient(clientId, finalMessage);
215
+ }
216
+ }
217
+ }
@@ -1,35 +1,35 @@
1
- import { ToolDb } from "..";
2
-
3
- export default class ToolDbStorageAdapter {
4
- private _tooldb: ToolDb;
5
-
6
- private _forceStorageName: string | undefined;
7
-
8
- get tooldb() {
9
- return this._tooldb;
10
- }
11
-
12
- get storageName() {
13
- return this._forceStorageName || this._tooldb.options.storageName;
14
- }
15
-
16
- constructor(db: ToolDb, forceStorageName?: string) {
17
- this._tooldb = db;
18
-
19
- if (forceStorageName) {
20
- this._forceStorageName = forceStorageName;
21
- }
22
- }
23
-
24
- put(key: string, data: string): Promise<unknown> {
25
- return Promise.resolve();
26
- }
27
-
28
- get(key: string): Promise<string> {
29
- return Promise.resolve("");
30
- }
31
-
32
- query(key: string): Promise<string[]> {
33
- return Promise.resolve([]);
34
- }
35
- }
1
+ import { ToolDb } from "..";
2
+
3
+ export default class ToolDbStorageAdapter {
4
+ private _tooldb: ToolDb;
5
+
6
+ private _forceStorageName: string | undefined;
7
+
8
+ get tooldb() {
9
+ return this._tooldb;
10
+ }
11
+
12
+ get storageName() {
13
+ return this._forceStorageName || this._tooldb.options.storageName;
14
+ }
15
+
16
+ constructor(db: ToolDb, forceStorageName?: string) {
17
+ this._tooldb = db;
18
+
19
+ if (forceStorageName) {
20
+ this._forceStorageName = forceStorageName;
21
+ }
22
+ }
23
+
24
+ put(key: string, data: string): Promise<unknown> {
25
+ return Promise.resolve();
26
+ }
27
+
28
+ get(key: string): Promise<string> {
29
+ return Promise.resolve("");
30
+ }
31
+
32
+ query(key: string): Promise<string[]> {
33
+ return Promise.resolve([]);
34
+ }
35
+ }
@@ -1,49 +1,49 @@
1
- import { ToolDb, VerificationData } from "..";
2
-
3
- export default class ToolDbUserAdapter {
4
- private _tooldb: ToolDb;
5
-
6
- get tooldb() {
7
- return this._tooldb;
8
- }
9
-
10
- constructor(db: ToolDb) {
11
- this._tooldb = db;
12
- }
13
-
14
- public anonUser() {
15
- return;
16
- }
17
-
18
- public setUser(account: unknown | undefined, name: string): void {}
19
-
20
- public signData(data: string): Promise<string> {
21
- return Promise.resolve("");
22
- }
23
-
24
- public verifySignature(
25
- message: Partial<VerificationData<any>>
26
- ): Promise<boolean> {
27
- return Promise.resolve(false);
28
- }
29
-
30
- public getAccountFromPrivate(privateKey: string): Promise<unknown> {
31
- return Promise.resolve(undefined);
32
- }
33
-
34
- public encryptAccount(password: string): Promise<unknown> {
35
- return Promise.resolve(undefined);
36
- }
37
-
38
- public decryptAccount(acc: unknown, password: string): Promise<any> {
39
- return Promise.resolve(undefined);
40
- }
41
-
42
- public getAddress(): string | undefined {
43
- return "";
44
- }
45
-
46
- public getUsername(): string | undefined {
47
- return "";
48
- }
49
- }
1
+ import { ToolDb, VerificationData } from "..";
2
+
3
+ export default class ToolDbUserAdapter {
4
+ private _tooldb: ToolDb;
5
+
6
+ get tooldb() {
7
+ return this._tooldb;
8
+ }
9
+
10
+ constructor(db: ToolDb) {
11
+ this._tooldb = db;
12
+ }
13
+
14
+ public anonUser() {
15
+ return;
16
+ }
17
+
18
+ public setUser(account: unknown | undefined, name: string): void {}
19
+
20
+ public signData(data: string): Promise<string> {
21
+ return Promise.resolve("");
22
+ }
23
+
24
+ public verifySignature(
25
+ message: Partial<VerificationData<any>>
26
+ ): Promise<boolean> {
27
+ return Promise.resolve(false);
28
+ }
29
+
30
+ public getAccountFromPrivate(privateKey: string): Promise<unknown> {
31
+ return Promise.resolve(undefined);
32
+ }
33
+
34
+ public encryptAccount(password: string): Promise<unknown> {
35
+ return Promise.resolve(undefined);
36
+ }
37
+
38
+ public decryptAccount(acc: unknown, password: string): Promise<any> {
39
+ return Promise.resolve(undefined);
40
+ }
41
+
42
+ public getAddress(): string | undefined {
43
+ return "";
44
+ }
45
+
46
+ public getUsername(): string | undefined {
47
+ return "";
48
+ }
49
+ }
@@ -1,21 +1,21 @@
1
- export const CRDT_MAP = "MAP";
2
-
3
- export const CRDT_LIST = "LIST";
4
-
5
- export const CRDT_COUNTER = "COUNTER";
6
-
7
- export class BaseCrdt<T = any, Changes = any, Value = any> {
8
- public type: string = "";
9
-
10
- public mergeChanges(changes: Changes[]) {
11
- //
12
- }
13
-
14
- public getChanges(): Changes[] {
15
- return [];
16
- }
17
-
18
- get value(): Value {
19
- return "" as any;
20
- }
21
- }
1
+ export const CRDT_MAP = "MAP";
2
+
3
+ export const CRDT_LIST = "LIST";
4
+
5
+ export const CRDT_COUNTER = "COUNTER";
6
+
7
+ export class BaseCrdt<T = any, Changes = any, Value = any> {
8
+ public type: string = "";
9
+
10
+ public mergeChanges(changes: Changes[]) {
11
+ //
12
+ }
13
+
14
+ public getChanges(): Changes[] {
15
+ return [];
16
+ }
17
+
18
+ get value(): Value {
19
+ return "" as any;
20
+ }
21
+ }