e621stream 0.0.2 → 0.0.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.
- package/README.md +3 -2
- package/dist/E621Stream.d.ts +9 -1
- package/dist/E621Stream.js +41 -14
- package/dist/E621Stream.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -34,11 +34,12 @@ 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.
|
package/dist/E621Stream.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import Emitter from "./Emitter.ts";
|
|
2
2
|
import { type EventType, type PrivateEventType, type StreamEvent, type Subscription } from "./events.ts";
|
|
3
3
|
export interface Options {
|
|
4
|
-
/** Your e621 username & api key. */
|
|
4
|
+
/** Your e621 username & api key, or a token from https://e621.stream/authorize. */
|
|
5
5
|
auth?: {
|
|
6
6
|
apiKey: string;
|
|
7
7
|
username: string;
|
|
8
|
+
} | {
|
|
9
|
+
token: string;
|
|
8
10
|
};
|
|
9
11
|
/** Shown in the server's logs. */
|
|
10
12
|
client?: string;
|
|
11
13
|
/** An event id or millisecond timestamp to replay from. */
|
|
12
14
|
cursor?: number | string;
|
|
15
|
+
/** Used to get the websocket url from `/info`. */
|
|
16
|
+
fetch?: typeof fetch;
|
|
13
17
|
/** Reconnect when the connection drops. */
|
|
14
18
|
reconnect?: boolean;
|
|
15
19
|
subscriptions: Array<Subscription>;
|
|
20
|
+
/** The site, the websocket url comes from its `/info`. A `ws://` or `wss://` url is connected to directly. */
|
|
16
21
|
url?: string;
|
|
17
22
|
/** For runtimes without a global WebSocket (node < 22), the `ws` package works. */
|
|
18
23
|
WebSocket?: typeof WebSocket;
|
|
@@ -69,6 +74,7 @@ export declare class StreamError extends Error {
|
|
|
69
74
|
export declare class E621Stream extends Emitter<Listeners> {
|
|
70
75
|
private attempt;
|
|
71
76
|
private closing;
|
|
77
|
+
private connecting;
|
|
72
78
|
private heartbeat;
|
|
73
79
|
private lastError;
|
|
74
80
|
private lastHeartbeatAck;
|
|
@@ -81,9 +87,11 @@ export declare class E621Stream extends Emitter<Listeners> {
|
|
|
81
87
|
constructor(options: Options);
|
|
82
88
|
private handle;
|
|
83
89
|
private onClose;
|
|
90
|
+
private open;
|
|
84
91
|
private send;
|
|
85
92
|
private startHeartbeat;
|
|
86
93
|
private stopHeartbeat;
|
|
94
|
+
private websocketURL;
|
|
87
95
|
/** Close the connection. */
|
|
88
96
|
close(): void;
|
|
89
97
|
connect(): this;
|
package/dist/E621Stream.js
CHANGED
|
@@ -33,6 +33,7 @@ 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;
|
|
@@ -42,7 +43,7 @@ export class E621Stream extends Emitter {
|
|
|
42
43
|
options;
|
|
43
44
|
constructor(options) {
|
|
44
45
|
super();
|
|
45
|
-
this.options = { reconnect: true, url: "
|
|
46
|
+
this.options = { reconnect: true, url: "https://e621.stream", ...options };
|
|
46
47
|
this.cursor = options.cursor === undefined ? null : String(options.cursor);
|
|
47
48
|
}
|
|
48
49
|
handle(raw) {
|
|
@@ -57,7 +58,7 @@ export class E621Stream extends Emitter {
|
|
|
57
58
|
this.send({
|
|
58
59
|
op: "identify",
|
|
59
60
|
d: {
|
|
60
|
-
...(auth ? { auth: { username: auth.username, api_key: auth.apiKey } } : {}),
|
|
61
|
+
...(auth ? { auth: "token" in auth ? { token: auth.token } : { username: auth.username, api_key: auth.apiKey } } : {}),
|
|
61
62
|
...(client ? { client } : {}),
|
|
62
63
|
...(this.cursor === null ? {} : { cursor: this.cursor }),
|
|
63
64
|
subscriptions,
|
|
@@ -118,6 +119,20 @@ export class E621Stream extends Emitter {
|
|
|
118
119
|
this.connect();
|
|
119
120
|
}, delayMS);
|
|
120
121
|
}
|
|
122
|
+
open(Socket, url) {
|
|
123
|
+
const socket = this.socket = new Socket(url);
|
|
124
|
+
socket.addEventListener("open", () => { this.startHeartbeat(); });
|
|
125
|
+
socket.addEventListener("message", (event) => {
|
|
126
|
+
try {
|
|
127
|
+
this.handle(event.data);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
this.emit("error", err instanceof Error ? err : new Error(String(err)));
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
socket.addEventListener("close", (event) => { this.onClose(event.code, event.reason); });
|
|
134
|
+
socket.addEventListener("error", () => null);
|
|
135
|
+
}
|
|
121
136
|
send(payload) {
|
|
122
137
|
if (this.socket?.readyState === 1)
|
|
123
138
|
this.socket.send(JSON.stringify(payload));
|
|
@@ -138,6 +153,19 @@ export class E621Stream extends Emitter {
|
|
|
138
153
|
clearInterval(this.heartbeat);
|
|
139
154
|
this.heartbeat = null;
|
|
140
155
|
}
|
|
156
|
+
// fetched every time, so it can move
|
|
157
|
+
async websocketURL() {
|
|
158
|
+
const { url } = this.options;
|
|
159
|
+
if (/^wss?:\/\//i.test(url))
|
|
160
|
+
return url;
|
|
161
|
+
const res = await (this.options.fetch ?? fetch)(new URL("/info", url));
|
|
162
|
+
if (!res.ok)
|
|
163
|
+
throw new Error(`${url}/info returned ${res.status}`);
|
|
164
|
+
const { websocket } = await res.json();
|
|
165
|
+
if (typeof websocket !== "string")
|
|
166
|
+
throw new Error(`${url}/info didn't have a websocket url`);
|
|
167
|
+
return new URL(websocket, url).href;
|
|
168
|
+
}
|
|
141
169
|
/** Close the connection. */
|
|
142
170
|
close() {
|
|
143
171
|
this.closing = true;
|
|
@@ -147,7 +175,7 @@ export class E621Stream extends Emitter {
|
|
|
147
175
|
this.socket?.close(1000, "closed by client");
|
|
148
176
|
}
|
|
149
177
|
connect() {
|
|
150
|
-
if (this.socket)
|
|
178
|
+
if (this.socket || this.connecting)
|
|
151
179
|
return this;
|
|
152
180
|
this.closing = false;
|
|
153
181
|
// not present before node 22
|
|
@@ -155,18 +183,17 @@ export class E621Stream extends Emitter {
|
|
|
155
183
|
const Socket = this.options.WebSocket ?? global;
|
|
156
184
|
if (!Socket)
|
|
157
185
|
throw new Error("no WebSocket available, pass one with the WebSocket option");
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
186
|
+
this.connecting = true;
|
|
187
|
+
this.websocketURL().then((url) => {
|
|
188
|
+
this.connecting = false;
|
|
189
|
+
if (!this.closing)
|
|
190
|
+
this.open(Socket, url);
|
|
191
|
+
}, (err) => {
|
|
192
|
+
this.connecting = false;
|
|
193
|
+
this.emit("error", err instanceof Error ? err : new Error(String(err)));
|
|
194
|
+
// retried the same as a dropped connection
|
|
195
|
+
this.onClose(1006, "couldn't get the websocket url");
|
|
167
196
|
});
|
|
168
|
-
socket.addEventListener("close", (event) => { this.onClose(event.code, event.reason); });
|
|
169
|
-
socket.addEventListener("error", () => null);
|
|
170
197
|
return this;
|
|
171
198
|
}
|
|
172
199
|
/** Replace the current 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":"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"}
|