@waku/core 0.0.34-9f1d8ca.0 → 0.0.34-c41b319.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 (80) hide show
  1. package/bundle/base_protocol-CCK9RCtH.js +152 -0
  2. package/bundle/{index-BIW3qNYx.js → index-Db7LxDrL.js} +78 -159
  3. package/bundle/index.js +1882 -158
  4. package/bundle/lib/base_protocol.js +2 -2
  5. package/bundle/lib/message/version_0.js +2 -2
  6. package/bundle/{version_0-CdmZMfkQ.js → version_0-ANFNAdFD.js} +283 -45
  7. package/dist/.tsbuildinfo +1 -1
  8. package/dist/index.d.ts +1 -3
  9. package/dist/index.js +1 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/base_protocol.d.ts +3 -23
  12. package/dist/lib/base_protocol.js +3 -47
  13. package/dist/lib/base_protocol.js.map +1 -1
  14. package/dist/lib/connection_manager/connection_manager.d.ts +118 -0
  15. package/dist/lib/{connection_manager.js → connection_manager/connection_manager.js} +136 -36
  16. package/dist/lib/connection_manager/connection_manager.js.map +1 -0
  17. package/dist/lib/connection_manager/index.d.ts +1 -0
  18. package/dist/lib/connection_manager/index.js +2 -0
  19. package/dist/lib/connection_manager/index.js.map +1 -0
  20. package/dist/lib/{keep_alive_manager.d.ts → connection_manager/keep_alive_manager.d.ts} +4 -2
  21. package/dist/lib/{keep_alive_manager.js → connection_manager/keep_alive_manager.js} +2 -2
  22. package/dist/lib/connection_manager/keep_alive_manager.js.map +1 -0
  23. package/dist/lib/connection_manager/utils.d.ts +7 -0
  24. package/dist/lib/connection_manager/utils.js +22 -0
  25. package/dist/lib/connection_manager/utils.js.map +1 -0
  26. package/dist/lib/filter/filter.d.ts +18 -0
  27. package/dist/lib/filter/filter.js +209 -0
  28. package/dist/lib/filter/filter.js.map +1 -0
  29. package/dist/lib/filter/index.d.ts +1 -18
  30. package/dist/lib/filter/index.js +1 -208
  31. package/dist/lib/filter/index.js.map +1 -1
  32. package/dist/lib/light_push/index.d.ts +1 -15
  33. package/dist/lib/light_push/index.js +1 -143
  34. package/dist/lib/light_push/index.js.map +1 -1
  35. package/dist/lib/light_push/light_push.d.ts +15 -0
  36. package/dist/lib/light_push/light_push.js +144 -0
  37. package/dist/lib/light_push/light_push.js.map +1 -0
  38. package/dist/lib/metadata/index.d.ts +1 -3
  39. package/dist/lib/metadata/index.js +1 -118
  40. package/dist/lib/metadata/index.js.map +1 -1
  41. package/dist/lib/metadata/metadata.d.ts +3 -0
  42. package/dist/lib/metadata/metadata.js +119 -0
  43. package/dist/lib/metadata/metadata.js.map +1 -0
  44. package/dist/lib/store/index.d.ts +1 -9
  45. package/dist/lib/store/index.js +1 -82
  46. package/dist/lib/store/index.js.map +1 -1
  47. package/dist/lib/store/store.d.ts +9 -0
  48. package/dist/lib/store/store.js +83 -0
  49. package/dist/lib/store/store.js.map +1 -0
  50. package/dist/lib/stream_manager/stream_manager.d.ts +2 -2
  51. package/dist/lib/stream_manager/stream_manager.js +16 -17
  52. package/dist/lib/stream_manager/stream_manager.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/index.ts +1 -4
  55. package/src/lib/base_protocol.ts +3 -76
  56. package/src/lib/{connection_manager.ts → connection_manager/connection_manager.ts} +168 -63
  57. package/src/lib/connection_manager/index.ts +1 -0
  58. package/src/lib/{keep_alive_manager.ts → connection_manager/keep_alive_manager.ts} +7 -3
  59. package/src/lib/connection_manager/utils.ts +25 -0
  60. package/src/lib/filter/filter.ts +315 -0
  61. package/src/lib/filter/index.ts +1 -315
  62. package/src/lib/light_push/index.ts +1 -188
  63. package/src/lib/light_push/light_push.ts +188 -0
  64. package/src/lib/metadata/index.ts +1 -182
  65. package/src/lib/metadata/metadata.ts +182 -0
  66. package/src/lib/store/index.ts +1 -136
  67. package/src/lib/store/store.ts +136 -0
  68. package/src/lib/stream_manager/stream_manager.ts +16 -18
  69. package/bundle/base_protocol-Dzv-QHPR.js +0 -275
  70. package/dist/lib/connection_manager.d.ts +0 -62
  71. package/dist/lib/connection_manager.js.map +0 -1
  72. package/dist/lib/filterPeers.d.ts +0 -13
  73. package/dist/lib/filterPeers.js +0 -38
  74. package/dist/lib/filterPeers.js.map +0 -1
  75. package/dist/lib/health_manager.d.ts +0 -14
  76. package/dist/lib/health_manager.js +0 -70
  77. package/dist/lib/health_manager.js.map +0 -1
  78. package/dist/lib/keep_alive_manager.js.map +0 -1
  79. package/src/lib/filterPeers.ts +0 -51
  80. package/src/lib/health_manager.ts +0 -90
