discord-digital-twin 0.0.1

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 (131) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +138 -0
  4. package/dist/db.d.ts +4 -0
  5. package/dist/db.d.ts.map +1 -0
  6. package/dist/db.js +18 -0
  7. package/dist/db.js.map +1 -0
  8. package/dist/gateway.d.ts +46 -0
  9. package/dist/gateway.d.ts.map +1 -0
  10. package/dist/gateway.js +163 -0
  11. package/dist/gateway.js.map +1 -0
  12. package/dist/generated/browser.d.ts +55 -0
  13. package/dist/generated/browser.d.ts.map +1 -0
  14. package/dist/generated/browser.js +18 -0
  15. package/dist/generated/browser.js.map +1 -0
  16. package/dist/generated/client.d.ts +72 -0
  17. package/dist/generated/client.d.ts.map +1 -0
  18. package/dist/generated/client.js +36 -0
  19. package/dist/generated/client.js.map +1 -0
  20. package/dist/generated/commonInputTypes.d.ts +306 -0
  21. package/dist/generated/commonInputTypes.d.ts.map +1 -0
  22. package/dist/generated/commonInputTypes.js +11 -0
  23. package/dist/generated/commonInputTypes.js.map +1 -0
  24. package/dist/generated/enums.d.ts +2 -0
  25. package/dist/generated/enums.d.ts.map +1 -0
  26. package/dist/generated/enums.js +12 -0
  27. package/dist/generated/enums.js.map +1 -0
  28. package/dist/generated/internal/class.d.ts +226 -0
  29. package/dist/generated/internal/class.d.ts.map +1 -0
  30. package/dist/generated/internal/class.js +42 -0
  31. package/dist/generated/internal/class.js.map +1 -0
  32. package/dist/generated/internal/prismaNamespace.d.ts +1323 -0
  33. package/dist/generated/internal/prismaNamespace.d.ts.map +1 -0
  34. package/dist/generated/internal/prismaNamespace.js +216 -0
  35. package/dist/generated/internal/prismaNamespace.js.map +1 -0
  36. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +184 -0
  37. package/dist/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  38. package/dist/generated/internal/prismaNamespaceBrowser.js +186 -0
  39. package/dist/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  40. package/dist/generated/models/ApplicationCommand.d.ts +1204 -0
  41. package/dist/generated/models/ApplicationCommand.d.ts.map +1 -0
  42. package/dist/generated/models/ApplicationCommand.js +2 -0
  43. package/dist/generated/models/ApplicationCommand.js.map +1 -0
  44. package/dist/generated/models/Channel.d.ts +2061 -0
  45. package/dist/generated/models/Channel.d.ts.map +1 -0
  46. package/dist/generated/models/Channel.js +2 -0
  47. package/dist/generated/models/Channel.js.map +1 -0
  48. package/dist/generated/models/Guild.d.ts +1463 -0
  49. package/dist/generated/models/Guild.d.ts.map +1 -0
  50. package/dist/generated/models/Guild.js +2 -0
  51. package/dist/generated/models/Guild.js.map +1 -0
  52. package/dist/generated/models/GuildMember.d.ts +1401 -0
  53. package/dist/generated/models/GuildMember.d.ts.map +1 -0
  54. package/dist/generated/models/GuildMember.js +2 -0
  55. package/dist/generated/models/GuildMember.js.map +1 -0
  56. package/dist/generated/models/InteractionResponse.d.ts +1142 -0
  57. package/dist/generated/models/InteractionResponse.d.ts.map +1 -0
  58. package/dist/generated/models/InteractionResponse.js +2 -0
  59. package/dist/generated/models/InteractionResponse.js.map +1 -0
  60. package/dist/generated/models/Message.d.ts +1958 -0
  61. package/dist/generated/models/Message.d.ts.map +1 -0
  62. package/dist/generated/models/Message.js +2 -0
  63. package/dist/generated/models/Message.js.map +1 -0
  64. package/dist/generated/models/Reaction.d.ts +1173 -0
  65. package/dist/generated/models/Reaction.d.ts.map +1 -0
  66. package/dist/generated/models/Reaction.js +2 -0
  67. package/dist/generated/models/Reaction.js.map +1 -0
  68. package/dist/generated/models/Role.d.ts +1394 -0
  69. package/dist/generated/models/Role.d.ts.map +1 -0
  70. package/dist/generated/models/Role.js +2 -0
  71. package/dist/generated/models/Role.js.map +1 -0
  72. package/dist/generated/models/ThreadMember.d.ts +1104 -0
  73. package/dist/generated/models/ThreadMember.d.ts.map +1 -0
  74. package/dist/generated/models/ThreadMember.js +2 -0
  75. package/dist/generated/models/ThreadMember.js.map +1 -0
  76. package/dist/generated/models/User.d.ts +1288 -0
  77. package/dist/generated/models/User.d.ts.map +1 -0
  78. package/dist/generated/models/User.js +2 -0
  79. package/dist/generated/models/User.js.map +1 -0
  80. package/dist/generated/models.d.ts +12 -0
  81. package/dist/generated/models.d.ts.map +1 -0
  82. package/dist/generated/models.js +2 -0
  83. package/dist/generated/models.js.map +1 -0
  84. package/dist/index.d.ts +231 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +589 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/serializers.d.ts +16 -0
  89. package/dist/serializers.d.ts.map +1 -0
  90. package/dist/serializers.js +175 -0
  91. package/dist/serializers.js.map +1 -0
  92. package/dist/server.d.ts +22 -0
  93. package/dist/server.d.ts.map +1 -0
  94. package/dist/server.js +1530 -0
  95. package/dist/server.js.map +1 -0
  96. package/dist/snowflake.d.ts +2 -0
  97. package/dist/snowflake.d.ts.map +1 -0
  98. package/dist/snowflake.js +13 -0
  99. package/dist/snowflake.js.map +1 -0
  100. package/package.json +36 -0
  101. package/schema.prisma +159 -0
  102. package/src/db.ts +20 -0
  103. package/src/gateway.ts +249 -0
  104. package/src/generated/browser.ts +69 -0
  105. package/src/generated/client.ts +91 -0
  106. package/src/generated/commonInputTypes.ts +348 -0
  107. package/src/generated/enums.ts +15 -0
  108. package/src/generated/internal/class.ts +282 -0
  109. package/src/generated/internal/prismaNamespace.ts +1574 -0
  110. package/src/generated/internal/prismaNamespaceBrowser.ts +252 -0
  111. package/src/generated/models/ApplicationCommand.ts +1361 -0
  112. package/src/generated/models/Channel.ts +2266 -0
  113. package/src/generated/models/Guild.ts +1655 -0
  114. package/src/generated/models/GuildMember.ts +1585 -0
  115. package/src/generated/models/InteractionResponse.ts +1298 -0
  116. package/src/generated/models/Message.ts +2148 -0
  117. package/src/generated/models/Reaction.ts +1348 -0
  118. package/src/generated/models/Role.ts +1568 -0
  119. package/src/generated/models/ThreadMember.ts +1273 -0
  120. package/src/generated/models/User.ts +1460 -0
  121. package/src/generated/models.ts +21 -0
  122. package/src/index.ts +934 -0
  123. package/src/serializers.ts +221 -0
  124. package/src/server.ts +1821 -0
  125. package/src/snowflake.ts +14 -0
  126. package/tests/guilds.test.ts +188 -0
  127. package/tests/interactions.test.ts +462 -0
  128. package/tests/messages.test.ts +166 -0
  129. package/tests/sdk-compat.test.ts +88 -0
  130. package/tests/threads.test.ts +181 -0
  131. package/tsconfig.json +27 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
