flarecord 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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/core/bot-base.d.ts +26 -0
  4. package/dist/core/bot-base.d.ts.map +1 -0
  5. package/dist/core/bot-base.js +60 -0
  6. package/dist/core/bot-base.js.map +1 -0
  7. package/dist/core/client.d.ts +26 -0
  8. package/dist/core/client.d.ts.map +1 -0
  9. package/dist/core/client.js +60 -0
  10. package/dist/core/client.js.map +1 -0
  11. package/dist/core/connection.d.ts +52 -0
  12. package/dist/core/connection.d.ts.map +1 -0
  13. package/dist/core/connection.js +156 -0
  14. package/dist/core/connection.js.map +1 -0
  15. package/dist/core/gateway.d.ts +15 -0
  16. package/dist/core/gateway.d.ts.map +1 -0
  17. package/dist/core/gateway.js +50 -0
  18. package/dist/core/gateway.js.map +1 -0
  19. package/dist/core/handlers.d.ts +25 -0
  20. package/dist/core/handlers.d.ts.map +1 -0
  21. package/dist/core/handlers.js +120 -0
  22. package/dist/core/handlers.js.map +1 -0
  23. package/dist/core/heartbeat.d.ts +19 -0
  24. package/dist/core/heartbeat.d.ts.map +1 -0
  25. package/dist/core/heartbeat.js +55 -0
  26. package/dist/core/heartbeat.js.map +1 -0
  27. package/dist/core/message-handler.d.ts +23 -0
  28. package/dist/core/message-handler.d.ts.map +1 -0
  29. package/dist/core/message-handler.js +92 -0
  30. package/dist/core/message-handler.js.map +1 -0
  31. package/dist/index.d.ts +14 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/types/constants.d.ts +90 -0
  36. package/dist/types/constants.d.ts.map +1 -0
  37. package/dist/types/constants.js +99 -0
  38. package/dist/types/constants.js.map +1 -0
  39. package/dist/types/index.d.ts +54 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/types/index.js +6 -0
  42. package/dist/types/index.js.map +1 -0
  43. package/dist/utils/logger.d.ts +23 -0
  44. package/dist/utils/logger.d.ts.map +1 -0
  45. package/dist/utils/logger.js +44 -0
  46. package/dist/utils/logger.js.map +1 -0
  47. package/dist/utils/message-helper.d.ts +11 -0
  48. package/dist/utils/message-helper.d.ts.map +1 -0
  49. package/dist/utils/message-helper.js +61 -0
  50. package/dist/utils/message-helper.js.map +1 -0
  51. package/dist/utils/reconnect.d.ts +19 -0
  52. package/dist/utils/reconnect.d.ts.map +1 -0
  53. package/dist/utils/reconnect.js +69 -0
  54. package/dist/utils/reconnect.js.map +1 -0
  55. package/dist/utils/session.d.ts +23 -0
  56. package/dist/utils/session.d.ts.map +1 -0
  57. package/dist/utils/session.js +58 -0
  58. package/dist/utils/session.js.map +1 -0
  59. package/dist/utils/websocket.d.ts +12 -0
  60. package/dist/utils/websocket.d.ts.map +1 -0
  61. package/dist/utils/websocket.js +64 -0
  62. package/dist/utils/websocket.js.map +1 -0
  63. package/package.json +48 -0
  64. package/src/core/bot-base.ts +90 -0
  65. package/src/core/client.ts +90 -0
  66. package/src/core/connection.ts +238 -0
  67. package/src/core/gateway.ts +78 -0
  68. package/src/core/handlers.ts +136 -0
  69. package/src/core/heartbeat.ts +65 -0
  70. package/src/core/message-handler.ts +96 -0
  71. package/src/index.ts +96 -0
  72. package/src/types/constants.ts +103 -0
  73. package/src/types/index.ts +65 -0
  74. package/src/utils/logger.ts +56 -0
  75. package/src/utils/message-helper.ts +100 -0
  76. package/src/utils/reconnect.ts +108 -0
  77. package/src/utils/session.ts +64 -0
  78. package/src/utils/websocket.ts +90 -0