@@ -0,0 +1,315 @@
1
+ import type { PeerId, Stream } from "@libp2p/interface";
2
+ import type { IncomingStreamData } from "@libp2p/interface-internal";
3
+ import {
4
+ type ContentTopic,
5
+ type CoreProtocolResult,
6
+ type IBaseProtocolCore,
7
+ type Libp2p,
8
+ ProtocolError,
9
+ type PubsubTopic
10
+ } from "@waku/interfaces";
11
+ import { WakuMessage } from "@waku/proto";
12
+ import { Logger } from "@waku/utils";
13
+ import all from "it-all";
14
+ import * as lp from "it-length-prefixed";
15
+ import { pipe } from "it-pipe";
16
+ import { Uint8ArrayList } from "uint8arraylist";
17
+
18
+ import { BaseProtocol } from "../base_protocol.js";
19
+
20
+ import {
21
+ FilterPushRpc,
22
+ FilterSubscribeResponse,
23
+ FilterSubscribeRpc
24
+ } from "./filter_rpc.js";
25
+
26
+ const log = new Logger("filter:v2");
27
+
28
+ export const FilterCodecs = {
29
+ SUBSCRIBE: "/vac/waku/filter-subscribe/2.0.0-beta1",
30
+ PUSH: "/vac/waku/filter-push/2.0.0-beta1"
31
+ };
32
+
33
+ export class FilterCore extends BaseProtocol implements IBaseProtocolCore {
34
+ public constructor(
35
+ private handleIncomingMessage: (
36
+ pubsubTopic: PubsubTopic,
37
+ wakuMessage: WakuMessage,
38
+ peerIdStr: string
39
+ ) => Promise<void>,
40
+ public readonly pubsubTopics: PubsubTopic[],
41
+ libp2p: Libp2p
42
+ ) {
43
+ super(FilterCodecs.SUBSCRIBE, libp2p.components, pubsubTopics);
44
+
45
+ libp2p
46
+ .handle(FilterCodecs.PUSH, this.onRequest.bind(this), {
47
+ maxInboundStreams: 100
48
+ })
49
+ .catch((e) => {
50
+ log.error("Failed to register ", FilterCodecs.PUSH, e);
51
+ });
52
+ }
53
+
54
+ public async subscribe(
55
+ pubsubTopic: PubsubTopic,
56
+ peerId: PeerId,
57
+ contentTopics: ContentTopic[]
58
+ ): Promise<CoreProtocolResult> {
59
+ const stream = await this.getStream(peerId);
60
+
61
+ const request = FilterSubscribeRpc.createSubscribeRequest(
62
+ pubsubTopic,
63
+ contentTopics
64
+ );
65
+
66
+ let res: Uint8ArrayList[] | undefined;
67
+ try {
68
+ res = await pipe(
69
+ [request.encode()],
70
+ lp.encode,
71
+ stream,
72
+ lp.decode,
73
+ async (source) => await all(source)
74
+ );
75
+ } catch (error) {
76
+ log.error("Failed to send subscribe request", error);
77
+ return {
78
+ success: null,
79
+ failure: {
80
+ error: ProtocolError.GENERIC_FAIL,
81
+ peerId: peerId
82
+ }
83
+ };
84
+ }
85
+
86
+ const { statusCode, requestId, statusDesc } =
87
+ FilterSubscribeResponse.decode(res[0].slice());
88
+
89
+ if (statusCode < 200 || statusCode >= 300) {
90
+ log.error(
91
+ `Filter subscribe request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
92
+ );
93
+ return {
94
+ failure: {
95
+ error: ProtocolError.REMOTE_PEER_REJECTED,
96
+ peerId: peerId
97
+ },
98
+ success: null
99
+ };
100
+ }
101
+
102
+ return {
103
+ failure: null,
104
+ success: peerId
105
+ };
106
+ }
107
+
108
+ public async unsubscribe(
109
+ pubsubTopic: PubsubTopic,
110
+ peerId: PeerId,
111
+ contentTopics: ContentTopic[]
112
+ ): Promise<CoreProtocolResult> {
113
+ let stream: Stream | undefined;
114
+ try {
115
+ stream = await this.getStream(peerId);
116
+ } catch (error) {
117
+ log.error(
118
+ `Failed to get a stream for remote peer${peerId.toString()}`,
119
+ error
120
+ );
121
+ return {
122
+ success: null,
123
+ failure: {
124
+ error: ProtocolError.NO_STREAM_AVAILABLE,
125
+ peerId: peerId
126
+ }
127
+ };
128
+ }
129
+
130
+ const unsubscribeRequest = FilterSubscribeRpc.createUnsubscribeRequest(
131
+ pubsubTopic,
132
+ contentTopics
133
+ );
134
+
135
+ try {
136
+ await pipe([unsubscribeRequest.encode()], lp.encode, stream.sink);
137
+ } catch (error) {
138
+ log.error("Failed to send unsubscribe request", error);
139
+ return {
140
+ success: null,
141
+ failure: {
142
+ error: ProtocolError.GENERIC_FAIL,
143
+ peerId: peerId
144
+ }
145
+ };
146
+ }
147
+
148
+ return {
149
+ success: peerId,
150
+ failure: null
151
+ };
152
+ }
153
+
154
+ public async unsubscribeAll(
155
+ pubsubTopic: PubsubTopic,
156
+ peerId: PeerId
157
+ ): Promise<CoreProtocolResult> {
158
+ const stream = await this.getStream(peerId);
159
+
160
+ const request = FilterSubscribeRpc.createUnsubscribeAllRequest(pubsubTopic);
161
+
162
+ const res = await pipe(
163
+ [request.encode()],
164
+ lp.encode,
165
+ stream,
166
+ lp.decode,
167
+ async (source) => await all(source)
168
+ );
169
+
170
+ if (!res || !res.length) {
171
+ return {
172
+ failure: {
173
+ error: ProtocolError.NO_RESPONSE,
174
+ peerId: peerId
175
+ },
176
+ success: null
177
+ };
178
+ }
179
+
180
+ const { statusCode, requestId, statusDesc } =
181
+ FilterSubscribeResponse.decode(res[0].slice());
182
+
183
+ if (statusCode < 200 || statusCode >= 300) {
184
+ log.error(
185
+ `Filter unsubscribe all request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
186
+ );
187
+ return {
188
+ failure: {
189
+ error: ProtocolError.REMOTE_PEER_REJECTED,
190
+ peerId: peerId
191
+ },
192
+ success: null
193
+ };
194
+ }
195
+
196
+ return {
197
+ failure: null,
198
+ success: peerId
199
+ };
200
+ }
201
+
202
+ public async ping(peerId: PeerId): Promise<CoreProtocolResult> {
203
+ let stream: Stream | undefined;
204
+ try {
205
+ stream = await this.getStream(peerId);
206
+ } catch (error) {
207
+ log.error(
208
+ `Failed to get a stream for remote peer${peerId.toString()}`,
209
+ error
210
+ );
211
+ return {
212
+ success: null,
213
+ failure: {
214
+ error: ProtocolError.NO_STREAM_AVAILABLE,
215
+ peerId: peerId
216
+ }
217
+ };
218
+ }
219
+
220
+ const request = FilterSubscribeRpc.createSubscriberPingRequest();
221
+
222
+ let res: Uint8ArrayList[] | undefined;
223
+ try {
224
+ res = await pipe(
225
+ [request.encode()],
226
+ lp.encode,
227
+ stream,
228
+ lp.decode,
229
+ async (source) => await all(source)
230
+ );
231
+ } catch (error) {
232
+ log.error("Failed to send ping request", error);
233
+ return {
234
+ success: null,
235
+ failure: {
236
+ error: ProtocolError.GENERIC_FAIL,
237
+ peerId: peerId
238
+ }
239
+ };
240
+ }
241
+
242
+ if (!res || !res.length) {
243
+ return {
244
+ success: null,
245
+ failure: {
246
+ error: ProtocolError.NO_RESPONSE,
247
+ peerId: peerId
248
+ }
249
+ };
250
+ }
251
+
252
+ const { statusCode, requestId, statusDesc } =
253
+ FilterSubscribeResponse.decode(res[0].slice());
254
+
255
+ if (statusCode < 200 || statusCode >= 300) {
256
+ log.error(
257
+ `Filter ping request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
258
+ );
259
+ return {
260
+ success: null,
261
+ failure: {
262
+ error: ProtocolError.REMOTE_PEER_REJECTED,
263
+ peerId: peerId
264
+ }
265
+ };
266
+ }
267
+ return {
268
+ success: peerId,
269
+ failure: null
270
+ };
271
+ }
272
+
273
+ private onRequest(streamData: IncomingStreamData): void {
274
+ const { connection, stream } = streamData;
275
+ const { remotePeer } = connection;
276
+ log.info(`Received message from ${remotePeer.toString()}`);
277
+ try {
278
+ pipe(stream, lp.decode, async (source) => {
279
+ for await (const bytes of source) {
280
+ const response = FilterPushRpc.decode(bytes.slice());
281
+
282
+ const { pubsubTopic, wakuMessage } = response;
283
+
284
+ if (!wakuMessage) {
285
+ log.error("Received empty message");
286
+ return;
287
+ }
288
+
289
+ if (!pubsubTopic) {
290
+ log.error("Pubsub topic missing from push message");
291
+ return;
292
+ }
293
+
294
+ await this.handleIncomingMessage(
295
+ pubsubTopic,
296
+ wakuMessage,
297
+ connection.remotePeer.toString()
298
+ );
299
+ }
300
+ }).then(
301
+ () => {
302
+ log.info("Receiving pipe closed.");
303
+ },
304
+ async (e) => {
305
+ log.error(
306
+ `Error with receiving pipe on peer:${connection.remotePeer.toString()} -- stream:${stream.id} -- protocol:${stream.protocol}: `,
307
+ e
308
+ );
309
+ }
310
+ );
311
+ } catch (e) {
312
+ log.error("Error decoding message", e);
313
+ }
314
+ }
315
+ }
@@ -1,315 +1 @@
1
- import type { Peer, Stream } from "@libp2p/interface";
2
- import type { IncomingStreamData } from "@libp2p/interface-internal";
3
- import {
4
- type ContentTopic,
5
- type CoreProtocolResult,
6
- type IBaseProtocolCore,
7
- type Libp2p,
8
- ProtocolError,
9
- type PubsubTopic
10
- } from "@waku/interfaces";
11
- import { WakuMessage } from "@waku/proto";
12
- import { Logger } from "@waku/utils";
13
- import all from "it-all";
14
- import * as lp from "it-length-prefixed";
15
- import { pipe } from "it-pipe";
16
- import { Uint8ArrayList } from "uint8arraylist";
17
-
18
- import { BaseProtocol } from "../base_protocol.js";
19
-
20
- import {
21
- FilterPushRpc,
22
- FilterSubscribeResponse,
23
- FilterSubscribeRpc
24
- } from "./filter_rpc.js";
25
-
26
- const log = new Logger("filter:v2");
27
-
28
- export const FilterCodecs = {
29
- SUBSCRIBE: "/vac/waku/filter-subscribe/2.0.0-beta1",
30
- PUSH: "/vac/waku/filter-push/2.0.0-beta1"
31
- };
32
-
33
- export class FilterCore extends BaseProtocol implements IBaseProtocolCore {
34
- public constructor(
35
- private handleIncomingMessage: (
36
- pubsubTopic: PubsubTopic,
37
- wakuMessage: WakuMessage,
38
- peerIdStr: string
39
- ) => Promise<void>,
40
- public readonly pubsubTopics: PubsubTopic[],
41
- libp2p: Libp2p
42
- ) {
43
- super(FilterCodecs.SUBSCRIBE, libp2p.components, log, pubsubTopics);
44
-
45
- libp2p
46
- .handle(FilterCodecs.PUSH, this.onRequest.bind(this), {
47
- maxInboundStreams: 100
48
- })
49
- .catch((e) => {
50
- log.error("Failed to register ", FilterCodecs.PUSH, e);
51
- });
52
- }
53
-
54
- public async subscribe(
55
- pubsubTopic: PubsubTopic,
56
- peer: Peer,
57
- contentTopics: ContentTopic[]
58
- ): Promise<CoreProtocolResult> {
59
- const stream = await this.getStream(peer);
60
-
61
- const request = FilterSubscribeRpc.createSubscribeRequest(
62
- pubsubTopic,
63
- contentTopics
64
- );
65
-
66
- let res: Uint8ArrayList[] | undefined;
67
- try {
68
- res = await pipe(
69
- [request.encode()],
70
- lp.encode,
71
- stream,
72
- lp.decode,
73
- async (source) => await all(source)
74
- );
75
- } catch (error) {
76
- log.error("Failed to send subscribe request", error);
77
- return {
78
- success: null,
79
- failure: {
80
- error: ProtocolError.GENERIC_FAIL,
81
- peerId: peer.id
82
- }
83
- };
84
- }
85
-
86
- const { statusCode, requestId, statusDesc } =
87
- FilterSubscribeResponse.decode(res[0].slice());
88
-
89
- if (statusCode < 200 || statusCode >= 300) {
90
- log.error(
91
- `Filter subscribe request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
92
- );
93
- return {
94
- failure: {
95
- error: ProtocolError.REMOTE_PEER_REJECTED,
96
- peerId: peer.id
97
- },
98
- success: null
99
- };
100
- }
101
-
102
- return {
103
- failure: null,
104
- success: peer.id
105
- };
106
- }
107
-
108
- public async unsubscribe(
109
- pubsubTopic: PubsubTopic,
110
- peer: Peer,
111
- contentTopics: ContentTopic[]
112
- ): Promise<CoreProtocolResult> {
113
- let stream: Stream | undefined;
114
- try {
115
- stream = await this.getStream(peer);
116
- } catch (error) {
117
- log.error(
118
- `Failed to get a stream for remote peer${peer.id.toString()}`,
119
- error
120
- );
121
- return {
122
- success: null,
123
- failure: {
124
- error: ProtocolError.NO_STREAM_AVAILABLE,
125
- peerId: peer.id
126
- }
127
- };
128
- }
129
-
130
- const unsubscribeRequest = FilterSubscribeRpc.createUnsubscribeRequest(
131
- pubsubTopic,
132
- contentTopics
133
- );
134
-
135
- try {
136
- await pipe([unsubscribeRequest.encode()], lp.encode, stream.sink);
137
- } catch (error) {
138
- log.error("Failed to send unsubscribe request", error);
139
- return {
140
- success: null,
141
- failure: {
142
- error: ProtocolError.GENERIC_FAIL,
143
- peerId: peer.id
144
- }
145
- };
146
- }
147
-
148
- return {
149
- success: peer.id,
150
- failure: null
151
- };
152
- }
153
-
154
- public async unsubscribeAll(
155
- pubsubTopic: PubsubTopic,
156
- peer: Peer
157
- ): Promise<CoreProtocolResult> {
158
- const stream = await this.getStream(peer);
159
-
160
- const request = FilterSubscribeRpc.createUnsubscribeAllRequest(pubsubTopic);
161
-
162
- const res = await pipe(
163
- [request.encode()],
164
- lp.encode,
165
- stream,
166
- lp.decode,
167
- async (source) => await all(source)
168
- );
169
-
170
- if (!res || !res.length) {
171
- return {
172
- failure: {
173
- error: ProtocolError.NO_RESPONSE,
174
- peerId: peer.id
175
- },
176
- success: null
177
- };
178
- }
179
-
180
- const { statusCode, requestId, statusDesc } =
181
- FilterSubscribeResponse.decode(res[0].slice());
182
-
183
- if (statusCode < 200 || statusCode >= 300) {
184
- log.error(
185
- `Filter unsubscribe all request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
186
- );
187
- return {
188
- failure: {
189
- error: ProtocolError.REMOTE_PEER_REJECTED,
190
- peerId: peer.id
191
- },
192
- success: null
193
- };
194
- }
195
-
196
- return {
197
- failure: null,
198
- success: peer.id
199
- };
200
- }
201
-
202
- public async ping(peer: Peer): Promise<CoreProtocolResult> {
203
- let stream: Stream | undefined;
204
- try {
205
- stream = await this.getStream(peer);
206
- } catch (error) {
207
- log.error(
208
- `Failed to get a stream for remote peer${peer.id.toString()}`,
209
- error
210
- );
211
- return {
212
- success: null,
213
- failure: {
214
- error: ProtocolError.NO_STREAM_AVAILABLE,
215
- peerId: peer.id
216
- }
217
- };
218
- }
219
-
220
- const request = FilterSubscribeRpc.createSubscriberPingRequest();
221
-
222
- let res: Uint8ArrayList[] | undefined;
223
- try {
224
- res = await pipe(
225
- [request.encode()],
226
- lp.encode,
227
- stream,
228
- lp.decode,
229
- async (source) => await all(source)
230
- );
231
- } catch (error) {
232
- log.error("Failed to send ping request", error);
233
- return {
234
- success: null,
235
- failure: {
236
- error: ProtocolError.GENERIC_FAIL,
237
- peerId: peer.id
238
- }
239
- };
240
- }
241
-
242
- if (!res || !res.length) {
243
- return {
244
- success: null,
245
- failure: {
246
- error: ProtocolError.NO_RESPONSE,
247
- peerId: peer.id
248
- }
249
- };
250
- }
251
-
252
- const { statusCode, requestId, statusDesc } =
253
- FilterSubscribeResponse.decode(res[0].slice());
254
-
255
- if (statusCode < 200 || statusCode >= 300) {
256
- log.error(
257
- `Filter ping request ${requestId} failed with status code ${statusCode}: ${statusDesc}`
258
- );
259
- return {
260
- success: null,
261
- failure: {
262
- error: ProtocolError.REMOTE_PEER_REJECTED,
263
- peerId: peer.id
264
- }
265
- };
266
- }
267
- return {
268
- success: peer.id,
269
- failure: null
270
- };
271
- }
272
-
273
- private onRequest(streamData: IncomingStreamData): void {
274
- const { connection, stream } = streamData;
275
- const { remotePeer } = connection;
276
- log.info(`Received message from ${remotePeer.toString()}`);
277
- try {
278
- pipe(stream, lp.decode, async (source) => {
279
- for await (const bytes of source) {
280
- const response = FilterPushRpc.decode(bytes.slice());
281
-
282
- const { pubsubTopic, wakuMessage } = response;
283
-
284
- if (!wakuMessage) {
285
- log.error("Received empty message");
286
- return;
287
- }
288
-
289
- if (!pubsubTopic) {
290
- log.error("Pubsub topic missing from push message");
291
- return;
292
- }
293
-
294
- await this.handleIncomingMessage(
295
- pubsubTopic,
296
- wakuMessage,
297
- connection.remotePeer.toString()
298
- );
299
- }
300
- }).then(
301
- () => {
302
- log.info("Receiving pipe closed.");
303
- },
304
- async (e) => {
305
- log.error(
306
- `Error with receiving pipe on peer:${connection.remotePeer.toString()} -- stream:${stream.id} -- protocol:${stream.protocol}: `,
307
- e
308
- );
309
- }
310
- );
311
- } catch (e) {
312
- log.error("Error decoding message", e);
313
- }
314
- }
315
- }
1
+ export { FilterCodecs, FilterCore } from "./filter.js";