streamops-twitch-connector 0.1.3 → 0.1.5
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,89 +1,89 @@
|
|
|
1
|
-
# streamops-twitch-connector
|
|
2
|
-
|
|
3
|
-
# StreamOps Twitch Connector
|
|
4
|
-
|
|
5
|
-
A framework-independent TypeScript connector for Twitch OAuth, Helix API
|
|
6
|
-
requests, chat messaging, and EventSub WebSocket notifications.
|
|
7
|
-
|
|
8
|
-
## Requirements
|
|
9
|
-
|
|
10
|
-
- Node.js 22 or newer
|
|
11
|
-
- A Twitch application with a registered Client ID
|
|
12
|
-
- A token store implementation supplied by the consuming application
|
|
13
|
-
|
|
14
|
-
## Install dependencies
|
|
15
|
-
|
|
16
|
-
```text
|
|
17
|
-
npm install
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Build
|
|
21
|
-
|
|
22
|
-
```text
|
|
23
|
-
npm run build
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Basic usage
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
import {
|
|
30
|
-
TwitchClient,
|
|
31
|
-
type TwitchTokenStore,
|
|
32
|
-
type TwitchTokens,
|
|
33
|
-
} from 'streamops-twitch-connector';
|
|
34
|
-
|
|
35
|
-
const tokenStore: TwitchTokenStore = {
|
|
36
|
-
async load(): Promise<TwitchTokens | null> {
|
|
37
|
-
// Load tokens from your preferred secure storage.
|
|
38
|
-
return null;
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
async save(tokens: TwitchTokens): Promise<void> {
|
|
42
|
-
// Persist tokens securely.
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
async clear(): Promise<void> {
|
|
46
|
-
// Remove persisted tokens.
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const twitch = new TwitchClient({
|
|
51
|
-
clientId: process.env.TWITCH_CLIENT_ID!,
|
|
52
|
-
scopes: ['user:read:chat', 'user:write:chat'],
|
|
53
|
-
tokenStore,
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const login = await twitch.tokens.startLogin();
|
|
57
|
-
|
|
58
|
-
console.log('Open:', login.verificationUri);
|
|
59
|
-
console.log('Enter code:', login.userCode);
|
|
60
|
-
|
|
61
|
-
// Call completeLogin() after starting the login flow.
|
|
62
|
-
// The method polls until authorization succeeds or fails.
|
|
63
|
-
await twitch.tokens.completeLogin();
|
|
64
|
-
|
|
65
|
-
twitch.chat.onMessage(async (message) => {
|
|
66
|
-
console.log(`${message.chatterName}: ${message.text}`);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
await twitch.connectEventSub();
|
|
70
|
-
|
|
71
|
-
// After receiving the EventSub session welcome, subscribe using
|
|
72
|
-
// twitch.eventSub.currentSessionId and twitch.subscriptions.
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Design
|
|
76
|
-
|
|
77
|
-
- No dependency on NestJS or Express.
|
|
78
|
-
- OAuth tokens are persisted through a caller-provided token store.
|
|
79
|
-
- Helix requests automatically include the Client ID and access token.
|
|
80
|
-
- Chat messages are received through EventSub and sent through Helix.
|
|
81
|
-
- EventSub subscriptions use the active WebSocket session ID.
|
|
82
|
-
|
|
83
|
-
## Notes
|
|
84
|
-
|
|
85
|
-
The initial implementation assumes one authenticated Twitch account.
|
|
86
|
-
A separate bot account and multi-account token management are not included.
|
|
87
|
-
|
|
88
|
-
Treat token storage as sensitive. Do not commit access tokens or refresh
|
|
89
|
-
tokens to source control.
|
|
1
|
+
# streamops-twitch-connector
|
|
2
|
+
|
|
3
|
+
# StreamOps Twitch Connector
|
|
4
|
+
|
|
5
|
+
A framework-independent TypeScript connector for Twitch OAuth, Helix API
|
|
6
|
+
requests, chat messaging, and EventSub WebSocket notifications.
|
|
7
|
+
|
|
8
|
+
## Requirements
|
|
9
|
+
|
|
10
|
+
- Node.js 22 or newer
|
|
11
|
+
- A Twitch application with a registered Client ID
|
|
12
|
+
- A token store implementation supplied by the consuming application
|
|
13
|
+
|
|
14
|
+
## Install dependencies
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
npm install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Build
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
npm run build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Basic usage
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import {
|
|
30
|
+
TwitchClient,
|
|
31
|
+
type TwitchTokenStore,
|
|
32
|
+
type TwitchTokens,
|
|
33
|
+
} from 'streamops-twitch-connector';
|
|
34
|
+
|
|
35
|
+
const tokenStore: TwitchTokenStore = {
|
|
36
|
+
async load(): Promise<TwitchTokens | null> {
|
|
37
|
+
// Load tokens from your preferred secure storage.
|
|
38
|
+
return null;
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
async save(tokens: TwitchTokens): Promise<void> {
|
|
42
|
+
// Persist tokens securely.
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
async clear(): Promise<void> {
|
|
46
|
+
// Remove persisted tokens.
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const twitch = new TwitchClient({
|
|
51
|
+
clientId: process.env.TWITCH_CLIENT_ID!,
|
|
52
|
+
scopes: ['user:read:chat', 'user:write:chat'],
|
|
53
|
+
tokenStore,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const login = await twitch.tokens.startLogin();
|
|
57
|
+
|
|
58
|
+
console.log('Open:', login.verificationUri);
|
|
59
|
+
console.log('Enter code:', login.userCode);
|
|
60
|
+
|
|
61
|
+
// Call completeLogin() after starting the login flow.
|
|
62
|
+
// The method polls until authorization succeeds or fails.
|
|
63
|
+
await twitch.tokens.completeLogin();
|
|
64
|
+
|
|
65
|
+
twitch.chat.onMessage(async (message) => {
|
|
66
|
+
console.log(`${message.chatterName}: ${message.text}`);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await twitch.connectEventSub();
|
|
70
|
+
|
|
71
|
+
// After receiving the EventSub session welcome, subscribe using
|
|
72
|
+
// twitch.eventSub.currentSessionId and twitch.subscriptions.
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Design
|
|
76
|
+
|
|
77
|
+
- No dependency on NestJS or Express.
|
|
78
|
+
- OAuth tokens are persisted through a caller-provided token store.
|
|
79
|
+
- Helix requests automatically include the Client ID and access token.
|
|
80
|
+
- Chat messages are received through EventSub and sent through Helix.
|
|
81
|
+
- EventSub subscriptions use the active WebSocket session ID.
|
|
82
|
+
|
|
83
|
+
## Notes
|
|
84
|
+
|
|
85
|
+
The initial implementation assumes one authenticated Twitch account.
|
|
86
|
+
A separate bot account and multi-account token management are not included.
|
|
87
|
+
|
|
88
|
+
Treat token storage as sensitive. Do not commit access tokens or refresh
|
|
89
|
+
tokens to source control.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventsub-client.d.ts","sourceRoot":"","sources":["../../src/eventsub/eventsub-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EAEvB,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,sBAAsB,GAAG,CACnC,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,OAAO,KACzB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,qBAAa,cAAc;IAcvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbjC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,uBAAuB,CAAM;IACrC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,KAAK,CAA2C;IAExD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;gBAGlD,aAAa,CAAC,GAAE,CAC/B,KAAK,EAAE,uBAAuB,KAC3B,IAAI,aAAA;IAGX,IAAI,eAAe,IAAI,uBAAuB,CAE7C;IAED,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,cAAc,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,IAAI;IAKhE,SAAS,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAKhD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"eventsub-client.d.ts","sourceRoot":"","sources":["../../src/eventsub/eventsub-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EAEvB,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,sBAAsB,GAAG,CACnC,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,OAAO,KACzB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,qBAAa,cAAc;IAcvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbjC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,uBAAuB,CAAM;IACrC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,KAAK,CAA2C;IAExD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;gBAGlD,aAAa,CAAC,GAAE,CAC/B,KAAK,EAAE,uBAAuB,KAC3B,IAAI,aAAA;IAGX,IAAI,eAAe,IAAI,uBAAuB,CAE7C;IAED,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,cAAc,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,IAAI;IAKhE,SAAS,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAKhD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,OAAO,CAAC,UAAU;YAsEJ,aAAa;IAyF3B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,WAAW;CAIpB"}
|
|
@@ -58,22 +58,18 @@ export class EventSubClient {
|
|
|
58
58
|
socket = new WebSocket(url);
|
|
59
59
|
}
|
|
60
60
|
catch (error) {
|
|
61
|
-
|
|
61
|
+
// Logging suppressed.
|
|
62
62
|
this.scheduleReconnect();
|
|
63
63
|
throw new TwitchError('Unable to create Twitch EventSub WebSocket.', undefined, undefined, { cause: error });
|
|
64
64
|
}
|
|
65
65
|
const previousSocket = this.socket;
|
|
66
66
|
this.socket = socket;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
previousSocket.readyState !== WebSocket.CLOSED) {
|
|
70
|
-
console.log('[EventSub] Replacing the previous WebSocket connection.');
|
|
71
|
-
}
|
|
67
|
+
// Logging suppressed; retain original connection behavior.
|
|
68
|
+
void previousSocket;
|
|
72
69
|
socket.addEventListener('open', () => {
|
|
73
70
|
if (this.socket !== socket) {
|
|
74
71
|
return;
|
|
75
72
|
}
|
|
76
|
-
console.log('[EventSub] WebSocket connected.');
|
|
77
73
|
this.setState('connected');
|
|
78
74
|
});
|
|
79
75
|
socket.addEventListener('message', (message) => {
|
|
@@ -81,24 +77,15 @@ export class EventSubClient {
|
|
|
81
77
|
return;
|
|
82
78
|
}
|
|
83
79
|
const raw = String(message.data);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
console.warn('[EventSub] Received a non-JSON WebSocket message.');
|
|
90
|
-
}
|
|
91
|
-
void this.handleMessage(raw, isReconnectHandover).catch((error) => {
|
|
92
|
-
console.error('[EventSub] Failed to process message:', error);
|
|
80
|
+
// Parse and handle the message as before, without routine log output.
|
|
81
|
+
void this.handleMessage(raw, isReconnectHandover).catch((_error) => {
|
|
82
|
+
// EventSub processing errors suppressed.
|
|
93
83
|
});
|
|
94
84
|
});
|
|
95
85
|
socket.addEventListener('error', () => {
|
|
96
|
-
|
|
97
|
-
console.error('[EventSub] WebSocket error.');
|
|
98
|
-
}
|
|
86
|
+
// WebSocket error logging suppressed.
|
|
99
87
|
});
|
|
100
|
-
socket.addEventListener('close', (
|
|
101
|
-
console.log(`[EventSub] Socket closed: code=${event.code}, reason=${event.reason || '(none)'}`);
|
|
88
|
+
socket.addEventListener('close', (_event) => {
|
|
102
89
|
if (this.socket !== socket) {
|
|
103
90
|
return;
|
|
104
91
|
}
|
|
@@ -130,26 +117,22 @@ export class EventSubClient {
|
|
|
130
117
|
session.keepalive_timeout_seconds ?? 10;
|
|
131
118
|
this.reconnectUrl = null;
|
|
132
119
|
this.resetKeepaliveTimer();
|
|
133
|
-
console.log(`[EventSub] Session established. Keepalive timeout: ${this.keepaliveTimeoutSeconds}s.`);
|
|
134
120
|
for (const handler of this.sessionHandlers) {
|
|
135
121
|
await handler(session.id, isReconnectHandover);
|
|
136
122
|
}
|
|
137
123
|
break;
|
|
138
124
|
}
|
|
139
125
|
case 'session_keepalive':
|
|
140
|
-
console.log('[EventSub] Keepalive received.');
|
|
141
126
|
this.resetKeepaliveTimer();
|
|
142
127
|
break;
|
|
143
128
|
case 'session_reconnect': {
|
|
144
129
|
const reconnectUrl = envelope.payload.session?.reconnect_url;
|
|
145
130
|
if (!reconnectUrl) {
|
|
146
|
-
console.warn('[EventSub] Reconnect message did not contain a reconnect URL.');
|
|
147
131
|
return;
|
|
148
132
|
}
|
|
149
|
-
console.log('[EventSub] Twitch requested a session handover.');
|
|
150
133
|
this.reconnectUrl = reconnectUrl;
|
|
151
134
|
this.clearKeepaliveTimer();
|
|
152
|
-
//
|
|
135
|
+
// Preserve original session handover behavior.
|
|
153
136
|
this.openSocket(reconnectUrl, true);
|
|
154
137
|
break;
|
|
155
138
|
}
|
|
@@ -166,22 +149,20 @@ export class EventSubClient {
|
|
|
166
149
|
break;
|
|
167
150
|
}
|
|
168
151
|
case 'session_reconnect_failed':
|
|
169
|
-
console.warn('[EventSub] Twitch reported that session handover failed.');
|
|
170
152
|
this.reconnectUrl = null;
|
|
171
153
|
this.scheduleReconnect();
|
|
172
154
|
break;
|
|
173
155
|
case 'revocation':
|
|
174
|
-
|
|
156
|
+
// Revocation logging suppressed.
|
|
175
157
|
break;
|
|
176
158
|
default:
|
|
177
|
-
|
|
159
|
+
// Unknown message logging suppressed.
|
|
178
160
|
break;
|
|
179
161
|
}
|
|
180
162
|
}
|
|
181
163
|
resetKeepaliveTimer() {
|
|
182
164
|
this.clearKeepaliveTimer();
|
|
183
165
|
this.keepaliveTimer = setTimeout(() => {
|
|
184
|
-
console.warn(`[EventSub] No keepalive or notification received within ${this.keepaliveTimeoutSeconds}s.`);
|
|
185
166
|
const socket = this.socket;
|
|
186
167
|
this.socket = null;
|
|
187
168
|
if (socket && socket.readyState !== WebSocket.CLOSED) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventsub-client.js","sourceRoot":"","sources":["../../src/eventsub/eventsub-client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAOvD,MAAM,OAAO,cAAc;IAcN;IAbX,MAAM,GAAqB,IAAI,CAAC;IAChC,YAAY,GAAkB,IAAI,CAAC;IACnC,SAAS,GAAkB,IAAI,CAAC;IAChC,uBAAuB,GAAG,EAAE,CAAC;IAC7B,cAAc,GAAyC,IAAI,CAAC;IAC5D,cAAc,GAAyC,IAAI,CAAC;IAC5D,gBAAgB,GAAG,KAAK,CAAC;IACzB,KAAK,GAA4B,cAAc,CAAC;IAEvC,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAClD,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IAErE,YACmB,aAER;QAFQ,kBAAa,GAAb,aAAa,CAErB;IACR,CAAC;IAEJ,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,OAAoC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,OAA+B;QACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IACE,IAAI,CAAC,MAAM;YACX,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;gBAC9C,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC,EAC5C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAEO,UAAU,CAChB,GAAW,EACX,mBAAmB,GAAG,KAAK;QAE3B,IAAI,MAAiB,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,
|
|
1
|
+
{"version":3,"file":"eventsub-client.js","sourceRoot":"","sources":["../../src/eventsub/eventsub-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "streamops-twitch-connector",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Framework-independent Twitch OAuth, EventSub, and chat connector",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"test": "vitest run",
|
|
21
|
-
"test:watch": "vitest"
|
|
22
|
-
},
|
|
23
|
-
"engines": {
|
|
24
|
-
"node": ">=22"
|
|
25
|
-
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"@types/node": "^24.0.0",
|
|
28
|
-
"typescript": "^6.0.2",
|
|
29
|
-
"vitest": "^4.1.2"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "streamops-twitch-connector",
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"description": "Framework-independent Twitch OAuth, EventSub, and chat connector",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest"
|
|
22
|
+
},
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^24.0.0",
|
|
28
|
+
"typescript": "^6.0.2",
|
|
29
|
+
"vitest": "^4.1.2"
|
|
30
|
+
}
|
|
31
|
+
}
|