e621stream 0.0.2 → 0.0.4
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 +13 -3
- package/dist/E621Stream.d.ts +25 -1
- package/dist/E621Stream.js +75 -14
- package/dist/E621Stream.js.map +1 -1
- package/dist/generated.d.ts +17 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -34,13 +34,23 @@ Listen for an event type with `on("post.create", ...)`, or everything with `on("
|
|
|
34
34
|
| Option | Type | Default | Description |
|
|
35
35
|
|:---:|:---:|:---:|:---:|
|
|
36
36
|
| `subscriptions` | Array | | what to subscribe to, `stream.subscribe([...])` changes it later |
|
|
37
|
-
| `auth` | Object | None | `{ username, apiKey }` |
|
|
37
|
+
| `auth` | Object | None | `{ username, apiKey }`, or `{ token }` from [/authorize](https://e621.stream/authorize) |
|
|
38
38
|
| `cursor` | String \| Number | None | an event id or ms timestamp to replay from, `stream.cursor` is the last event you got |
|
|
39
39
|
| `reconnect` | Boolean | `true` | reconnect when the connection drops (not after things like bad credentials) |
|
|
40
40
|
| `client` | String | None | shown in the server's logs |
|
|
41
|
-
| `url` | String | `
|
|
41
|
+
| `url` | String | `https://e621.stream` | the websocket url comes from its `/info`, a `ws://` or `wss://` url is connected to directly |
|
|
42
|
+
| `fetch` | Function | global `fetch` | used for `/info` |
|
|
42
43
|
| `WebSocket` | WebSocket | global | for older node, the `ws` package works |
|
|
43
44
|
|
|
44
45
|
Private events like `dmail.create` have to be subscribed to by name.
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
`stream.snapshots(resource, ids)` gets what was last seen of up to 100 records at once (see [Snapshots](https://e621.stream/snapshots/)), keyed by id with `null` for ones that aren't known. It throws if you aren't ready yet, and rejects if the connection closes before the reply.
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
stream.on("ready", async () => {
|
|
51
|
+
const posts = await stream.snapshots("post", [6843484, 6843485]);
|
|
52
|
+
console.log(posts[6843484]?.tags?.general);
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Records like `LegacyPost`, `Comment` and `ForumTopic` come from [e621-openapi](https://www.npmjs.com/package/e621-openapi)'s types, and are exported here too. Mod action events are typed per action, so checking `event.data.action` narrows `event.data.values`.
|
package/dist/E621Stream.d.ts
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import Emitter from "./Emitter.ts";
|
|
2
2
|
import { type EventType, type PrivateEventType, type StreamEvent, type Subscription } from "./events.ts";
|
|
3
|
+
import type { SnapshotDataMap } from "./generated.ts";
|
|
3
4
|
export interface Options {
|
|
4
|
-
/** Your e621 username & api key. */
|
|
5
|
+
/** Your e621 username & api key, or a token from https://e621.stream/authorize. */
|
|
5
6
|
auth?: {
|
|
6
7
|
apiKey: string;
|
|
7
8
|
username: string;
|
|
9
|
+
} | {
|
|
10
|
+
token: string;
|
|
8
11
|
};
|
|
9
12
|
/** Shown in the server's logs. */
|
|
10
13
|
client?: string;
|
|
11
14
|
/** An event id or millisecond timestamp to replay from. */
|
|
12
15
|
cursor?: number | string;
|
|
16
|
+
/** Used to get the websocket url from `/info`. */
|
|
17
|
+
fetch?: typeof fetch;
|
|
13
18
|
/** Reconnect when the connection drops. */
|
|
14
19
|
reconnect?: boolean;
|
|
15
20
|
subscriptions: Array<Subscription>;
|
|
21
|
+
/** The site, the websocket url comes from its `/info`. A `ws://` or `wss://` url is connected to directly. */
|
|
16
22
|
url?: string;
|
|
17
23
|
/** For runtimes without a global WebSocket (node < 22), the `ws` package works. */
|
|
18
24
|
WebSocket?: typeof WebSocket;
|
|
@@ -30,6 +36,9 @@ export interface Ready {
|
|
|
30
36
|
name: string;
|
|
31
37
|
} | null;
|
|
32
38
|
}
|
|
39
|
+
export type SnapshotResource = keyof SnapshotDataMap;
|
|
40
|
+
/** Keyed by id, `null` for ones that aren't known. */
|
|
41
|
+
export type Snapshots<R extends SnapshotResource> = Record<number, SnapshotDataMap[R] | null>;
|
|
33
42
|
export interface ClientEvents {
|
|
34
43
|
close: [{
|
|
35
44
|
code: number;
|
|
@@ -69,9 +78,13 @@ export declare class StreamError extends Error {
|
|
|
69
78
|
export declare class E621Stream extends Emitter<Listeners> {
|
|
70
79
|
private attempt;
|
|
71
80
|
private closing;
|
|
81
|
+
private connecting;
|
|
72
82
|
private heartbeat;
|
|
73
83
|
private lastError;
|
|
74
84
|
private lastHeartbeatAck;
|
|
85
|
+
private nonce;
|
|
86
|
+
private pendingSnapshots;
|
|
87
|
+
private ready;
|
|
75
88
|
private reconnectTimer;
|
|
76
89
|
private socket;
|
|
77
90
|
cursor: string | null;
|
|
@@ -81,12 +94,23 @@ export declare class E621Stream extends Emitter<Listeners> {
|
|
|
81
94
|
constructor(options: Options);
|
|
82
95
|
private handle;
|
|
83
96
|
private onClose;
|
|
97
|
+
private open;
|
|
84
98
|
private send;
|
|
85
99
|
private startHeartbeat;
|
|
86
100
|
private stopHeartbeat;
|
|
101
|
+
private websocketURL;
|
|
87
102
|
/** Close the connection. */
|
|
88
103
|
close(): void;
|
|
89
104
|
connect(): this;
|
|
105
|
+
/**
|
|
106
|
+
* Get what was last seen of up to 100 records. Only the fields update events are compared on are kept, see https://e621.stream/snapshots/
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* const posts = await stream.snapshots("post", [1, 2, 3]);
|
|
110
|
+
* console.log(posts[1]?.tags);
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
snapshots<R extends SnapshotResource>(resource: R, ids: Array<number>): Promise<Snapshots<R>>;
|
|
90
114
|
/** Replace the current subscriptions. */
|
|
91
115
|
subscribe(subscriptions: Array<Subscription>): void;
|
|
92
116
|
}
|
package/dist/E621Stream.js
CHANGED
|
@@ -33,16 +33,20 @@ const HEARTBEAT_MS = 30_000;
|
|
|
33
33
|
export class E621Stream extends Emitter {
|
|
34
34
|
attempt = 0;
|
|
35
35
|
closing = false;
|
|
36
|
+
connecting = false;
|
|
36
37
|
heartbeat = null;
|
|
37
38
|
lastError = null;
|
|
38
39
|
lastHeartbeatAck = true;
|
|
40
|
+
nonce = 0;
|
|
41
|
+
pendingSnapshots = new Map();
|
|
42
|
+
ready = false;
|
|
39
43
|
reconnectTimer = null;
|
|
40
44
|
socket = null;
|
|
41
45
|
cursor;
|
|
42
46
|
options;
|
|
43
47
|
constructor(options) {
|
|
44
48
|
super();
|
|
45
|
-
this.options = { reconnect: true, url: "
|
|
49
|
+
this.options = { reconnect: true, url: "https://e621.stream", ...options };
|
|
46
50
|
this.cursor = options.cursor === undefined ? null : String(options.cursor);
|
|
47
51
|
}
|
|
48
52
|
handle(raw) {
|
|
@@ -57,7 +61,7 @@ export class E621Stream extends Emitter {
|
|
|
57
61
|
this.send({
|
|
58
62
|
op: "identify",
|
|
59
63
|
d: {
|
|
60
|
-
...(auth ? { auth: { username: auth.username, api_key: auth.apiKey } } : {}),
|
|
64
|
+
...(auth ? { auth: "token" in auth ? { token: auth.token } : { username: auth.username, api_key: auth.apiKey } } : {}),
|
|
61
65
|
...(client ? { client } : {}),
|
|
62
66
|
...(this.cursor === null ? {} : { cursor: this.cursor }),
|
|
63
67
|
subscriptions,
|
|
@@ -67,6 +71,7 @@ export class E621Stream extends Emitter {
|
|
|
67
71
|
}
|
|
68
72
|
case "ready": {
|
|
69
73
|
this.attempt = 0;
|
|
74
|
+
this.ready = true;
|
|
70
75
|
this.emit("ready", message.d);
|
|
71
76
|
break;
|
|
72
77
|
}
|
|
@@ -87,6 +92,15 @@ export class E621Stream extends Emitter {
|
|
|
87
92
|
this.emit("subscribed", message.d.subscriptions);
|
|
88
93
|
break;
|
|
89
94
|
}
|
|
95
|
+
case "snapshot": {
|
|
96
|
+
const { nonce, snapshots } = message.d;
|
|
97
|
+
const pending = nonce === null ? undefined : this.pendingSnapshots.get(nonce);
|
|
98
|
+
if (pending) {
|
|
99
|
+
this.pendingSnapshots.delete(nonce);
|
|
100
|
+
pending.resolve(snapshots);
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
90
104
|
case "heartbeat_ack": {
|
|
91
105
|
this.lastHeartbeatAck = true;
|
|
92
106
|
break;
|
|
@@ -101,8 +115,12 @@ export class E621Stream extends Emitter {
|
|
|
101
115
|
onClose(code, reason) {
|
|
102
116
|
this.stopHeartbeat();
|
|
103
117
|
this.socket = null;
|
|
118
|
+
this.ready = false;
|
|
104
119
|
const error = this.lastError;
|
|
105
120
|
this.lastError = null;
|
|
121
|
+
for (const pending of this.pendingSnapshots.values())
|
|
122
|
+
pending.reject(error ?? new StreamError(code, reason || "connection closed"));
|
|
123
|
+
this.pendingSnapshots.clear();
|
|
106
124
|
const reconnecting = !this.closing && this.options.reconnect !== false && !FATAL.has(code);
|
|
107
125
|
if (error)
|
|
108
126
|
this.emit("error", error);
|
|
@@ -118,6 +136,20 @@ export class E621Stream extends Emitter {
|
|
|
118
136
|
this.connect();
|
|
119
137
|
}, delayMS);
|
|
120
138
|
}
|
|
139
|
+
open(Socket, url) {
|
|
140
|
+
const socket = this.socket = new Socket(url);
|
|
141
|
+
socket.addEventListener("open", () => { this.startHeartbeat(); });
|
|
142
|
+
socket.addEventListener("message", (event) => {
|
|
143
|
+
try {
|
|
144
|
+
this.handle(event.data);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
this.emit("error", err instanceof Error ? err : new Error(String(err)));
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
socket.addEventListener("close", (event) => { this.onClose(event.code, event.reason); });
|
|
151
|
+
socket.addEventListener("error", () => null);
|
|
152
|
+
}
|
|
121
153
|
send(payload) {
|
|
122
154
|
if (this.socket?.readyState === 1)
|
|
123
155
|
this.socket.send(JSON.stringify(payload));
|
|
@@ -138,6 +170,19 @@ export class E621Stream extends Emitter {
|
|
|
138
170
|
clearInterval(this.heartbeat);
|
|
139
171
|
this.heartbeat = null;
|
|
140
172
|
}
|
|
173
|
+
// fetched every time, so it can move
|
|
174
|
+
async websocketURL() {
|
|
175
|
+
const { url } = this.options;
|
|
176
|
+
if (/^wss?:\/\//i.test(url))
|
|
177
|
+
return url;
|
|
178
|
+
const res = await (this.options.fetch ?? fetch)(new URL("/info", url));
|
|
179
|
+
if (!res.ok)
|
|
180
|
+
throw new Error(`${url}/info returned ${res.status}`);
|
|
181
|
+
const { websocket } = await res.json();
|
|
182
|
+
if (typeof websocket !== "string")
|
|
183
|
+
throw new Error(`${url}/info didn't have a websocket url`);
|
|
184
|
+
return new URL(websocket, url).href;
|
|
185
|
+
}
|
|
141
186
|
/** Close the connection. */
|
|
142
187
|
close() {
|
|
143
188
|
this.closing = true;
|
|
@@ -147,7 +192,7 @@ export class E621Stream extends Emitter {
|
|
|
147
192
|
this.socket?.close(1000, "closed by client");
|
|
148
193
|
}
|
|
149
194
|
connect() {
|
|
150
|
-
if (this.socket)
|
|
195
|
+
if (this.socket || this.connecting)
|
|
151
196
|
return this;
|
|
152
197
|
this.closing = false;
|
|
153
198
|
// not present before node 22
|
|
@@ -155,20 +200,36 @@ export class E621Stream extends Emitter {
|
|
|
155
200
|
const Socket = this.options.WebSocket ?? global;
|
|
156
201
|
if (!Socket)
|
|
157
202
|
throw new Error("no WebSocket available, pass one with the WebSocket option");
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
203
|
+
this.connecting = true;
|
|
204
|
+
this.websocketURL().then((url) => {
|
|
205
|
+
this.connecting = false;
|
|
206
|
+
if (!this.closing)
|
|
207
|
+
this.open(Socket, url);
|
|
208
|
+
}, (err) => {
|
|
209
|
+
this.connecting = false;
|
|
210
|
+
this.emit("error", err instanceof Error ? err : new Error(String(err)));
|
|
211
|
+
// retried the same as a dropped connection
|
|
212
|
+
this.onClose(1006, "couldn't get the websocket url");
|
|
167
213
|
});
|
|
168
|
-
socket.addEventListener("close", (event) => { this.onClose(event.code, event.reason); });
|
|
169
|
-
socket.addEventListener("error", () => null);
|
|
170
214
|
return this;
|
|
171
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Get what was last seen of up to 100 records. Only the fields update events are compared on are kept, see https://e621.stream/snapshots/
|
|
218
|
+
* @example
|
|
219
|
+
* ```ts
|
|
220
|
+
* const posts = await stream.snapshots("post", [1, 2, 3]);
|
|
221
|
+
* console.log(posts[1]?.tags);
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
async snapshots(resource, ids) {
|
|
225
|
+
if (!this.ready)
|
|
226
|
+
throw new Error("not ready");
|
|
227
|
+
const nonce = String(++this.nonce);
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
this.pendingSnapshots.set(nonce, { resolve: resolve, reject });
|
|
230
|
+
this.send({ op: "snapshot", d: { resource, ids, nonce } });
|
|
231
|
+
});
|
|
232
|
+
}
|
|
172
233
|
/** Replace the current subscriptions. */
|
|
173
234
|
subscribe(subscriptions) {
|
|
174
235
|
this.options.subscriptions = subscriptions;
|
package/dist/E621Stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"E621Stream.js","sourceRoot":"","sources":["../lib/E621Stream.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAA8E,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"E621Stream.js","sourceRoot":"","sources":["../lib/E621Stream.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAA8E,MAAM,aAAa,CAAC;AAmDrH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACb;IAArB,YAAqB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS;IAC1B,UAAU,CAAC,UAAU;IACrB,UAAU,CAAC,YAAY;IACvB,UAAU,CAAC,qBAAqB;IAChC,UAAU,CAAC,kBAAkB;IAC7B,UAAU,CAAC,oBAAoB;IAC/B,UAAU,CAAC,cAAc;IACzB,UAAU,CAAC,sBAAsB;IACjC,UAAU,CAAC,YAAY;IACvB,UAAU,CAAC,MAAM;CACpB,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAkB;IACtC,OAAO,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAG,KAAK,CAAC;IACnB,SAAS,GAA0C,IAAI,CAAC;IACxD,SAAS,GAAuB,IAAI,CAAC;IACrC,gBAAgB,GAAG,IAAI,CAAC;IACxB,KAAK,GAAG,CAAC,CAAC;IACV,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IACtD,KAAK,GAAG,KAAK,CAAC;IACd,cAAc,GAAyC,IAAI,CAAC;IAC5D,MAAM,GAAqB,IAAI,CAAC;IACxC,MAAM,CAAgB;IACb,OAAO,CAA4B;IAE5C,YAAY,OAAgB;QACxB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAEO,MAAM,CAAC,GAAY;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAC7D,OAAO;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2G,CAAC;QAC1I,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACX,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC;oBACN,EAAE,EAAE,UAAU;oBACd,CAAC,EAAE;wBACC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtH,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;wBACxD,aAAa;qBAChB;iBACJ,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAU,CAAC,CAAC;gBACvC,MAAM;YACV,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBACd,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAiB,CAAC;gBAC3J,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC7B,+BAA+B;gBAC/B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACtC,MAAM;YACV,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAA8C,CAAC,CAAC;gBACpF,MAAM;YACV,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAG,OAAO,CAAC,CAA4C,CAAC,aAAa,CAAC,CAAC;gBAC7F,MAAM;YACV,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,CAAqE,CAAC;gBAC3G,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9E,IAAI,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;oBACrC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACV,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,CAAsC,CAAC;gBAC/E,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,IAAY,EAAE,MAAc;QACxC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,mBAAmB,CAAC,CAAC,CAAC;QACpI,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3F,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACtG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,EAAE,OAAO,CAAC,CAAC;IAChB,CAAC;IAEO,IAAI,CAAC,MAAwB,EAAE,GAAW;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAmB,EAAE,EAAE;YACvD,IAAI,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAEO,IAAI,CAAC,OAAe;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,cAAc;QAClB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACvD,OAAO;YACX,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACnC,CAAC,EAAE,YAAY,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa;QACjB,IAAI,IAAI,CAAC,SAAS;YAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,qCAAqC;IAC7B,KAAK,CAAC,YAAY;QACtB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,kBAAkB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;QAClE,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,mCAAmC,CAAC,CAAC;QAC9F,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,cAAc;YAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACH,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,6BAA6B;QAC7B,MAAM,MAAM,GAAI,UAA4D,CAAC,SAAS,CAAC;QACvF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC,EAAE,CAAC,GAAY,EAAE,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,2CAA2C;YAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAA6B,QAAW,EAAE,GAAkB;QACvE,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAqC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7F,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yCAAyC;IACzC,SAAS,CAAC,aAAkC;QACxC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;CACJ"}
|
package/dist/generated.d.ts
CHANGED
|
@@ -788,6 +788,7 @@ export interface ModActionValues {
|
|
|
788
788
|
tag_name: string;
|
|
789
789
|
};
|
|
790
790
|
password_reset: {
|
|
791
|
+
credentials_revoked: boolean;
|
|
791
792
|
invalidated: boolean;
|
|
792
793
|
user_id: number;
|
|
793
794
|
};
|
|
@@ -1220,3 +1221,19 @@ export interface EventDataMap {
|
|
|
1220
1221
|
post_set: PostSet;
|
|
1221
1222
|
};
|
|
1222
1223
|
}
|
|
1224
|
+
/** What `snapshot` sends back for each resource. */
|
|
1225
|
+
export interface SnapshotDataMap {
|
|
1226
|
+
post: PostSnapshot;
|
|
1227
|
+
comment: Pick<Comment, "id" | "body" | "is_hidden" | "is_sticky" | "warning_type" | "warning_user_id">;
|
|
1228
|
+
forum_post: Pick<ForumPost, "id" | "body" | "is_hidden" | "warning_type" | "warning_user_id">;
|
|
1229
|
+
forum_topic: Pick<ForumTopic, "id" | "title" | "category_id" | "is_hidden" | "is_locked" | "is_sticky">;
|
|
1230
|
+
tag_alias: Pick<TagAlias, "id" | "status" | "antecedent_name" | "consequent_name" | "reason" | "approver_id" | "forum_topic_id">;
|
|
1231
|
+
tag_implication: Pick<TagImplication, "id" | "status" | "antecedent_name" | "consequent_name" | "reason" | "approver_id" | "forum_topic_id">;
|
|
1232
|
+
bulk_update_request: Pick<BulkUpdateRequest, "id" | "status" | "title" | "script" | "approver_id" | "forum_topic_id">;
|
|
1233
|
+
help_page: Pick<HelpPage, "id" | "name" | "title" | "wiki_page" | "related">;
|
|
1234
|
+
takedown: Pick<Takedown, "id" | "status">;
|
|
1235
|
+
post_flag: Pick<PostFlag, "id" | "is_resolved">;
|
|
1236
|
+
post_set: Pick<PostSet, "id" | "name" | "shortname" | "description" | "is_public" | "transfer_on_delete" | "post_ids">;
|
|
1237
|
+
news_update: Pick<NewsUpdate, "id" | "message">;
|
|
1238
|
+
post_replacement: Pick<PostReplacement, "id" | "status" | "approver_id" | "reason" | "post_id">;
|
|
1239
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { E621Stream, StreamError, type ClientEvents, type Options, type Ready } from "./E621Stream.ts";
|
|
1
|
+
export { E621Stream, StreamError, type ClientEvents, type Options, type Ready, type SnapshotResource, type Snapshots } from "./E621Stream.ts";
|
|
2
2
|
export * from "./events.ts";
|
|
3
3
|
export * from "./changes.ts";
|
|
4
4
|
export type * from "./generated.ts";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAsF,MAAM,iBAAiB,CAAC;AAC9I,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,OAAO,IAAI,OAAO,EAAiB,MAAM,cAAc,CAAC"}
|