@@ -0,0 +1,50 @@
1
+ import { GatewayConnection } from "./connection";
2
+ import { DEFAULT_IDENTIFY_PROPERTIES, } from "../types";
3
+ import { DEFAULT_RECONNECT_DELAYS, DEFAULT_STORAGE_KEY, DEFAULT_MAX_RECONNECT_ATTEMPTS, } from "../types/constants";
4
+ import { createLogger, LogLevel } from "../utils/logger";
5
+ export class DiscordGateway {
6
+ connection;
7
+ constructor(token, intents, ctx, config) {
8
+ const storageKey = config?.storageKey || DEFAULT_STORAGE_KEY;
9
+ const identifyProperties = config?.identifyProperties || DEFAULT_IDENTIFY_PROPERTIES;
10
+ const maxReconnectAttempts = config?.maxReconnectAttempts || DEFAULT_MAX_RECONNECT_ATTEMPTS;
11
+ const reconnectDelays = config?.reconnectDelays || DEFAULT_RECONNECT_DELAYS;
12
+ const logger = config?.logger || createLogger({
13
+ level: config?.debug ? LogLevel.DEBUG : LogLevel.INFO,
14
+ });
15
+ this.connection = new GatewayConnection(token, intents, ctx, {
16
+ storageKey,
17
+ identifyProperties,
18
+ maxReconnectAttempts,
19
+ reconnectDelays,
20
+ onDispatch: config?.onDispatch,
21
+ logger,
22
+ debug: config?.debug,
23
+ });
24
+ }
25
+ get ws() {
26
+ return this.connection.ws;
27
+ }
28
+ get isConnected() {
29
+ return this.connection.isConnected;
30
+ }
31
+ async connect() {
32
+ await this.connection.connect();
33
+ }
34
+ async disconnect() {
35
+ await this.connection.disconnect();
36
+ }
37
+ async sendHeartbeat() {
38
+ await this.connection.sendHeartbeat();
39
+ }
40
+ onReady(callback) {
41
+ this.connection.onReady(callback);
42
+ }
43
+ onMessage(callback) {
44
+ this.connection.onMessage(callback);
45
+ }
46
+ onError(callback) {
47
+ this.connection.onError(callback);
48
+ }
49
+ }
50
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/core/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAGL,2BAA2B,GAE5B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,OAAO,cAAc;IACjB,UAAU,CAAoB;IAEtC,YACE,KAAa,EACb,OAAe,EACf,GAAuB,EACvB,MAA+B;QAE/B,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,mBAAmB,CAAC;QAC7D,MAAM,kBAAkB,GACtB,MAAM,EAAE,kBAAkB,IAAI,2BAA2B,CAAC;QAC5D,MAAM,oBAAoB,GACxB,MAAM,EAAE,oBAAoB,IAAI,8BAA8B,CAAC;QACjE,MAAM,eAAe,GACnB,MAAM,EAAE,eAAe,IAAI,wBAAwB,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,YAAY,CAAC;YAC5C,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;SACtD,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;YAC3D,UAAU;YACV,kBAAkB;YAClB,oBAAoB;YACpB,eAAe;YACf,UAAU,EAAE,MAAM,EAAE,UAAU;YAC9B,MAAM;YACN,KAAK,EAAE,MAAM,EAAE,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,QAAmC;QACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,QAAqC;QAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,QAAgC;QACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import { GatewayPayload, HelloData, ReadyData, MessageData } from "../types";
2
+ import type { DurableObjectState } from "@cloudflare/workers-types";
3
+ import type { Logger } from "../utils/logger";
4
+ export declare class GatewayHandlers {
5
+ private ctx;
6
+ private storageKey;
7
+ private sequence;
8
+ private onReady;
9
+ private onMessage;
10
+ private onDispatch;
11
+ private logger;
12
+ constructor(ctx: DurableObjectState, storageKey: string, sequence: {
13
+ value: number | null;
14
+ }, onReady: (data: ReadyData) => void, onMessage: (data: MessageData) => void, onDispatch: ((event: string, data: unknown) => void) | undefined, logger: Logger);
15
+ handleHello(data: HelloData): Promise<void>;
16
+ handleReady(data: ReadyData): Promise<void>;
17
+ handleResumed(): void;
18
+ handleDispatch(payload: GatewayPayload): void;
19
+ private handleMessageCreate;
20
+ private getOpcodeName;
21
+ private getState;
22
+ private validateState;
23
+ private updateSequenceInStorage;
24
+ }
25
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/core/handlers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EAET,WAAW,EACZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,qBAAa,eAAe;IAExB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;gBANN,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAClC,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,EAClC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EACtC,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,EAChE,MAAM,EAAE,MAAM;IAGlB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,aAAa,IAAI,IAAI;IAarB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAwB7C,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,aAAa;YAOP,QAAQ;IAKtB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,uBAAuB;CAWhC"}
@@ -0,0 +1,120 @@
1
+ import { GatewayOpcode, GatewayEvent } from "../types/constants";
2
+ export class GatewayHandlers {
3
+ ctx;
4
+ storageKey;
5
+ sequence;
6
+ onReady;
7
+ onMessage;
8
+ onDispatch;
9
+ logger;
10
+ constructor(ctx, storageKey, sequence, onReady, onMessage, onDispatch, logger) {
11
+ this.ctx = ctx;
12
+ this.storageKey = storageKey;
13
+ this.sequence = sequence;
14
+ this.onReady = onReady;
15
+ this.onMessage = onMessage;
16
+ this.onDispatch = onDispatch;
17
+ this.logger = logger;
18
+ }
19
+ async handleHello(data) {
20
+ this.logger.debug("Handling HELLO", { heartbeatInterval: data.heartbeat_interval });
21
+ const state = await this.getState();
22
+ await this.ctx.storage.put(this.storageKey, {
23
+ heartbeatInterval: data.heartbeat_interval,
24
+ sequence: this.sequence.value,
25
+ sessionId: state?.sessionId ?? null,
26
+ reconnectAttempts: 0,
27
+ shouldResume: state?.sessionId !== null && state?.sessionId !== undefined,
28
+ });
29
+ }
30
+ async handleReady(data) {
31
+ this.logger.info("Bot ready", { userId: data.user.id, username: data.user.username });
32
+ const state = await this.getState();
33
+ if (state) {
34
+ await this.ctx.storage.put(this.storageKey, {
35
+ ...state,
36
+ sessionId: data.session_id,
37
+ shouldResume: true,
38
+ reconnectAttempts: 0,
39
+ });
40
+ }
41
+ this.onReady(data);
42
+ }
43
+ handleResumed() {
44
+ this.logger.info("Session resumed");
45
+ this.ctx.storage.get(this.storageKey).then((state) => {
46
+ const gatewayState = this.validateState(state);
47
+ if (gatewayState) {
48
+ this.ctx.storage.put(this.storageKey, {
49
+ ...gatewayState,
50
+ reconnectAttempts: 0,
51
+ });
52
+ }
53
+ });
54
+ }
55
+ handleDispatch(payload) {
56
+ if (payload.s !== null && payload.s !== undefined) {
57
+ this.sequence.value = payload.s;
58
+ this.updateSequenceInStorage();
59
+ }
60
+ if (!payload.t) {
61
+ return;
62
+ }
63
+ const event = payload.t;
64
+ if (event === GatewayEvent.READY) {
65
+ this.handleReady(payload.d);
66
+ }
67
+ else if (event === GatewayEvent.MESSAGE_CREATE) {
68
+ this.handleMessageCreate(payload);
69
+ }
70
+ else if (event === GatewayEvent.RESUMED) {
71
+ this.handleResumed();
72
+ }
73
+ if (this.onDispatch) {
74
+ this.onDispatch(event, payload.d);
75
+ }
76
+ }
77
+ handleMessageCreate(payload) {
78
+ const messageData = payload.d;
79
+ const opcodeName = this.getOpcodeName(payload.op);
80
+ const enrichedMessage = {
81
+ ...messageData,
82
+ _gatewayMetadata: {
83
+ opcode: payload.op,
84
+ opcodeName,
85
+ event: payload.t ?? "UNKNOWN",
86
+ sequence: payload.s ?? null,
87
+ },
88
+ };
89
+ this.onMessage(enrichedMessage);
90
+ }
91
+ getOpcodeName(opcode) {
92
+ const entry = Object.entries(GatewayOpcode).find(([, value]) => value === opcode);
93
+ return entry?.[0] ?? "UNKNOWN";
94
+ }
95
+ async getState() {
96
+ const state = await this.ctx.storage.get(this.storageKey);
97
+ return this.validateState(state);
98
+ }
99
+ validateState(state) {
100
+ if (state === null || state === undefined) {
101
+ return null;
102
+ }
103
+ if (typeof state === "object" && "heartbeatInterval" in state) {
104
+ return state;
105
+ }
106
+ return null;
107
+ }
108
+ updateSequenceInStorage() {
109
+ this.ctx.storage.get(this.storageKey).then((state) => {
110
+ const gatewayState = this.validateState(state);
111
+ if (gatewayState) {
112
+ this.ctx.storage.put(this.storageKey, {
113
+ ...gatewayState,
114
+ sequence: this.sequence.value,
115
+ });
116
+ }
117
+ });
118
+ }
119
+ }
120
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/core/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { GatewayPayload } from "../types";
2
+ import type { DurableObjectState } from "@cloudflare/workers-types";
3
+ export declare class HeartbeatManager {
4
+ private ctx;
5
+ private storageKey;
6
+ private sendFn;
7
+ private heartbeatInterval;
8
+ private sequence;
9
+ constructor(ctx: DurableObjectState, storageKey: string, sequence: {
10
+ value: number | null;
11
+ }, sendFn: (payload: GatewayPayload) => void);
12
+ setInterval(interval: number): void;
13
+ send(): Promise<void>;
14
+ cancel(): Promise<void>;
15
+ updateAck(): Promise<void>;
16
+ private getState;
17
+ private validateState;
18
+ }
19
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAA2B;gBAGjC,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAC1B,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI;IAKnD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAerB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;YAUlB,QAAQ;IAKtB,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,55 @@
1
+ import { GatewayOpcode } from "../types/constants";
2
+ export class HeartbeatManager {
3
+ ctx;
4
+ storageKey;
5
+ sendFn;
6
+ heartbeatInterval = null;
7
+ sequence;
8
+ constructor(ctx, storageKey, sequence, sendFn) {
9
+ this.ctx = ctx;
10
+ this.storageKey = storageKey;
11
+ this.sendFn = sendFn;
12
+ this.sequence = sequence;
13
+ }
14
+ setInterval(interval) {
15
+ this.heartbeatInterval = interval;
16
+ }
17
+ async send() {
18
+ if (!this.heartbeatInterval) {
19
+ return;
20
+ }
21
+ const heartbeat = {
22
+ op: GatewayOpcode.HEARTBEAT,
23
+ d: this.sequence.value,
24
+ };
25
+ this.sendFn(heartbeat);
26
+ const nextHeartbeat = Date.now() + this.heartbeatInterval;
27
+ await this.ctx.storage.setAlarm(nextHeartbeat);
28
+ }
29
+ async cancel() {
30
+ await this.ctx.storage.deleteAlarm().catch(() => { });
31
+ }
32
+ async updateAck() {
33
+ const state = await this.getState();
34
+ if (state) {
35
+ await this.ctx.storage.put(this.storageKey, {
36
+ ...state,
37
+ lastHeartbeatAck: Date.now(),
38
+ });
39
+ }
40
+ }
41
+ async getState() {
42
+ const state = await this.ctx.storage.get(this.storageKey);
43
+ return this.validateState(state);
44
+ }
45
+ validateState(state) {
46
+ if (state === null || state === undefined) {
47
+ return null;
48
+ }
49
+ if (typeof state === "object" && "heartbeatInterval" in state) {
50
+ return state;
51
+ }
52
+ return null;
53
+ }
54
+ }
55
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,OAAO,gBAAgB;IAKjB;IACA;IAEA;IAPF,iBAAiB,GAAkB,IAAI,CAAC;IACxC,QAAQ,CAA2B;IAE3C,YACU,GAAuB,EACvB,UAAkB,EAC1B,QAAkC,EAC1B,MAAyC;QAHzC,QAAG,GAAH,GAAG,CAAoB;QACvB,eAAU,GAAV,UAAU,CAAQ;QAElB,WAAM,GAAN,MAAM,CAAmC;QAEjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAmB;YAChC,EAAE,EAAE,aAAa,CAAC,SAAS;YAC3B,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;SACvB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1D,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC1C,GAAG,KAAK;gBACR,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE;aACN,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,mBAAmB,IAAI,KAAK,EAAE,CAAC;YAC9D,OAAO,KAAqB,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { GatewayPayload } from "../types";
2
+ import { GatewayHandlers } from "./handlers";
3
+ import { SessionManager } from "../utils/session";
4
+ import { HeartbeatManager } from "./heartbeat";
5
+ import type { DurableObjectState } from "@cloudflare/workers-types";
6
+ import type { Logger } from "../utils/logger";
7
+ export declare class MessageHandler {
8
+ private handlers;
9
+ private sessionManager;
10
+ private heartbeatManager;
11
+ private reconnectFn;
12
+ private ctx;
13
+ private storageKey;
14
+ private intents;
15
+ private logger;
16
+ constructor(handlers: GatewayHandlers, sessionManager: SessionManager, heartbeatManager: HeartbeatManager, reconnectFn: (shouldResume: boolean) => Promise<void>, ctx: DurableObjectState, storageKey: string, intents: number, logger: Logger);
17
+ handle(payload: GatewayPayload): Promise<void>;
18
+ private handleHello;
19
+ private handleInvalidSession;
20
+ shouldResume(code: number): boolean;
21
+ private getState;
22
+ }
23
+ //# sourceMappingURL=message-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/core/message-handler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAA2B,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;gBAPN,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EACrD,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGlB,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBtC,WAAW;YAmBX,oBAAoB;IAiBlC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;YAMrB,QAAQ;CAUvB"}
@@ -0,0 +1,92 @@
1
+ import { GatewayOpcode, RESUMEABLE_CLOSE_CODES, } from "../types/constants";
2
+ export class MessageHandler {
3
+ handlers;
4
+ sessionManager;
5
+ heartbeatManager;
6
+ reconnectFn;
7
+ ctx;
8
+ storageKey;
9
+ intents;
10
+ logger;
11
+ constructor(handlers, sessionManager, heartbeatManager, reconnectFn, ctx, storageKey, intents, logger) {
12
+ this.handlers = handlers;
13
+ this.sessionManager = sessionManager;
14
+ this.heartbeatManager = heartbeatManager;
15
+ this.reconnectFn = reconnectFn;
16
+ this.ctx = ctx;
17
+ this.storageKey = storageKey;
18
+ this.intents = intents;
19
+ this.logger = logger;
20
+ }
21
+ async handle(payload) {
22
+ const opcode = payload.op;
23
+ if (opcode === GatewayOpcode.HELLO) {
24
+ await this.handleHello(payload.d);
25
+ }
26
+ else if (opcode === GatewayOpcode.HEARTBEAT_ACK) {
27
+ await this.heartbeatManager.updateAck();
28
+ }
29
+ else if (opcode === GatewayOpcode.DISPATCH) {
30
+ this.handlers.handleDispatch(payload);
31
+ }
32
+ else if (opcode === GatewayOpcode.RECONNECT) {
33
+ this.logger.warn("Received RECONNECT opcode");
34
+ await this.reconnectFn(true);
35
+ }
36
+ else if (opcode === GatewayOpcode.INVALID_SESSION) {
37
+ await this.handleInvalidSession(payload.d);
38
+ }
39
+ else {
40
+ this.logger.warn("Unknown opcode received", { opcode });
41
+ }
42
+ }
43
+ async handleHello(data) {
44
+ this.logger.debug("Handling HELLO", { heartbeatInterval: data.heartbeat_interval });
45
+ this.heartbeatManager.setInterval(data.heartbeat_interval);
46
+ await this.handlers.handleHello(data);
47
+ const resumeData = await this.sessionManager.getResumeData();
48
+ const state = await this.getState();
49
+ if (resumeData && state?.shouldResume) {
50
+ this.logger.debug("Resuming session", { sessionId: resumeData.sessionId });
51
+ this.sessionManager.sendResume(resumeData.sessionId, resumeData.sequence);
52
+ }
53
+ else {
54
+ this.logger.debug("Identifying with new session");
55
+ this.sessionManager.sendIdentify(this.intents);
56
+ }
57
+ await this.heartbeatManager.send();
58
+ }
59
+ async handleInvalidSession(resumable) {
60
+ this.logger.warn("Invalid session", { resumable });
61
+ if (resumable) {
62
+ await this.reconnectFn(true);
63
+ }
64
+ else {
65
+ const state = await this.getState();
66
+ if (state) {
67
+ await this.ctx.storage.put(this.storageKey, {
68
+ ...state,
69
+ shouldResume: false,
70
+ sessionId: null,
71
+ });
72
+ }
73
+ await this.reconnectFn(false);
74
+ }
75
+ }
76
+ shouldResume(code) {
77
+ const isResumable = RESUMEABLE_CLOSE_CODES.includes(code);
78
+ this.logger.debug("Checking if should resume", { code, isResumable });
79
+ return isResumable;
80
+ }
81
+ async getState() {
82
+ const state = await this.ctx.storage.get(this.storageKey);
83
+ if (state === null || state === undefined) {
84
+ return null;
85
+ }
86
+ if (typeof state === "object" && "heartbeatInterval" in state) {
87
+ return state;
88
+ }
89
+ return null;
90
+ }
91
+ }
92
+ //# sourceMappingURL=message-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/core/message-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { DiscordGateway } from "./core/gateway";
2
+ export { DiscordClient, type DiscordClientOptions } from "./core/client";
3
+ export { MessageHelper } from "./utils/message-helper";
4
+ export { GatewayConnection } from "./core/connection";
5
+ export { GatewayHandlers } from "./core/handlers";
6
+ export { WebSocketManager } from "./utils/websocket";
7
+ export { ReconnectManager } from "./utils/reconnect";
8
+ export { SessionManager } from "./utils/session";
9
+ export { Logger, LogLevel, createLogger } from "./utils/logger";
10
+ export type { GatewayPayload, HelloData, IdentifyData, ResumeData, ReadyData, GatewayState, GatewayConfig, MessageData, } from "./types";
11
+ export { GatewayOpcode, GatewayEvent, GatewayIntents, WebSocketCloseCode, RESUMEABLE_CLOSE_CODES, GATEWAY_BASE_URL, GATEWAY_VERSION, GATEWAY_ENCODING, DEFAULT_RECONNECT_DELAYS, WEBSOCKET_READY_STATE_OPEN, DEFAULT_STORAGE_KEY, DEFAULT_MAX_RECONNECT_ATTEMPTS, } from "./types/constants";
12
+ export { DEFAULT_IDENTIFY_PROPERTIES } from "./types";
13
+ export { EmbedBuilder, ActionRowBuilder, ButtonBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder, ModalBuilder, TextInputBuilder, AttachmentBuilder, SlashCommandBuilder, ContextMenuCommandBuilder, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandOptionsOnlyBuilder, SlashCommandBooleanOption, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandUserOption, REST, Routes, Colors, PermissionFlagsBits, GatewayIntentBits, Events, ActivityType, ChannelType, MessageType, InteractionType, ApplicationCommandType, ButtonStyle, TextInputStyle, ComponentType, Locale, type APIEmbed, type APIEmbedField, type APIButtonComponent, type APIActionRowComponent, type APIMessageComponent, type RESTPostAPIChannelMessageJSONBody, type RESTPostAPIChannelMessageResult, type APIInteractionResponse, type APIMessage, type APIUser, type APIGuild, type APIChannel, type APIInteraction, type APIChatInputApplicationCommandInteraction, type APIMessageApplicationCommandInteraction, type APIUserApplicationCommandInteraction, type APIMessageComponentInteraction, type APIModalSubmitInteraction, } from "discord.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEhE,YAAY,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAC7B,kCAAkC,EAClC,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,aAAa,EACb,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,iCAAiC,EACtC,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,yCAAyC,EAC9C,KAAK,uCAAuC,EAC5C,KAAK,oCAAoC,EACzC,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { DiscordGateway } from "./core/gateway";
2
+ export { DiscordClient } from "./core/client";
3
+ export { MessageHelper } from "./utils/message-helper";
4
+ export { GatewayConnection } from "./core/connection";
5
+ export { GatewayHandlers } from "./core/handlers";
6
+ export { WebSocketManager } from "./utils/websocket";
7
+ export { ReconnectManager } from "./utils/reconnect";
8
+ export { SessionManager } from "./utils/session";
9
+ export { Logger, LogLevel, createLogger } from "./utils/logger";
10
+ export { GatewayOpcode, GatewayEvent, GatewayIntents, WebSocketCloseCode, RESUMEABLE_CLOSE_CODES, GATEWAY_BASE_URL, GATEWAY_VERSION, GATEWAY_ENCODING, DEFAULT_RECONNECT_DELAYS, WEBSOCKET_READY_STATE_OPEN, DEFAULT_STORAGE_KEY, DEFAULT_MAX_RECONNECT_ATTEMPTS, } from "./types/constants";
11
+ export { DEFAULT_IDENTIFY_PROPERTIES } from "./types";
12
+ export { EmbedBuilder, ActionRowBuilder, ButtonBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder, ModalBuilder, TextInputBuilder, AttachmentBuilder, SlashCommandBuilder, ContextMenuCommandBuilder, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandBooleanOption, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandUserOption, REST, Routes, Colors, PermissionFlagsBits, GatewayIntentBits, Events, ActivityType, ChannelType, MessageType, InteractionType, ApplicationCommandType, ButtonStyle, TextInputStyle, ComponentType, Locale, } from "discord.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAA6B,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAYhE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAC7B,kCAAkC,EAElC,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,aAAa,EACb,MAAM,GAmBP,MAAM,YAAY,CAAC"}
@@ -0,0 +1,90 @@
1
+ export declare enum GatewayOpcode {
2
+ DISPATCH = 0,
3
+ HEARTBEAT = 1,
4
+ IDENTIFY = 2,
5
+ PRESENCE_UPDATE = 3,
6
+ VOICE_STATE_UPDATE = 4,
7
+ RESUME = 6,
8
+ RECONNECT = 7,
9
+ REQUEST_GUILD_MEMBERS = 8,
10
+ INVALID_SESSION = 9,
11
+ HELLO = 10,
12
+ HEARTBEAT_ACK = 11
13
+ }
14
+ export declare enum GatewayEvent {
15
+ READY = "READY",
16
+ RESUMED = "RESUMED",
17
+ MESSAGE_CREATE = "MESSAGE_CREATE",
18
+ MESSAGE_UPDATE = "MESSAGE_UPDATE",
19
+ MESSAGE_DELETE = "MESSAGE_DELETE",
20
+ INTERACTION_CREATE = "INTERACTION_CREATE",
21
+ GUILD_CREATE = "GUILD_CREATE",
22
+ GUILD_UPDATE = "GUILD_UPDATE",
23
+ GUILD_DELETE = "GUILD_DELETE"
24
+ }
25
+ /**
26
+ * Discord Gateway Intents
27
+ * @see https://discord.com/developers/docs/topics/gateway#gateway-intents
28
+ */
29
+ export declare enum GatewayIntents {
30
+ GUILDS = 1,
31
+ GUILD_MEMBERS = 2,
32
+ GUILD_MODERATION = 4,
33
+ GUILD_EMOJIS_AND_STICKERS = 8,
34
+ GUILD_INTEGRATIONS = 16,
35
+ GUILD_WEBHOOKS = 32,
36
+ GUILD_INVITES = 64,
37
+ GUILD_VOICE_STATES = 128,
38
+ GUILD_PRESENCES = 256,
39
+ GUILD_MESSAGES = 512,
40
+ GUILD_MESSAGE_REACTIONS = 1024,
41
+ GUILD_MESSAGE_TYPING = 2048,
42
+ DIRECT_MESSAGES = 4096,
43
+ DIRECT_MESSAGE_REACTIONS = 8192,
44
+ DIRECT_MESSAGE_TYPING = 16384,
45
+ MESSAGE_CONTENT = 32768,
46
+ GUILD_SCHEDULED_EVENTS = 65536,
47
+ AUTO_MODERATION_CONFIGURATION = 1048576,
48
+ AUTO_MODERATION_EXECUTION = 2097152,
49
+ GUILD_MESSAGE_POLLS = 16777216,
50
+ DIRECT_MESSAGE_POLLS = 33554432
51
+ }
52
+ export declare enum WebSocketCloseCode {
53
+ NORMAL_CLOSURE = 1000,
54
+ GOING_AWAY = 1001,
55
+ PROTOCOL_ERROR = 1002,
56
+ UNSUPPORTED_DATA = 1003,
57
+ NO_STATUS_RECEIVED = 1005,
58
+ ABNORMAL_CLOSURE = 1006,
59
+ INVALID_FRAME_PAYLOAD = 1007,
60
+ POLICY_VIOLATION = 1008,
61
+ MESSAGE_TOO_BIG = 1009,
62
+ MISSING_EXTENSION = 1010,
63
+ INTERNAL_ERROR = 1011,
64
+ SERVICE_RESTART = 1012,
65
+ TRY_AGAIN_LATER = 1013,
66
+ BAD_GATEWAY = 1014,
67
+ TLS_HANDSHAKE = 1015,
68
+ UNAUTHENTICATED = 4000,
69
+ INVALID_API_VERSION = 4001,
70
+ INVALID_INTENTS = 4002,
71
+ DISALLOWED_INTENTS = 4003
72
+ }
73
+ export declare const RESUMEABLE_CLOSE_CODES: WebSocketCloseCode[];
74
+ export declare const GATEWAY_BASE_URL = "https://discord.com/api/v10/gateway/bot";
75
+ export declare const GATEWAY_VERSION = 10;
76
+ export declare const GATEWAY_ENCODING = "json";
77
+ export declare const WEBSOCKET_READY_STATE_OPEN = 1;
78
+ export declare const DEFAULT_STORAGE_KEY = "gatewayState";
79
+ export declare const DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;
80
+ export declare const DEFAULT_RECONNECT_DELAYS: {
81
+ initial: number;
82
+ max: number;
83
+ backoffMultiplier: number;
84
+ };
85
+ export declare const DEFAULT_IDENTIFY_PROPERTIES: {
86
+ os: string;
87
+ browser: string;
88
+ device: string;
89
+ };
90
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,QAAQ,IAAI;IACZ,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,eAAe,IAAI;IACnB,kBAAkB,IAAI;IACtB,MAAM,IAAI;IACV,SAAS,IAAI;IACb,qBAAqB,IAAI;IACzB,eAAe,IAAI;IACnB,KAAK,KAAK;IACV,aAAa,KAAK;CACnB;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,kBAAkB,uBAAuB;IACzC,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;CAC9B;AAED;;;GAGG;AACH,oBAAY,cAAc;IACxB,MAAM,IAAS;IACf,aAAa,IAAS;IACtB,gBAAgB,IAAS;IACzB,yBAAyB,IAAS;IAClC,kBAAkB,KAAS;IAC3B,cAAc,KAAS;IACvB,aAAa,KAAS;IACtB,kBAAkB,MAAS;IAC3B,eAAe,MAAS;IACxB,cAAc,MAAS;IACvB,uBAAuB,OAAU;IACjC,oBAAoB,OAAU;IAC9B,eAAe,OAAU;IACzB,wBAAwB,OAAU;IAClC,qBAAqB,QAAU;IAC/B,eAAe,QAAU;IACzB,sBAAsB,QAAU;IAChC,6BAA6B,UAAU;IACvC,yBAAyB,UAAU;IACnC,mBAAmB,WAAU;IAC7B,oBAAoB,WAAU;CAC/B;AAED,oBAAY,kBAAkB;IAC5B,cAAc,OAAO;IACrB,UAAU,OAAO;IACjB,cAAc,OAAO;IACrB,gBAAgB,OAAO;IACvB,kBAAkB,OAAO;IACzB,gBAAgB,OAAO;IACvB,qBAAqB,OAAO;IAC5B,gBAAgB,OAAO;IACvB,eAAe,OAAO;IACtB,iBAAiB,OAAO;IACxB,cAAc,OAAO;IACrB,eAAe,OAAO;IACtB,eAAe,OAAO;IACtB,WAAW,OAAO;IAClB,aAAa,OAAO;IACpB,eAAe,OAAO;IACtB,mBAAmB,OAAO;IAC1B,eAAe,OAAO;IACtB,kBAAkB,OAAO;CAC1B;AAED,eAAO,MAAM,sBAAsB,sBAKlC,CAAC;AAEF,eAAO,MAAM,gBAAgB,4CAA4C,CAAC;AAC1E,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,eAAO,MAAM,wBAAwB;;;;CAIpC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;CAIvC,CAAC"}