@atcute/jetstream 1.1.2 → 2.0.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.
package/README.md CHANGED
@@ -1,34 +1,243 @@
1
1
  # @atcute/jetstream
2
2
 
3
- a simple Jetstream client
3
+ lightweight Jetstream subscriber for AT Protocol.
4
+
5
+ ```sh
6
+ npm install @atcute/jetstream
7
+ ```
8
+
9
+ [Jetstream](https://docs.bsky.app/blog/jetstream) is a streaming service that delivers a filtered
10
+ firehose of events from the AT Protocol network over WebSocket. this package provides a simple
11
+ client to subscribe to these events.
12
+
13
+ ## usage
14
+
15
+ ### subscribing to events
16
+
17
+ create a subscription and iterate over events with `for await`:
4
18
 
5
19
  ```ts
6
20
  import { JetstreamSubscription } from '@atcute/jetstream';
7
- import { is } from '@atcute/lexicons';
8
21
 
9
- import { AppBskyFeedPost } from '@atcute/bluesky';
22
+ const subscription = new JetstreamSubscription({
23
+ url: 'wss://jetstream2.us-east.bsky.network',
24
+ });
25
+
26
+ for await (const event of subscription) {
27
+ console.log(event.kind, event.did);
28
+ }
29
+ ```
10
30
 
31
+ the connection opens when you start iterating and closes when you break out of the loop. the
32
+ underlying WebSocket automatically reconnects on disconnection.
33
+
34
+ ### filtering by collection
35
+
36
+ use `wantedCollections` to receive only events for specific record types:
37
+
38
+ ```ts
11
39
  const subscription = new JetstreamSubscription({
12
40
  url: 'wss://jetstream2.us-east.bsky.network',
13
- wantedCollections: ['app.bsky.feed.post'],
41
+ wantedCollections: ['app.bsky.feed.post', 'app.bsky.feed.like'],
14
42
  });
15
43
 
16
44
  for await (const event of subscription) {
17
45
  if (event.kind === 'commit') {
18
- const commit = event.commit;
46
+ console.log(event.commit.collection, event.commit.operation);
47
+ // -> "app.bsky.feed.post" "create"
48
+ }
49
+ }
50
+ ```
19
51
 
20
- if (commit.collection !== 'app.bsky.feed.post') {
21
- continue;
22
- }
52
+ ### filtering by account
53
+
54
+ use `wantedDids` to receive only events from specific accounts:
55
+
56
+ ```ts
57
+ const subscription = new JetstreamSubscription({
58
+ url: 'wss://jetstream2.us-east.bsky.network',
59
+ wantedDids: ['did:plc:z72i7hdynmk6r22z27h6tvur'], // @bsky.app
60
+ });
61
+ ```
62
+
63
+ ### handling event types
64
+
65
+ jetstream delivers three kinds of events:
66
+
67
+ ```ts
68
+ for await (const event of subscription) {
69
+ switch (event.kind) {
70
+ case 'commit': {
71
+ // record was created, updated, or deleted
72
+ const { collection, operation, rkey, rev } = event.commit;
23
73
 
24
- if (commit.operation === 'create') {
25
- const record = commit.record;
26
- if (!is(AppBskyFeedPost.mainSchema, record)) {
27
- continue;
74
+ if (operation === 'create' || operation === 'update') {
75
+ // record and cid are available on create/update
76
+ console.log(event.commit.record);
28
77
  }
29
78
 
30
- console.log(`${record.text}`);
79
+ break;
80
+ }
81
+
82
+ case 'identity': {
83
+ // handle or DID document changed
84
+ const { did, handle, seq, time } = event.identity;
85
+ break;
86
+ }
87
+
88
+ case 'account': {
89
+ // account status changed (activated, deactivated, etc.)
90
+ const { did, active, seq, time } = event.account;
91
+ break;
31
92
  }
32
93
  }
33
94
  }
34
95
  ```
96
+
97
+ ### validating records
98
+
99
+ jetstream events include the raw record data. use `is()` from `@atcute/lexicons` to validate and
100
+ narrow the type:
101
+
102
+ ```ts
103
+ import { JetstreamSubscription } from '@atcute/jetstream';
104
+ import { is } from '@atcute/lexicons';
105
+
106
+ import { AppBskyFeedPost } from '@atcute/bluesky';
107
+
108
+ const subscription = new JetstreamSubscription({
109
+ url: 'wss://jetstream2.us-east.bsky.network',
110
+ wantedCollections: ['app.bsky.feed.post'],
111
+ });
112
+
113
+ for await (const event of subscription) {
114
+ if (event.kind !== 'commit') {
115
+ continue;
116
+ }
117
+
118
+ const commit = event.commit;
119
+ if (commit.operation !== 'create') {
120
+ continue;
121
+ }
122
+
123
+ // validate the record against the schema
124
+ if (!is(AppBskyFeedPost.mainSchema, commit.record)) {
125
+ console.warn('invalid record', commit.record);
126
+ continue;
127
+ }
128
+
129
+ // commit.record is now typed as AppBskyFeedPost.$record
130
+ console.log(`@${event.did}: ${commit.record.text}`);
131
+ }
132
+ ```
133
+
134
+ ### resuming from a cursor
135
+
136
+ jetstream supports cursors for resuming from a specific point. the cursor is a timestamp in
137
+ microseconds:
138
+
139
+ ```ts
140
+ const subscription = new JetstreamSubscription({
141
+ url: 'wss://jetstream2.us-east.bsky.network',
142
+ // resume from a saved cursor
143
+ cursor: 1699900000000000,
144
+ });
145
+
146
+ // save the cursor periodically to resume later
147
+ setInterval(() => {
148
+ localStorage.setItem('jetstream-cursor', String(subscription.cursor));
149
+ }, 5_000);
150
+ ```
151
+
152
+ when switching between jetstream instances (e.g., when using multiple URLs for failover), the client
153
+ automatically rolls back the cursor by 10 seconds to avoid missing events due to clock differences.
154
+
155
+ ### using multiple servers
156
+
157
+ pass an array of URLs for automatic failover. the client randomly selects one on each connection:
158
+
159
+ ```ts
160
+ const subscription = new JetstreamSubscription({
161
+ url: [
162
+ 'wss://jetstream1.us-east.bsky.network',
163
+ 'wss://jetstream2.us-east.bsky.network',
164
+ 'wss://jetstream1.us-west.bsky.network',
165
+ 'wss://jetstream2.us-west.bsky.network',
166
+ ],
167
+ });
168
+ ```
169
+
170
+ ### updating options at runtime
171
+
172
+ change filters without reconnecting using `updateOptions()`:
173
+
174
+ ```ts
175
+ // start with all collections
176
+ const subscription = new JetstreamSubscription({
177
+ url: 'wss://jetstream2.us-east.bsky.network',
178
+ });
179
+
180
+ // later, filter to only posts
181
+ subscription.updateOptions({
182
+ wantedCollections: ['app.bsky.feed.post'],
183
+ });
184
+
185
+ // add accounts to filter
186
+ subscription.updateOptions({
187
+ wantedDids: ['did:plc:...'],
188
+ });
189
+ ```
190
+
191
+ changes to `wantedCollections` and `wantedDids` are sent to the server without reconnecting. other
192
+ option changes trigger a reconnection.
193
+
194
+ ### connection lifecycle callbacks
195
+
196
+ handle connection events for logging or UI updates:
197
+
198
+ ```ts
199
+ const subscription = new JetstreamSubscription({
200
+ url: 'wss://jetstream2.us-east.bsky.network',
201
+ onConnectionOpen(event) {
202
+ console.log('connected to jetstream');
203
+ },
204
+ onConnectionClose(event) {
205
+ console.log('disconnected from jetstream', event.code, event.reason);
206
+ },
207
+ onConnectionError(event) {
208
+ console.error('jetstream error', event.error);
209
+ },
210
+ });
211
+ ```
212
+
213
+ ### disabling event validation
214
+
215
+ by default, jetstream events are validated. disable this for slightly better performance if you
216
+ trust the server:
217
+
218
+ ```ts
219
+ const subscription = new JetstreamSubscription({
220
+ url: 'wss://jetstream2.us-east.bsky.network',
221
+ validateEvents: false,
222
+ });
223
+ ```
224
+
225
+ note: this only disables validation of the event envelope. you should still validate records using
226
+ `is()` from `@atcute/lexicons`.
227
+
228
+ ### WebSocket options
229
+
230
+ pass options to the underlying
231
+ [partysocket](https://github.com/partykit/partykit/tree/main/packages/partysocket) WebSocket for
232
+ custom reconnection behavior:
233
+
234
+ ```ts
235
+ const subscription = new JetstreamSubscription({
236
+ url: 'wss://jetstream2.us-east.bsky.network',
237
+ ws: {
238
+ maxRetries: 10,
239
+ minReconnectionDelay: 1000,
240
+ maxReconnectionDelay: 30000,
241
+ },
242
+ });
243
+ ```
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './subscription.js';
2
- export * from './types.js';
3
- export * from './typedefs.js';
1
+ export * from './subscription.ts';
2
+ export * from './typedefs.ts';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from './subscription.js';
2
- export * from './types.js';
3
2
  export * from './typedefs.js';
4
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
@@ -2,7 +2,6 @@ import type { Did } from '@atcute/lexicons';
2
2
  import { EventIterator } from '@mary-ext/event-iterator';
3
3
  import type { CloseEvent, ErrorEvent, Options } from 'partysocket/ws';
4
4
  import type { ReadonlyDeep } from 'type-fest';
5
- import type { JetstreamEvent } from './types.js';
6
5
  export interface JetstreamSubscriptionOptions {
7
6
  url: string | string[];
8
7
  cursor?: number;
@@ -24,6 +23,11 @@ export interface JetstreamSubscriptionOptions {
24
23
  onConnectionOpen?: (event: Event) => void;
25
24
  onConnectionClose?: (event: CloseEvent) => void;
26
25
  onConnectionError?: (event: ErrorEvent) => void;
26
+ /**
27
+ * called when an event fails schema validation. the error is a valibot `ValiError` carrying
28
+ * the validation issues. without a handler, invalid events are silently dropped.
29
+ */
30
+ onError?: (err: unknown) => void;
27
31
  /**
28
32
  * WebSocket connection options
29
33
  */
@@ -32,7 +36,71 @@ export interface JetstreamSubscriptionOptions {
32
36
  export declare class JetstreamSubscription {
33
37
  #private;
34
38
  constructor(options: JetstreamSubscriptionOptions);
35
- [Symbol.asyncIterator](): EventIterator<JetstreamEvent>;
39
+ [Symbol.asyncIterator](): EventIterator<({
40
+ did: `did:${string}:${string}`;
41
+ time_us: number;
42
+ kind: "commit";
43
+ commit: ({
44
+ rev: string;
45
+ collection: `${string}.${string}.${string}`;
46
+ rkey: string;
47
+ operation: "create";
48
+ cid: string;
49
+ record: {
50
+ [x: string]: unknown;
51
+ };
52
+ } & {
53
+ [key: string]: unknown;
54
+ }) | ({
55
+ rev: string;
56
+ collection: `${string}.${string}.${string}`;
57
+ rkey: string;
58
+ operation: "update";
59
+ cid: string;
60
+ record: {
61
+ [x: string]: unknown;
62
+ };
63
+ } & {
64
+ [key: string]: unknown;
65
+ }) | ({
66
+ rev: string;
67
+ collection: `${string}.${string}.${string}`;
68
+ rkey: string;
69
+ operation: "delete";
70
+ } & {
71
+ [key: string]: unknown;
72
+ });
73
+ } & {
74
+ [key: string]: unknown;
75
+ }) | ({
76
+ did: `did:${string}:${string}`;
77
+ time_us: number;
78
+ kind: "identity";
79
+ identity: {
80
+ did: `did:${string}:${string}`;
81
+ handle: `${string}.${string}`;
82
+ seq: number;
83
+ time: string;
84
+ } & {
85
+ [key: string]: unknown;
86
+ };
87
+ } & {
88
+ [key: string]: unknown;
89
+ }) | ({
90
+ did: `did:${string}:${string}`;
91
+ time_us: number;
92
+ kind: "account";
93
+ account: {
94
+ did: `did:${string}:${string}`;
95
+ active: boolean;
96
+ seq: number;
97
+ time: string;
98
+ } & {
99
+ [key: string]: unknown;
100
+ };
101
+ } & {
102
+ [key: string]: unknown;
103
+ })>;
36
104
  get cursor(): number;
37
105
  getOptions(): ReadonlyDeep<JetstreamSubscriptionOptions>;
38
106
  updateOptions(options: Partial<JetstreamSubscriptionOptions>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../lib/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAGrE,MAAM,WAAW,4BAA4B;IAC5C,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IAEnB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAEhD;;OAEG;IACH,EAAE,CAAC,EAAE,OAAO,CAAC;CACb;AAID,qBAAa,qBAAqB;;gBAUrB,OAAO,EAAE,4BAA4B;IAoHjD,CAAC,MAAM,CAAC,aAAa,CAAC;IAoBtB,IAAI,MAAM,WAET;IAED,UAAU,IAAI,YAAY,CAAC,4BAA4B,CAAC;IAIxD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,4BAA4B,CAAC,GAAG,IAAI;CAmBnE"}
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../lib/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAK9C,MAAM,WAAW,4BAA4B;IAC5C,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IAEnB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,EAAE,CAAC,EAAE,OAAO,CAAC;CACb;AAED,qBAAa,qBAAqB;;IAUjC,YAAY,OAAO,EAAE,4BAA4B,EAQhD;IA8GD,CAAC,MAAM,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkBrB;IAED,IAAI,MAAM,WAET;IAED,UAAU,IAAI,YAAY,CAAC,4BAA4B,CAAC,CAEvD;IAED,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAsBlE;CACD"}
@@ -1,8 +1,8 @@
1
1
  import { EventIterator } from '@mary-ext/event-iterator';
2
2
  import { SimpleEventEmitter } from '@mary-ext/simple-event-emitter';
3
3
  import { WebSocket as ReconnectingWebSocket } from 'partysocket';
4
+ import * as v from 'valibot';
4
5
  import { jetstreamEventSchema } from './typedefs.js';
5
- const PARSE_OPTIONS = { mode: 'passthrough' };
6
6
  export class JetstreamSubscription {
7
7
  #listening = 0;
8
8
  #ws;
@@ -36,7 +36,7 @@ export class JetstreamSubscription {
36
36
  if (this.#ws !== undefined) {
37
37
  return;
38
38
  }
39
- const { url: wsUrls, ws: wsOptions, validateEvents = true, onConnectionClose, onConnectionError, onConnectionOpen, } = this.#options;
39
+ const { url: wsUrls, ws: wsOptions, validateEvents = true, onConnectionClose, onConnectionError, onConnectionOpen, onError, } = this.#options;
40
40
  const emitter = this.#emitter;
41
41
  let selectedUrl;
42
42
  const getUrl = () => {
@@ -70,11 +70,12 @@ export class JetstreamSubscription {
70
70
  const raw = JSON.parse(ev.data);
71
71
  let event;
72
72
  if (validateEvents) {
73
- const result = jetstreamEventSchema.try(raw, PARSE_OPTIONS);
74
- if (!result.ok) {
73
+ const result = v.safeParse(jetstreamEventSchema, raw);
74
+ if (!result.success) {
75
+ onError?.(new v.ValiError(result.issues));
75
76
  return;
76
77
  }
77
- event = result.value;
78
+ event = result.output;
78
79
  }
79
80
  else {
80
81
  event = raw;
@@ -119,21 +120,24 @@ export class JetstreamSubscription {
119
120
  return this.#options;
120
121
  }
121
122
  updateOptions(options) {
123
+ const previousCursor = this.#cursor;
122
124
  this.#options = { ...this.#options, ...options };
123
125
  if (options.cursor !== undefined) {
124
126
  this.#cursor = options.cursor;
125
127
  }
126
128
  if (this.#ws !== undefined) {
127
- const isOptionsUpdate = Object.keys(options).every((key) => {
128
- return key === 'wantedCollections' || key === 'wantedDids';
129
+ const cursorChanged = this.#cursor !== previousCursor;
130
+ const filtersChanged = 'wantedCollections' in options || 'wantedDids' in options;
131
+ const otherKeys = Object.keys(options).some((key) => {
132
+ return key !== 'wantedCollections' && key !== 'wantedDids' && key !== 'cursor';
129
133
  });
130
- if (isOptionsUpdate) {
131
- this.#sendOptionsUpdate();
132
- }
133
- else {
134
+ if (cursorChanged || otherKeys) {
134
135
  this.#destroy();
135
136
  this.#create();
136
137
  }
138
+ else if (filtersChanged) {
139
+ this.#sendOptionsUpdate();
140
+ }
137
141
  }
138
142
  }
139
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../lib/subscription.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../lib/subscription.ts"],"names":[],"mappings":"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"}