6
+
7
+ - Local Discord API twin (REST + Gateway WebSocket) for testing discord.js bots
8
+ - In-memory state with Prisma + libsql
9
+ - Full message lifecycle: create, edit, delete, reactions
10
+ - Thread management: create, archive, unarchive, thread members
11
+ - Interaction flows: slash commands, buttons, select menus, modals
12
+ - Guild management: channels, roles, members, active threads
13
+ - Playwright-style actor API: `discord.user(id).sendMessage(...)`, `.runSlashCommand(...)`, etc.
14
+ - Wait helpers: `waitForThread`, `waitForMessage`, `waitForBotReply`, `waitForInteractionAck`
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kimaki
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Discord Digital Twin
2
+
3
+ > **Experimental and unstable.** APIs may change without notice between versions.
4
+
5
+ `discord-digital-twin` is a local Discord API twin for tests.
6
+ It runs:
7
+
8
+ - Discord-like REST routes on `/api/v10/*`
9
+ - Discord-like Gateway WebSocket on `/gateway`
10
+ - In-memory state with Prisma + libsql
11
+
12
+ The goal is testing real `discord.js` flows without calling Discord servers.
13
+
14
+ ## Use Cases
15
+
16
+ - Integration test slash command flows end-to-end
17
+ - Verify message/thread/reaction behavior with real `discord.js` clients
18
+ - Reproduce interaction bugs locally with deterministic state
19
+ - Run fast CI tests without Discord network dependency
20
+
21
+ ## How It Works
22
+
23
+ ```text
24
+ ┌─────────────┐
25
+ │ vitest test │
26
+ └──────┬──────┘
27
+ │ 1) login() with rest.api override
28
+
29
+ ┌────────┬────────────┐ ┌───────────────────────────┐
30
+ │ discord.js Client │─ HTTP ───▶│ DigitalDiscord REST │
31
+ │ │ │ (/api/v10/*) │
32
+ └────────┬────────────┘ └─────────┬─────────────────┘
33
+ │ 2) Gateway events │ 3) route handlers
34
+ ▼ ▼
35
+ ┌────────┬─────────┐ ┌────────────┬─────────────────┐
36
+ │ Gateway WS │◀──────────│ Prisma + libsql (memory) │
37
+ └──────────────────┘ └──────────────────────────────┘
38
+ ```
39
+
40
+ ## Quick Start
41
+
42
+ ```ts
43
+ import { ChannelType } from 'discord-api-types/v10'
44
+ import { DigitalDiscord } from 'discord-digital-twin'
45
+
46
+ const discord = new DigitalDiscord({
47
+ guild: { name: 'Test Server' },
48
+ channels: [
49
+ {
50
+ name: 'general',
51
+ type: ChannelType.GuildText,
52
+ },
53
+ ],
54
+ users: [{ username: 'TestUser' }],
55
+ })
56
+
57
+ await discord.start()
58
+ // use discord.restUrl in discord.js Client rest.api
59
+ // use discord.botToken in client.login()
60
+ await discord.stop()
61
+ ```
62
+
63
+ ## Example Vitest Interaction Test
64
+
65
+ This example shows a full interaction flow:
66
+
67
+ 1. simulate a slash command from a user actor
68
+ 2. handle `interactionCreate` in `discord.js`
69
+ 3. send `interaction.reply()`
70
+ 4. assert ack + bot message persisted
71
+
72
+ ```ts
73
+ import { describe, test, expect, beforeAll, afterAll } from 'vitest'
74
+ import { Client, GatewayIntentBits, ChannelType } from 'discord.js'
75
+ import { DigitalDiscord } from 'discord-digital-twin'
76
+
77
+ describe('slash command interaction', () => {
78
+ let discord: DigitalDiscord
79
+ let client: Client
80
+ let channelId: string
81
+ let userId: string
82
+
83
+ beforeAll(async () => {
84
+ discord = new DigitalDiscord({
85
+ channels: [{ name: 'general', type: ChannelType.GuildText }],
86
+ users: [{ username: 'TestUser' }],
87
+ })
88
+ await discord.start()
89
+
90
+ const channels = await discord.prisma.channel.findMany()
91
+ channelId = channels[0]!.id
92
+ userId = (await discord.getFirstNonBotUserId())!
93
+
94
+ client = new Client({
95
+ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
96
+ rest: { api: discord.restUrl, version: '10' },
97
+ })
98
+ await client.login(discord.botToken)
99
+ })
100
+
101
+ afterAll(async () => {
102
+ client.destroy()
103
+ await discord.stop()
104
+ })
105
+
106
+ test('acknowledges and replies to slash command', async () => {
107
+ const commandName = 'status'
108
+
109
+ const handled = new Promise<void>((resolve) => {
110
+ client.once('interactionCreate', async (interaction) => {
111
+ if (!interaction.isChatInputCommand()) {
112
+ return
113
+ }
114
+ if (interaction.commandName !== commandName) {
115
+ return
116
+ }
117
+ await interaction.reply({ content: 'ok' })
118
+ resolve()
119
+ })
120
+ })
121
+
122
+ const interaction = await discord.user(userId).runSlashCommand({
123
+ channelId,
124
+ name: commandName,
125
+ })
126
+
127
+ const ack = await discord.waitForInteractionAck({
128
+ interactionId: interaction.id,
129
+ })
130
+ await handled
131
+
132
+ expect(ack.acknowledged).toBe(true)
133
+
134
+ const reply = await discord.waitForBotReply({ channelId })
135
+ expect(reply.content).toBe('ok')
136
+ })
137
+ })
138
+ ```
package/dist/db.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { PrismaClient } from './generated/client.js';
2
+ export { PrismaClient };
3
+ export declare function createPrismaClient(dbUrl?: string): PrismaClient;
4
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAS/D"}
package/dist/db.js ADDED
@@ -0,0 +1,18 @@
1
+ // Prisma client initialization with in-memory libsql.
2
+ // Vitest runs each test file in a separate worker thread, so all
3
+ // instances within the same file share file::memory:?cache=shared
4
+ // and cross-file isolation comes from separate processes/threads.
5
+ import { PrismaLibSql } from '@prisma/adapter-libsql';
6
+ import { PrismaClient } from './generated/client.js';
7
+ export { PrismaClient };
8
+ export function createPrismaClient(dbUrl) {
9
+ // cache=shared is required because libsql's transaction() creates a
10
+ // new Database() internally. Without shared cache, the new connection
11
+ // gets a separate empty in-memory DB, silently breaking upsert/$transaction.
12
+ // The old `mode=memory` URL param is not supported by @prisma/adapter-libsql.
13
+ // Pass a file: URL (e.g. "file:./test.db") for persistent/debuggable storage.
14
+ const url = dbUrl ?? 'file::memory:?cache=shared';
15
+ const adapter = new PrismaLibSql({ url });
16
+ return new PrismaClient({ adapter });
17
+ }
18
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,iEAAiE;AACjE,kEAAkE;AAClE,kEAAkE;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,oEAAoE;IACpE,sEAAsE;IACtE,6EAA6E;IAC7E,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,GAAG,GAAG,KAAK,IAAI,4BAA4B,CAAA;IACjD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IACzC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type http from 'node:http';
2
+ import { WebSocketServer, WebSocket } from 'ws';
3
+ import type { APIUser, APIGuild, APIGuildMember, APIChannel, APIMessage } from 'discord-api-types/v10';
4
+ interface ConnectedClient {
5
+ ws: WebSocket;
6
+ sessionId: string;
7
+ sequence: number;
8
+ identified: boolean;
9
+ intents: number;
10
+ }
11
+ export interface GatewayGuildState {
12
+ id: string;
13
+ apiGuild: APIGuild;
14
+ joinedAt: string;
15
+ members: APIGuildMember[];
16
+ channels: APIChannel[];
17
+ }
18
+ export interface GatewayState {
19
+ botUser: APIUser;
20
+ guilds: GatewayGuildState[];
21
+ }
22
+ export declare class DiscordGateway {
23
+ wss: WebSocketServer;
24
+ clients: ConnectedClient[];
25
+ private loadState;
26
+ private port;
27
+ private expectedToken;
28
+ constructor({ httpServer, port, loadState, expectedToken, }: {
29
+ httpServer: http.Server;
30
+ port: number;
31
+ loadState: () => Promise<GatewayState>;
32
+ expectedToken: string;
33
+ });
34
+ broadcast<T>(event: string, data: T): void;
35
+ broadcastMessageCreate(message: APIMessage, guildId: string): void;
36
+ close(): void;
37
+ private send;
38
+ private sendHello;
39
+ private sendHeartbeatAck;
40
+ private sendDispatch;
41
+ private handleConnection;
42
+ private handleMessage;
43
+ private sendReadySequence;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAM/C,OAAO,KAAK,EAOV,OAAO,EACP,QAAQ,EACR,cAAc,EACd,UAAU,EACV,UAAU,EAKX,MAAM,uBAAuB,CAAA;AAE9B,UAAU,eAAe;IACvB,EAAE,EAAE,SAAS,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B;AAED,qBAAa,cAAc;IACzB,GAAG,EAAE,eAAe,CAAA;IACpB,OAAO,EAAE,eAAe,EAAE,CAAK;IAC/B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,aAAa,CAAQ;gBAEjB,EACV,UAAU,EACV,IAAI,EACJ,SAAS,EACT,aAAa,GACd,EAAE;QACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;QACvB,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;QACtC,aAAa,EAAE,MAAM,CAAA;KACtB;IAUD,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAQ1C,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASlE,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;YAuBV,aAAa;YA6Bb,iBAAiB;CAuDhC"}
@@ -0,0 +1,163 @@
1
+ // Discord Gateway WebSocket server.
2
+ // Implements the minimum Gateway protocol needed for discord.js to connect:
3
+ // Hello -> Identify -> Ready -> GUILD_CREATE, plus heartbeat keep-alive.
4
+ // REST routes call gateway.broadcast() to push events to connected clients.
5
+ import crypto from 'node:crypto';
6
+ import { WebSocketServer, WebSocket } from 'ws';
7
+ import { GatewayOpcodes, GatewayDispatchEvents, ApplicationFlags, } from 'discord-api-types/v10';
8
+ export class DiscordGateway {
9
+ wss;
10
+ clients = [];
11
+ loadState;
12
+ port;
13
+ expectedToken;
14
+ constructor({ httpServer, port, loadState, expectedToken, }) {
15
+ this.port = port;
16
+ this.loadState = loadState;
17
+ this.expectedToken = expectedToken;
18
+ this.wss = new WebSocketServer({ server: httpServer, path: '/gateway' });
19
+ this.wss.on('connection', (ws) => {
20
+ this.handleConnection(ws);
21
+ });
22
+ }
23
+ broadcast(event, data) {
24
+ for (const client of this.clients) {
25
+ if (client.identified) {
26
+ this.sendDispatch(client, event, data);
27
+ }
28
+ }
29
+ }
30
+ broadcastMessageCreate(message, guildId) {
31
+ const data = {
32
+ ...message,
33
+ guild_id: guildId,
34
+ mentions: [],
35
+ };
36
+ this.broadcast(GatewayDispatchEvents.MessageCreate, data);
37
+ }
38
+ close() {
39
+ for (const client of this.clients) {
40
+ client.ws.close();
41
+ }
42
+ this.clients = [];
43
+ this.wss.close();
44
+ }
45
+ send(client, payload) {
46
+ if (client.ws.readyState === WebSocket.OPEN) {
47
+ client.ws.send(JSON.stringify(payload));
48
+ }
49
+ }
50
+ sendHello(client) {
51
+ this.send(client, {
52
+ op: GatewayOpcodes.Hello,
53
+ d: { heartbeat_interval: 45000 },
54
+ s: null,
55
+ t: null,
56
+ });
57
+ }
58
+ sendHeartbeatAck(client) {
59
+ this.send(client, {
60
+ op: GatewayOpcodes.HeartbeatAck,
61
+ s: null,
62
+ t: null,
63
+ });
64
+ }
65
+ sendDispatch(client, event, data) {
66
+ client.sequence++;
67
+ this.send(client, {
68
+ op: GatewayOpcodes.Dispatch,
69
+ t: event,
70
+ s: client.sequence,
71
+ d: data,
72
+ });
73
+ }
74
+ handleConnection(ws) {
75
+ const client = {
76
+ ws,
77
+ sessionId: crypto.randomUUID(),
78
+ sequence: 0,
79
+ identified: false,
80
+ intents: 0,
81
+ };
82
+ this.clients.push(client);
83
+ this.sendHello(client);
84
+ ws.on('message', (raw) => {
85
+ void this.handleMessage(client, raw.toString());
86
+ });
87
+ ws.on('close', () => {
88
+ const idx = this.clients.indexOf(client);
89
+ if (idx !== -1) {
90
+ this.clients.splice(idx, 1);
91
+ }
92
+ });
93
+ }
94
+ async handleMessage(client, raw) {
95
+ // JSON.parse returns unknown -- `as` is the only option for untyped JSON
96
+ const payload = JSON.parse(raw);
97
+ switch (payload.op) {
98
+ case GatewayOpcodes.Heartbeat: {
99
+ this.sendHeartbeatAck(client);
100
+ break;
101
+ }
102
+ case GatewayOpcodes.Identify: {
103
+ // Switch on `op` narrows GatewaySendPayload to GatewayIdentify,
104
+ // so payload.d is already GatewayIdentifyData -- no cast needed
105
+ const { token, intents } = payload.d;
106
+ const cleanToken = token.replace(/^Bot\s+/i, '');
107
+ if (cleanToken !== this.expectedToken) {
108
+ client.ws.close(4004, 'Authentication failed');
109
+ return;
110
+ }
111
+ client.identified = true;
112
+ client.intents = intents;
113
+ await this.sendReadySequence(client);
114
+ break;
115
+ }
116
+ }
117
+ }
118
+ async sendReadySequence(client) {
119
+ const state = await this.loadState();
120
+ const readyData = {
121
+ v: 10,
122
+ user: state.botUser,
123
+ guilds: state.guilds.map((g) => ({
124
+ id: g.id,
125
+ unavailable: true,
126
+ })),
127
+ session_id: client.sessionId,
128
+ resume_gateway_url: `ws://localhost:${this.port}/gateway`,
129
+ application: {
130
+ id: state.botUser.id,
131
+ flags: ApplicationFlags.GatewayPresence |
132
+ ApplicationFlags.GatewayGuildMembers |
133
+ ApplicationFlags.GatewayMessageContent,
134
+ },
135
+ };
136
+ this.sendDispatch(client, GatewayDispatchEvents.Ready, readyData);
137
+ // Typed empty arrays so TS doesn't infer never[]
138
+ const emptyVoiceStates = [];
139
+ const emptyPresences = [];
140
+ const emptyStageInstances = [];
141
+ const emptyScheduledEvents = [];
142
+ const emptySoundboardSounds = [];
143
+ for (const guild of state.guilds) {
144
+ const guildData = {
145
+ ...guild.apiGuild,
146
+ joined_at: guild.joinedAt,
147
+ large: false,
148
+ unavailable: false,
149
+ member_count: guild.members.length,
150
+ voice_states: emptyVoiceStates,
151
+ members: guild.members,
152
+ channels: guild.channels,
153
+ threads: [],
154
+ presences: emptyPresences,
155
+ stage_instances: emptyStageInstances,
156
+ guild_scheduled_events: emptyScheduledEvents,
157
+ soundboard_sounds: emptySoundboardSounds,
158
+ };
159
+ this.sendDispatch(client, GatewayDispatchEvents.GuildCreate, guildData);
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import * as Prisma from './internal/prismaNamespaceBrowser.js';
2
+ export { Prisma };
3
+ export * as $Enums from './enums.js';
4
+ export * from './enums.js';
5
+ /**
6
+ * Model Guild
7
+ *
8
+ */
9
+ export type Guild = Prisma.GuildModel;
10
+ /**
11
+ * Model Channel
12
+ *
13
+ */
14
+ export type Channel = Prisma.ChannelModel;
15
+ /**
16
+ * Model Message
17
+ *
18
+ */
19
+ export type Message = Prisma.MessageModel;
20
+ /**
21
+ * Model User
22
+ *
23
+ */
24
+ export type User = Prisma.UserModel;
25
+ /**
26
+ * Model GuildMember
27
+ *
28
+ */
29
+ export type GuildMember = Prisma.GuildMemberModel;
30
+ /**
31
+ * Model Role
32
+ *
33
+ */
34
+ export type Role = Prisma.RoleModel;
35
+ /**
36
+ * Model Reaction
37
+ *
38
+ */
39
+ export type Reaction = Prisma.ReactionModel;
40
+ /**
41
+ * Model ThreadMember
42
+ *
43
+ */
44
+ export type ThreadMember = Prisma.ThreadMemberModel;
45
+ /**
46
+ * Model ApplicationCommand
47
+ *
48
+ */
49
+ export type ApplicationCommand = Prisma.ApplicationCommandModel;
50
+ /**
51
+ * Model InteractionResponse
52
+ *
53
+ */
54
+ export type InteractionResponse = Prisma.InteractionResponseModel;
55
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/generated/browser.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAC;AAC3B;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAA;AACrC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAA;AACjD;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAA;AAC3C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;AACnD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAA;AAC/D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAA"}
@@ -0,0 +1,18 @@
1
+ /* !!! This is code generated by Prisma. Do not edit directly. !!! */
2
+ /* eslint-disable */
3
+ // biome-ignore-all lint: generated file
4
+ // @ts-nocheck
5
+ /*
6
+ * This file should be your main import to use Prisma-related types and utilities in a browser.
7
+ * Use it to get access to models, enums, and input types.
8
+ *
9
+ * This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
10
+ * See `client.ts` for the standard, server-side entry point.
11
+ *
12
+ * 🟢 You can import this file directly.
13
+ */
14
+ import * as Prisma from './internal/prismaNamespaceBrowser.js';
15
+ export { Prisma };
16
+ export * as $Enums from './enums.js';
17
+ export * from './enums.js';
18
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/generated/browser.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,oBAAoB;AACpB,wCAAwC;AACxC,eAAe;AACf;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,72 @@
1
+ import * as runtime from "@prisma/client/runtime/client";
2
+ import * as $Class from "./internal/class.js";
3
+ import * as Prisma from "./internal/prismaNamespace.js";
4
+ export * as $Enums from './enums.js';
5
+ export * from "./enums.js";
6
+ /**
7
+ * ## Prisma Client
8
+ *
9
+ * Type-safe database client for TypeScript
10
+ * @example
11
+ * ```
12
+ * const prisma = new PrismaClient()
13
+ * // Fetch zero or more Guilds
14
+ * const guilds = await prisma.guild.findMany()
15
+ * ```
16
+ *
17
+ * Read more in our [docs](https://pris.ly/d/client).
18
+ */
19
+ export declare const PrismaClient: $Class.PrismaClientConstructor;
20
+ export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>;
21
+ export { Prisma };
22
+ /**
23
+ * Model Guild
24
+ *
25
+ */
26
+ export type Guild = Prisma.GuildModel;
27
+ /**
28
+ * Model Channel
29
+ *
30
+ */
31
+ export type Channel = Prisma.ChannelModel;
32
+ /**
33
+ * Model Message
34
+ *
35
+ */
36
+ export type Message = Prisma.MessageModel;
37
+ /**
38
+ * Model User
39
+ *
40
+ */
41
+ export type User = Prisma.UserModel;
42
+ /**
43
+ * Model GuildMember
44
+ *
45
+ */
46
+ export type GuildMember = Prisma.GuildMemberModel;
47
+ /**
48
+ * Model Role
49
+ *
50
+ */
51
+ export type Role = Prisma.RoleModel;
52
+ /**
53
+ * Model Reaction
54
+ *
55
+ */
56
+ export type Reaction = Prisma.ReactionModel;
57
+ /**
58
+ * Model ThreadMember
59
+ *
60
+ */
61
+ export type ThreadMember = Prisma.ThreadMemberModel;
62
+ /**
63
+ * Model ApplicationCommand
64
+ *
65
+ */
66
+ export type ApplicationCommand = Prisma.ApplicationCommandModel;
67
+ /**
68
+ * Model InteractionResponse
69
+ *
70
+ */
71
+ export type InteractionResponse = Prisma.InteractionResponseModel;
72
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/generated/client.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAA;AAExD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,gCAAgC,CAAA;AACzD,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,SAAS,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;AAC3S,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAA;AACrC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAA;AACjD;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAA;AAC3C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;AACnD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAA;AAC/D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAA"}
@@ -0,0 +1,36 @@
1
+ /* !!! This is code generated by Prisma. Do not edit directly. !!! */
2
+ /* eslint-disable */
3
+ // biome-ignore-all lint: generated file
4
+ // @ts-nocheck
5
+ /*
6
+ * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
7
+ * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
8
+ *
9
+ * 🟢 You can import this file directly.
10
+ */
11
+ import * as process from 'node:process';
12
+ import * as path from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ globalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url));
15
+ import * as runtime from "@prisma/client/runtime/client";
16
+ import * as $Enums from "./enums.js";
17
+ import * as $Class from "./internal/class.js";
18
+ import * as Prisma from "./internal/prismaNamespace.js";
19
+ export * as $Enums from './enums.js';
20
+ export * from "./enums.js";
21
+ /**
22
+ * ## Prisma Client
23
+ *
24
+ * Type-safe database client for TypeScript
25
+ * @example
26
+ * ```
27
+ * const prisma = new PrismaClient()
28
+ * // Fetch zero or more Guilds
29
+ * const guilds = await prisma.guild.findMany()
30
+ * ```
31
+ *
32
+ * Read more in our [docs](https://pris.ly/d/client).
33
+ */
34
+ export const PrismaClient = $Class.getPrismaClientClass();
35
+ export { Prisma };
36
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/generated/client.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,oBAAoB;AACpB,wCAAwC;AACxC,eAAe;AACf;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEtE,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAA;AACxD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,CAAA"}