@teincfood/chat-client 0.1.0

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/README.md +437 -0
  2. package/dist/api/auth.d.ts +13 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +27 -0
  5. package/dist/api/auth.js.map +1 -0
  6. package/dist/api/contacts.d.ts +6 -0
  7. package/dist/api/contacts.d.ts.map +1 -0
  8. package/dist/api/contacts.js +21 -0
  9. package/dist/api/contacts.js.map +1 -0
  10. package/dist/api/conversations.d.ts +21 -0
  11. package/dist/api/conversations.d.ts.map +1 -0
  12. package/dist/api/conversations.js +24 -0
  13. package/dist/api/conversations.js.map +1 -0
  14. package/dist/api/messages.d.ts +11 -0
  15. package/dist/api/messages.d.ts.map +1 -0
  16. package/dist/api/messages.js +21 -0
  17. package/dist/api/messages.js.map +1 -0
  18. package/dist/api/notifications.d.ts +15 -0
  19. package/dist/api/notifications.d.ts.map +1 -0
  20. package/dist/api/notifications.js +12 -0
  21. package/dist/api/notifications.js.map +1 -0
  22. package/dist/api/upload.d.ts +6 -0
  23. package/dist/api/upload.d.ts.map +1 -0
  24. package/dist/api/upload.js +15 -0
  25. package/dist/api/upload.js.map +1 -0
  26. package/dist/client.d.ts +98 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +277 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/events.d.ts +9 -0
  31. package/dist/events.d.ts.map +1 -0
  32. package/dist/events.js +28 -0
  33. package/dist/events.js.map +1 -0
  34. package/dist/formatters.d.ts +4 -0
  35. package/dist/formatters.d.ts.map +1 -0
  36. package/dist/formatters.js +32 -0
  37. package/dist/formatters.js.map +1 -0
  38. package/dist/http.d.ts +25 -0
  39. package/dist/http.d.ts.map +1 -0
  40. package/dist/http.js +90 -0
  41. package/dist/http.js.map +1 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +25 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/integration.test.d.ts +10 -0
  47. package/dist/integration.test.d.ts.map +1 -0
  48. package/dist/integration.test.js +184 -0
  49. package/dist/integration.test.js.map +1 -0
  50. package/dist/optimistic.d.ts +26 -0
  51. package/dist/optimistic.d.ts.map +1 -0
  52. package/dist/optimistic.js +85 -0
  53. package/dist/optimistic.js.map +1 -0
  54. package/dist/react.d.ts +26 -0
  55. package/dist/react.d.ts.map +1 -0
  56. package/dist/react.js +208 -0
  57. package/dist/react.js.map +1 -0
  58. package/dist/retry.d.ts +7 -0
  59. package/dist/retry.d.ts.map +1 -0
  60. package/dist/retry.js +27 -0
  61. package/dist/retry.js.map +1 -0
  62. package/dist/socket.d.ts +83 -0
  63. package/dist/socket.d.ts.map +1 -0
  64. package/dist/socket.js +615 -0
  65. package/dist/socket.js.map +1 -0
  66. package/dist/store.d.ts +36 -0
  67. package/dist/store.d.ts.map +1 -0
  68. package/dist/store.js +185 -0
  69. package/dist/store.js.map +1 -0
  70. package/dist/types.d.ts +229 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +22 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/unit.test.d.ts +8 -0
  75. package/dist/unit.test.d.ts.map +1 -0
  76. package/dist/unit.test.js +425 -0
  77. package/dist/unit.test.js.map +1 -0
  78. package/package.json +31 -0
