@pocketping/sdk-node 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.
- package/dist/index.d.mts +222 -0
- package/dist/index.d.ts +222 -0
- package/dist/index.js +496 -0
- package/dist/index.mjs +468 -0
- package/package.json +47 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Storage adapter interface.
|
|
5
|
+
* Implement this interface to use any database with PocketPing.
|
|
6
|
+
*/
|
|
7
|
+
interface Storage {
|
|
8
|
+
createSession(session: Session): Promise<void>;
|
|
9
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
10
|
+
getSessionByVisitorId?(visitorId: string): Promise<Session | null>;
|
|
11
|
+
updateSession(session: Session): Promise<void>;
|
|
12
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
13
|
+
saveMessage(message: Message): Promise<void>;
|
|
14
|
+
getMessages(sessionId: string, after?: string, limit?: number): Promise<Message[]>;
|
|
15
|
+
getMessage(messageId: string): Promise<Message | null>;
|
|
16
|
+
cleanupOldSessions?(olderThan: Date): Promise<number>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Bridge interface for notification channels.
|
|
21
|
+
* Implement this interface to add support for Telegram, Discord, Slack, etc.
|
|
22
|
+
*/
|
|
23
|
+
interface Bridge {
|
|
24
|
+
/** Unique name for this bridge */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Called when the bridge is added to PocketPing */
|
|
27
|
+
init?(pocketping: PocketPing): void | Promise<void>;
|
|
28
|
+
/** Called when a new chat session is created */
|
|
29
|
+
onNewSession?(session: Session): void | Promise<void>;
|
|
30
|
+
/** Called when a visitor sends a message */
|
|
31
|
+
onMessage?(message: Message, session: Session): void | Promise<void>;
|
|
32
|
+
/** Called when visitor starts/stops typing */
|
|
33
|
+
onTyping?(sessionId: string, isTyping: boolean): void | Promise<void>;
|
|
34
|
+
/** Called when messages are marked as delivered/read */
|
|
35
|
+
onMessageRead?(sessionId: string, messageIds: string[], status: MessageStatus): void | Promise<void>;
|
|
36
|
+
/** Cleanup when bridge is removed */
|
|
37
|
+
destroy?(): void | Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* AI provider interface.
|
|
42
|
+
* Implement this to add support for OpenAI, Gemini, Claude, or local models.
|
|
43
|
+
*/
|
|
44
|
+
interface AIProvider {
|
|
45
|
+
/** Provider name */
|
|
46
|
+
name: string;
|
|
47
|
+
/** Generate a response to the conversation */
|
|
48
|
+
generateResponse(messages: Message[], systemPrompt?: string): Promise<string>;
|
|
49
|
+
/** Check if the provider is available */
|
|
50
|
+
isAvailable(): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface PocketPingConfig {
|
|
54
|
+
/** Storage adapter for sessions and messages */
|
|
55
|
+
storage?: Storage | 'memory';
|
|
56
|
+
/** Notification bridges (Telegram, Discord, etc.) */
|
|
57
|
+
bridges?: Bridge[];
|
|
58
|
+
/** AI fallback configuration */
|
|
59
|
+
ai?: AIConfig;
|
|
60
|
+
/** Welcome message shown to new visitors */
|
|
61
|
+
welcomeMessage?: string;
|
|
62
|
+
/** Seconds of inactivity before AI takes over (default: 300) */
|
|
63
|
+
aiTakeoverDelay?: number;
|
|
64
|
+
/** Callback when a new session is created */
|
|
65
|
+
onNewSession?: (session: Session) => void | Promise<void>;
|
|
66
|
+
/** Callback when a message is received */
|
|
67
|
+
onMessage?: (message: Message, session: Session) => void | Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
interface AIConfig {
|
|
70
|
+
provider: AIProvider | 'openai' | 'gemini' | 'anthropic';
|
|
71
|
+
apiKey?: string;
|
|
72
|
+
model?: string;
|
|
73
|
+
systemPrompt?: string;
|
|
74
|
+
fallbackAfter?: number;
|
|
75
|
+
}
|
|
76
|
+
interface Session {
|
|
77
|
+
id: string;
|
|
78
|
+
visitorId: string;
|
|
79
|
+
createdAt: Date;
|
|
80
|
+
lastActivity: Date;
|
|
81
|
+
operatorOnline: boolean;
|
|
82
|
+
aiActive: boolean;
|
|
83
|
+
metadata?: SessionMetadata;
|
|
84
|
+
}
|
|
85
|
+
interface SessionMetadata {
|
|
86
|
+
url?: string;
|
|
87
|
+
referrer?: string;
|
|
88
|
+
pageTitle?: string;
|
|
89
|
+
userAgent?: string;
|
|
90
|
+
timezone?: string;
|
|
91
|
+
language?: string;
|
|
92
|
+
screenResolution?: string;
|
|
93
|
+
ip?: string;
|
|
94
|
+
country?: string;
|
|
95
|
+
city?: string;
|
|
96
|
+
deviceType?: 'desktop' | 'mobile' | 'tablet';
|
|
97
|
+
browser?: string;
|
|
98
|
+
os?: string;
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
type MessageStatus = 'sending' | 'sent' | 'delivered' | 'read';
|
|
102
|
+
interface Message {
|
|
103
|
+
id: string;
|
|
104
|
+
sessionId: string;
|
|
105
|
+
content: string;
|
|
106
|
+
sender: 'visitor' | 'operator' | 'ai';
|
|
107
|
+
timestamp: Date;
|
|
108
|
+
replyTo?: string;
|
|
109
|
+
metadata?: Record<string, unknown>;
|
|
110
|
+
status?: MessageStatus;
|
|
111
|
+
deliveredAt?: Date;
|
|
112
|
+
readAt?: Date;
|
|
113
|
+
}
|
|
114
|
+
interface ConnectRequest {
|
|
115
|
+
visitorId: string;
|
|
116
|
+
sessionId?: string;
|
|
117
|
+
metadata?: SessionMetadata;
|
|
118
|
+
}
|
|
119
|
+
interface ConnectResponse {
|
|
120
|
+
sessionId: string;
|
|
121
|
+
visitorId: string;
|
|
122
|
+
operatorOnline: boolean;
|
|
123
|
+
welcomeMessage?: string;
|
|
124
|
+
messages: Message[];
|
|
125
|
+
}
|
|
126
|
+
interface SendMessageRequest {
|
|
127
|
+
sessionId: string;
|
|
128
|
+
content: string;
|
|
129
|
+
sender: 'visitor' | 'operator';
|
|
130
|
+
replyTo?: string;
|
|
131
|
+
}
|
|
132
|
+
interface SendMessageResponse {
|
|
133
|
+
messageId: string;
|
|
134
|
+
timestamp: string;
|
|
135
|
+
}
|
|
136
|
+
interface GetMessagesRequest {
|
|
137
|
+
sessionId: string;
|
|
138
|
+
after?: string;
|
|
139
|
+
limit?: number;
|
|
140
|
+
}
|
|
141
|
+
interface GetMessagesResponse {
|
|
142
|
+
messages: Message[];
|
|
143
|
+
hasMore: boolean;
|
|
144
|
+
}
|
|
145
|
+
interface TypingRequest {
|
|
146
|
+
sessionId: string;
|
|
147
|
+
sender: 'visitor' | 'operator';
|
|
148
|
+
isTyping?: boolean;
|
|
149
|
+
}
|
|
150
|
+
interface ReadRequest {
|
|
151
|
+
sessionId: string;
|
|
152
|
+
messageIds: string[];
|
|
153
|
+
status?: MessageStatus;
|
|
154
|
+
}
|
|
155
|
+
interface ReadResponse {
|
|
156
|
+
updated: number;
|
|
157
|
+
}
|
|
158
|
+
interface PresenceResponse {
|
|
159
|
+
online: boolean;
|
|
160
|
+
operators?: Array<{
|
|
161
|
+
id: string;
|
|
162
|
+
name: string;
|
|
163
|
+
avatar?: string;
|
|
164
|
+
}>;
|
|
165
|
+
aiEnabled: boolean;
|
|
166
|
+
aiActiveAfter?: number;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
declare class PocketPing {
|
|
170
|
+
private storage;
|
|
171
|
+
private bridges;
|
|
172
|
+
private config;
|
|
173
|
+
private wss;
|
|
174
|
+
private sessionSockets;
|
|
175
|
+
private operatorOnline;
|
|
176
|
+
constructor(config?: PocketPingConfig);
|
|
177
|
+
private initStorage;
|
|
178
|
+
middleware(): (req: IncomingMessage & {
|
|
179
|
+
body?: unknown;
|
|
180
|
+
query?: Record<string, string>;
|
|
181
|
+
}, res: ServerResponse, next?: () => void) => void;
|
|
182
|
+
private parseBody;
|
|
183
|
+
attachWebSocket(server: any): void;
|
|
184
|
+
private handleWebSocketMessage;
|
|
185
|
+
private broadcastToSession;
|
|
186
|
+
handleConnect(request: ConnectRequest): Promise<ConnectResponse>;
|
|
187
|
+
handleMessage(request: SendMessageRequest): Promise<SendMessageResponse>;
|
|
188
|
+
handleGetMessages(request: GetMessagesRequest): Promise<GetMessagesResponse>;
|
|
189
|
+
handleTyping(request: TypingRequest): Promise<{
|
|
190
|
+
ok: boolean;
|
|
191
|
+
}>;
|
|
192
|
+
handlePresence(): Promise<PresenceResponse>;
|
|
193
|
+
handleRead(request: ReadRequest): Promise<ReadResponse>;
|
|
194
|
+
sendOperatorMessage(sessionId: string, content: string): Promise<Message>;
|
|
195
|
+
setOperatorOnline(online: boolean): void;
|
|
196
|
+
private notifyBridges;
|
|
197
|
+
private notifyBridgesRead;
|
|
198
|
+
addBridge(bridge: Bridge): void;
|
|
199
|
+
private generateId;
|
|
200
|
+
getStorage(): Storage;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* In-memory storage adapter.
|
|
205
|
+
* Useful for development and testing. Data is lost on restart.
|
|
206
|
+
*/
|
|
207
|
+
declare class MemoryStorage implements Storage {
|
|
208
|
+
private sessions;
|
|
209
|
+
private messages;
|
|
210
|
+
private messageById;
|
|
211
|
+
createSession(session: Session): Promise<void>;
|
|
212
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
213
|
+
getSessionByVisitorId(visitorId: string): Promise<Session | null>;
|
|
214
|
+
updateSession(session: Session): Promise<void>;
|
|
215
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
216
|
+
saveMessage(message: Message): Promise<void>;
|
|
217
|
+
getMessages(sessionId: string, after?: string, limit?: number): Promise<Message[]>;
|
|
218
|
+
getMessage(messageId: string): Promise<Message | null>;
|
|
219
|
+
cleanupOldSessions(olderThan: Date): Promise<number>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export { type AIProvider, type Bridge, type ConnectRequest, type ConnectResponse, MemoryStorage, type Message, PocketPing, type PocketPingConfig, type PresenceResponse, type SendMessageRequest, type SendMessageResponse, type Session, type Storage };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Storage adapter interface.
|
|
5
|
+
* Implement this interface to use any database with PocketPing.
|
|
6
|
+
*/
|
|
7
|
+
interface Storage {
|
|
8
|
+
createSession(session: Session): Promise<void>;
|
|
9
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
10
|
+
getSessionByVisitorId?(visitorId: string): Promise<Session | null>;
|
|
11
|
+
updateSession(session: Session): Promise<void>;
|
|
12
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
13
|
+
saveMessage(message: Message): Promise<void>;
|
|
14
|
+
getMessages(sessionId: string, after?: string, limit?: number): Promise<Message[]>;
|
|
15
|
+
getMessage(messageId: string): Promise<Message | null>;
|
|
16
|
+
cleanupOldSessions?(olderThan: Date): Promise<number>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Bridge interface for notification channels.
|
|
21
|
+
* Implement this interface to add support for Telegram, Discord, Slack, etc.
|
|
22
|
+
*/
|
|
23
|
+
interface Bridge {
|
|
24
|
+
/** Unique name for this bridge */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Called when the bridge is added to PocketPing */
|
|
27
|
+
init?(pocketping: PocketPing): void | Promise<void>;
|
|
28
|
+
/** Called when a new chat session is created */
|
|
29
|
+
onNewSession?(session: Session): void | Promise<void>;
|
|
30
|
+
/** Called when a visitor sends a message */
|
|
31
|
+
onMessage?(message: Message, session: Session): void | Promise<void>;
|
|
32
|
+
/** Called when visitor starts/stops typing */
|
|
33
|
+
onTyping?(sessionId: string, isTyping: boolean): void | Promise<void>;
|
|
34
|
+
/** Called when messages are marked as delivered/read */
|
|
35
|
+
onMessageRead?(sessionId: string, messageIds: string[], status: MessageStatus): void | Promise<void>;
|
|
36
|
+
/** Cleanup when bridge is removed */
|
|
37
|
+
destroy?(): void | Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* AI provider interface.
|
|
42
|
+
* Implement this to add support for OpenAI, Gemini, Claude, or local models.
|
|
43
|
+
*/
|
|
44
|
+
interface AIProvider {
|
|
45
|
+
/** Provider name */
|
|
46
|
+
name: string;
|
|
47
|
+
/** Generate a response to the conversation */
|
|
48
|
+
generateResponse(messages: Message[], systemPrompt?: string): Promise<string>;
|
|
49
|
+
/** Check if the provider is available */
|
|
50
|
+
isAvailable(): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface PocketPingConfig {
|
|
54
|
+
/** Storage adapter for sessions and messages */
|
|
55
|
+
storage?: Storage | 'memory';
|
|
56
|
+
/** Notification bridges (Telegram, Discord, etc.) */
|
|
57
|
+
bridges?: Bridge[];
|
|
58
|
+
/** AI fallback configuration */
|
|
59
|
+
ai?: AIConfig;
|
|
60
|
+
/** Welcome message shown to new visitors */
|
|
61
|
+
welcomeMessage?: string;
|
|
62
|
+
/** Seconds of inactivity before AI takes over (default: 300) */
|
|
63
|
+
aiTakeoverDelay?: number;
|
|
64
|
+
/** Callback when a new session is created */
|
|
65
|
+
onNewSession?: (session: Session) => void | Promise<void>;
|
|
66
|
+
/** Callback when a message is received */
|
|
67
|
+
onMessage?: (message: Message, session: Session) => void | Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
interface AIConfig {
|
|
70
|
+
provider: AIProvider | 'openai' | 'gemini' | 'anthropic';
|
|
71
|
+
apiKey?: string;
|
|
72
|
+
model?: string;
|
|
73
|
+
systemPrompt?: string;
|
|
74
|
+
fallbackAfter?: number;
|
|
75
|
+
}
|
|
76
|
+
interface Session {
|
|
77
|
+
id: string;
|
|
78
|
+
visitorId: string;
|
|
79
|
+
createdAt: Date;
|
|
80
|
+
lastActivity: Date;
|
|
81
|
+
operatorOnline: boolean;
|
|
82
|
+
aiActive: boolean;
|
|
83
|
+
metadata?: SessionMetadata;
|
|
84
|
+
}
|
|
85
|
+
interface SessionMetadata {
|
|
86
|
+
url?: string;
|
|
87
|
+
referrer?: string;
|
|
88
|
+
pageTitle?: string;
|
|
89
|
+
userAgent?: string;
|
|
90
|
+
timezone?: string;
|
|
91
|
+
language?: string;
|
|
92
|
+
screenResolution?: string;
|
|
93
|
+
ip?: string;
|
|
94
|
+
country?: string;
|
|
95
|
+
city?: string;
|
|
96
|
+
deviceType?: 'desktop' | 'mobile' | 'tablet';
|
|
97
|
+
browser?: string;
|
|
98
|
+
os?: string;
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
type MessageStatus = 'sending' | 'sent' | 'delivered' | 'read';
|
|
102
|
+
interface Message {
|
|
103
|
+
id: string;
|
|
104
|
+
sessionId: string;
|
|
105
|
+
content: string;
|
|
106
|
+
sender: 'visitor' | 'operator' | 'ai';
|
|
107
|
+
timestamp: Date;
|
|
108
|
+
replyTo?: string;
|
|
109
|
+
metadata?: Record<string, unknown>;
|
|
110
|
+
status?: MessageStatus;
|
|
111
|
+
deliveredAt?: Date;
|
|
112
|
+
readAt?: Date;
|
|
113
|
+
}
|
|
114
|
+
interface ConnectRequest {
|
|
115
|
+
visitorId: string;
|
|
116
|
+
sessionId?: string;
|
|
117
|
+
metadata?: SessionMetadata;
|
|
118
|
+
}
|
|
119
|
+
interface ConnectResponse {
|
|
120
|
+
sessionId: string;
|
|
121
|
+
visitorId: string;
|
|
122
|
+
operatorOnline: boolean;
|
|
123
|
+
welcomeMessage?: string;
|
|
124
|
+
messages: Message[];
|
|
125
|
+
}
|
|
126
|
+
interface SendMessageRequest {
|
|
127
|
+
sessionId: string;
|
|
128
|
+
content: string;
|
|
129
|
+
sender: 'visitor' | 'operator';
|
|
130
|
+
replyTo?: string;
|
|
131
|
+
}
|
|
132
|
+
interface SendMessageResponse {
|
|
133
|
+
messageId: string;
|
|
134
|
+
timestamp: string;
|
|
135
|
+
}
|
|
136
|
+
interface GetMessagesRequest {
|
|
137
|
+
sessionId: string;
|
|
138
|
+
after?: string;
|
|
139
|
+
limit?: number;
|
|
140
|
+
}
|
|
141
|
+
interface GetMessagesResponse {
|
|
142
|
+
messages: Message[];
|
|
143
|
+
hasMore: boolean;
|
|
144
|
+
}
|
|
145
|
+
interface TypingRequest {
|
|
146
|
+
sessionId: string;
|
|
147
|
+
sender: 'visitor' | 'operator';
|
|
148
|
+
isTyping?: boolean;
|
|
149
|
+
}
|
|
150
|
+
interface ReadRequest {
|
|
151
|
+
sessionId: string;
|
|
152
|
+
messageIds: string[];
|
|
153
|
+
status?: MessageStatus;
|
|
154
|
+
}
|
|
155
|
+
interface ReadResponse {
|
|
156
|
+
updated: number;
|
|
157
|
+
}
|
|
158
|
+
interface PresenceResponse {
|
|
159
|
+
online: boolean;
|
|
160
|
+
operators?: Array<{
|
|
161
|
+
id: string;
|
|
162
|
+
name: string;
|
|
163
|
+
avatar?: string;
|
|
164
|
+
}>;
|
|
165
|
+
aiEnabled: boolean;
|
|
166
|
+
aiActiveAfter?: number;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
declare class PocketPing {
|
|
170
|
+
private storage;
|
|
171
|
+
private bridges;
|
|
172
|
+
private config;
|
|
173
|
+
private wss;
|
|
174
|
+
private sessionSockets;
|
|
175
|
+
private operatorOnline;
|
|
176
|
+
constructor(config?: PocketPingConfig);
|
|
177
|
+
private initStorage;
|
|
178
|
+
middleware(): (req: IncomingMessage & {
|
|
179
|
+
body?: unknown;
|
|
180
|
+
query?: Record<string, string>;
|
|
181
|
+
}, res: ServerResponse, next?: () => void) => void;
|
|
182
|
+
private parseBody;
|
|
183
|
+
attachWebSocket(server: any): void;
|
|
184
|
+
private handleWebSocketMessage;
|
|
185
|
+
private broadcastToSession;
|
|
186
|
+
handleConnect(request: ConnectRequest): Promise<ConnectResponse>;
|
|
187
|
+
handleMessage(request: SendMessageRequest): Promise<SendMessageResponse>;
|
|
188
|
+
handleGetMessages(request: GetMessagesRequest): Promise<GetMessagesResponse>;
|
|
189
|
+
handleTyping(request: TypingRequest): Promise<{
|
|
190
|
+
ok: boolean;
|
|
191
|
+
}>;
|
|
192
|
+
handlePresence(): Promise<PresenceResponse>;
|
|
193
|
+
handleRead(request: ReadRequest): Promise<ReadResponse>;
|
|
194
|
+
sendOperatorMessage(sessionId: string, content: string): Promise<Message>;
|
|
195
|
+
setOperatorOnline(online: boolean): void;
|
|
196
|
+
private notifyBridges;
|
|
197
|
+
private notifyBridgesRead;
|
|
198
|
+
addBridge(bridge: Bridge): void;
|
|
199
|
+
private generateId;
|
|
200
|
+
getStorage(): Storage;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* In-memory storage adapter.
|
|
205
|
+
* Useful for development and testing. Data is lost on restart.
|
|
206
|
+
*/
|
|
207
|
+
declare class MemoryStorage implements Storage {
|
|
208
|
+
private sessions;
|
|
209
|
+
private messages;
|
|
210
|
+
private messageById;
|
|
211
|
+
createSession(session: Session): Promise<void>;
|
|
212
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
213
|
+
getSessionByVisitorId(visitorId: string): Promise<Session | null>;
|
|
214
|
+
updateSession(session: Session): Promise<void>;
|
|
215
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
216
|
+
saveMessage(message: Message): Promise<void>;
|
|
217
|
+
getMessages(sessionId: string, after?: string, limit?: number): Promise<Message[]>;
|
|
218
|
+
getMessage(messageId: string): Promise<Message | null>;
|
|
219
|
+
cleanupOldSessions(olderThan: Date): Promise<number>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export { type AIProvider, type Bridge, type ConnectRequest, type ConnectResponse, MemoryStorage, type Message, PocketPing, type PocketPingConfig, type PresenceResponse, type SendMessageRequest, type SendMessageResponse, type Session, type Storage };
|