@@ -0,0 +1,7 @@
1
+ export interface RetryOptions {
2
+ attempts?: number;
3
+ baseDelayMs?: number;
4
+ maxDelayMs?: number;
5
+ }
6
+ export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
7
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAQD,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,CAAC,CAAC,CAkBZ"}
package/dist/retry.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retry = retry;
4
+ const defaultRetry = {
5
+ attempts: 3,
6
+ baseDelayMs: 1000,
7
+ maxDelayMs: 10000,
8
+ };
9
+ async function retry(fn, opts) {
10
+ const { attempts, baseDelayMs, maxDelayMs } = { ...defaultRetry, ...opts };
11
+ let lastErr;
12
+ for (let i = 0; i < attempts; i++) {
13
+ try {
14
+ return await fn();
15
+ }
16
+ catch (err) {
17
+ lastErr = err;
18
+ if (i < attempts - 1) {
19
+ const delay = Math.min(baseDelayMs * 2 ** i, maxDelayMs);
20
+ const jitter = Math.random() * delay * 0.2;
21
+ await new Promise((r) => setTimeout(r, delay + jitter));
22
+ }
23
+ }
24
+ }
25
+ throw lastErr;
26
+ }
27
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":";;AAYA,sBAqBC;AA3BD,MAAM,YAAY,GAA2B;IAC3C,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,KAAK;CAClB,CAAA;AAEM,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,IAAmB;IAEnB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,EAAE,CAAA;IAC1E,IAAI,OAAgB,CAAA;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAA;YACb,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;gBACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA;gBAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { Message, Conversation } from "./types";
2
+ import { TypedEventEmitter } from "./events";
3
+ import { OptimisticEngine } from "./optimistic";
4
+ import { ChatStore } from "./store";
5
+ export type FrameHandler = (frame: PhoenixV2Frame) => void;
6
+ export type PhoenixV2Frame = [
7
+ joinRef: string | null,
8
+ ref: string | null,
9
+ topic: string,
10
+ event: string,
11
+ payload: Record<string, unknown>
12
+ ];
13
+ export declare class PhoenixChatSocket {
14
+ private ws;
15
+ private refCounter;
16
+ private joinedChannels;
17
+ private pendingJoins;
18
+ private pendingPushes;
19
+ private topicJoinRefs;
20
+ private frameHandlers;
21
+ private heartbeatTimer;
22
+ private heartbeatPend;
23
+ private heartbeatMissed;
24
+ private reconnectTimer;
25
+ private reconnectAttempts;
26
+ private reconnectMaxDelay;
27
+ private shouldReconnect;
28
+ private emitter;
29
+ private optimistic;
30
+ private store;
31
+ private wsUrl;
32
+ private token;
33
+ currentUserId: string | null;
34
+ constructor(wsUrl: string, emitter: TypedEventEmitter, optimistic: OptimisticEngine, store: ChatStore);
35
+ private getRef;
36
+ private buildUrl;
37
+ connect(token: string): Promise<void>;
38
+ disconnect(): void;
39
+ private scheduleReconnect;
40
+ private cancelReconnect;
41
+ private reconnect;
42
+ isConnected(): boolean;
43
+ /** Check if joined to a conversation channel. */
44
+ isJoined(conversationId: string): boolean;
45
+ /** Check if joined to the events channel. */
46
+ isEventsJoined(): boolean;
47
+ reconnectWithToken(token: string): Promise<void>;
48
+ private eventsTopic;
49
+ private lastSequence;
50
+ /** Set the last known event sequence (e.g. from a push notification payload). */
51
+ setLastSequence(seq: number): void;
52
+ /** Get the last known event sequence. */
53
+ getLastSequence(): number;
54
+ /** Join the user-level events channel. */
55
+ joinEventsChannel(userId: string): Promise<void>;
56
+ /** Leave the events channel. */
57
+ leaveEventsChannel(): void;
58
+ private makeEventsHandler;
59
+ private sendRaw;
60
+ private push;
61
+ private pushWithReply;
62
+ joinConversation(conversationId: string): Promise<void>;
63
+ private makeTopicHandler;
64
+ leaveConversation(conversationId: string): void;
65
+ sendMessage(conversationId: string, body: string, metadata?: Record<string, unknown> | null): void;
66
+ sendTyping(conversationId: string): void;
67
+ markRead(conversationId: string): void;
68
+ fetchMessages(conversationId: string, limit?: number): void;
69
+ onFrame(topic: string, handler: FrameHandler): () => void;
70
+ private handleFrame;
71
+ private startHeartbeat;
72
+ private stopHeartbeat;
73
+ private handleNewMessage;
74
+ /**
75
+ * Resend all optimistic messages with status "failed" across all
76
+ * joined conversations. Called automatically after reconnection.
77
+ */
78
+ private retryFailedMessages;
79
+ private pendingRejoin;
80
+ }
81
+ export declare function toMessage(p: Record<string, unknown>): Message;
82
+ export declare function toConversation(p: Record<string, unknown>): Conversation;
83
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}