@convosite/client 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +201 -2
- package/dist/index.cjs +325 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +224 -0
- package/dist/index.d.ts +224 -0
- package/dist/index.js +297 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -4
package/dist/index.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var ConvositeError = class extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
requestId;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super(options.message, options.cause === void 0 ? void 0 : { cause: options.cause });
|
|
9
|
+
this.name = "ConvositeError";
|
|
10
|
+
this.status = options.status ?? 0;
|
|
11
|
+
this.code = options.code ?? null;
|
|
12
|
+
this.details = options.details ?? null;
|
|
13
|
+
this.requestId = options.requestId ?? null;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/http.ts
|
|
18
|
+
function normalizeBaseUrl(value) {
|
|
19
|
+
return value.replace(/\/+$/, "");
|
|
20
|
+
}
|
|
21
|
+
function joinUrl(base, path) {
|
|
22
|
+
if (/^https?:\/\//i.test(path)) return path;
|
|
23
|
+
return `${normalizeBaseUrl(base)}/${path.replace(/^\/+/, "")}`;
|
|
24
|
+
}
|
|
25
|
+
function encodeSegment(value) {
|
|
26
|
+
return encodeURIComponent(value);
|
|
27
|
+
}
|
|
28
|
+
function queryString(values) {
|
|
29
|
+
const params = new URLSearchParams();
|
|
30
|
+
for (const [key, value] of Object.entries(values)) {
|
|
31
|
+
if (value !== void 0 && value !== null) params.set(key, String(value));
|
|
32
|
+
}
|
|
33
|
+
const query = params.toString();
|
|
34
|
+
return query ? `?${query}` : "";
|
|
35
|
+
}
|
|
36
|
+
function timeoutSignal(signal, timeout) {
|
|
37
|
+
if (timeout <= 0) return signal ? { signal, cleanup: () => void 0 } : { cleanup: () => void 0 };
|
|
38
|
+
const controller = new AbortController();
|
|
39
|
+
const timer = setTimeout(() => controller.abort(new DOMException("Request timed out.", "TimeoutError")), timeout);
|
|
40
|
+
const abort = () => controller.abort(signal?.reason);
|
|
41
|
+
if (signal) {
|
|
42
|
+
if (signal.aborted) abort();
|
|
43
|
+
else signal.addEventListener("abort", abort, { once: true });
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
signal: controller.signal,
|
|
47
|
+
cleanup: () => {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
signal?.removeEventListener("abort", abort);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function responseBody(response) {
|
|
54
|
+
const text = await response.text();
|
|
55
|
+
if (!text) return null;
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(text);
|
|
58
|
+
} catch {
|
|
59
|
+
return text;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function errorFrom(response, body) {
|
|
63
|
+
const object = body && typeof body === "object" ? body : {};
|
|
64
|
+
const message = typeof object.message === "string" ? object.message : `Convosite request failed with status ${response.status}.`;
|
|
65
|
+
const code = typeof object.error === "string" ? object.error : null;
|
|
66
|
+
const details = object.errors ?? body;
|
|
67
|
+
return new ConvositeError({
|
|
68
|
+
message,
|
|
69
|
+
status: response.status,
|
|
70
|
+
code,
|
|
71
|
+
details,
|
|
72
|
+
requestId: response.headers.get("X-Request-ID")
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
var HttpClient = class {
|
|
76
|
+
constructor(fetcher, baseUrl, headers, timeout) {
|
|
77
|
+
this.fetcher = fetcher;
|
|
78
|
+
this.baseUrl = baseUrl;
|
|
79
|
+
this.headers = headers;
|
|
80
|
+
this.timeout = timeout;
|
|
81
|
+
}
|
|
82
|
+
fetcher;
|
|
83
|
+
baseUrl;
|
|
84
|
+
headers;
|
|
85
|
+
timeout;
|
|
86
|
+
async api(path, init = {}) {
|
|
87
|
+
const response = await this.fetch(path, init, true);
|
|
88
|
+
const body = await responseBody(response);
|
|
89
|
+
if (!response.ok) throw errorFrom(response, body);
|
|
90
|
+
if (!body || typeof body !== "object" || !("success" in body)) {
|
|
91
|
+
throw new ConvositeError({ message: "Convosite returned an invalid API response.", status: response.status, details: body });
|
|
92
|
+
}
|
|
93
|
+
const envelope = body;
|
|
94
|
+
if (envelope.success !== true) {
|
|
95
|
+
throw new ConvositeError({ message: envelope.message || "Convosite request failed.", status: response.status, details: envelope.errors });
|
|
96
|
+
}
|
|
97
|
+
return envelope.data;
|
|
98
|
+
}
|
|
99
|
+
async raw(path, options = {}) {
|
|
100
|
+
const { parseAs = "json", ...init } = options;
|
|
101
|
+
const response = await this.fetch(path, init, true);
|
|
102
|
+
if (!response.ok) throw errorFrom(response, await responseBody(response));
|
|
103
|
+
if (parseAs === "response") return response;
|
|
104
|
+
if (parseAs === "text") return await response.text();
|
|
105
|
+
if (response.status === 204) return void 0;
|
|
106
|
+
return await response.json();
|
|
107
|
+
}
|
|
108
|
+
async fetch(path, init = {}, useTimeout = false) {
|
|
109
|
+
const headers = new Headers(this.headers);
|
|
110
|
+
new Headers(init.headers).forEach((value, key) => headers.set(key, value));
|
|
111
|
+
const timed = useTimeout ? timeoutSignal(init.signal ?? void 0, this.timeout) : timeoutSignal(init.signal ?? void 0, 0);
|
|
112
|
+
try {
|
|
113
|
+
const requestInit = { ...init, headers };
|
|
114
|
+
if (timed.signal) requestInit.signal = timed.signal;
|
|
115
|
+
return await this.fetcher(joinUrl(this.baseUrl, path), requestInit);
|
|
116
|
+
} catch (cause) {
|
|
117
|
+
if (cause instanceof ConvositeError) throw cause;
|
|
118
|
+
const aborted = timed.signal?.aborted;
|
|
119
|
+
throw new ConvositeError({
|
|
120
|
+
message: aborted ? "Convosite request was aborted." : "Unable to connect to Convosite.",
|
|
121
|
+
code: aborted ? "request_aborted" : "network_error",
|
|
122
|
+
cause
|
|
123
|
+
});
|
|
124
|
+
} finally {
|
|
125
|
+
timed.cleanup();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
async function workerError(response) {
|
|
130
|
+
return errorFrom(response, await responseBody(response));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// src/conversations.ts
|
|
134
|
+
async function* parseNdjson(response) {
|
|
135
|
+
if (!response.body) throw new ConvositeError({ message: "Conversation response did not contain a stream.", status: response.status });
|
|
136
|
+
const reader = response.body.getReader();
|
|
137
|
+
const decoder = new TextDecoder();
|
|
138
|
+
let buffer = "";
|
|
139
|
+
try {
|
|
140
|
+
while (true) {
|
|
141
|
+
const { value, done } = await reader.read();
|
|
142
|
+
buffer += decoder.decode(value, { stream: !done });
|
|
143
|
+
let newline;
|
|
144
|
+
while ((newline = buffer.indexOf("\n")) !== -1) {
|
|
145
|
+
const line = buffer.slice(0, newline).trim();
|
|
146
|
+
buffer = buffer.slice(newline + 1);
|
|
147
|
+
if (line) yield parseEvent(line);
|
|
148
|
+
}
|
|
149
|
+
if (done) break;
|
|
150
|
+
}
|
|
151
|
+
const tail = buffer.trim();
|
|
152
|
+
if (tail) yield parseEvent(tail);
|
|
153
|
+
} finally {
|
|
154
|
+
reader.releaseLock();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function parseEvent(line) {
|
|
158
|
+
try {
|
|
159
|
+
const event = JSON.parse(line);
|
|
160
|
+
if (!event || typeof event !== "object" || typeof event.type !== "string") {
|
|
161
|
+
throw new Error("Event has no type.");
|
|
162
|
+
}
|
|
163
|
+
return event;
|
|
164
|
+
} catch (cause) {
|
|
165
|
+
throw new ConvositeError({ message: "Conversation stream contained an invalid event.", code: "invalid_stream", details: line, cause });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
var ConversationsClient = class {
|
|
169
|
+
constructor(fetcher, baseUrl, siteId) {
|
|
170
|
+
this.fetcher = fetcher;
|
|
171
|
+
this.baseUrl = baseUrl;
|
|
172
|
+
this.siteId = siteId;
|
|
173
|
+
}
|
|
174
|
+
fetcher;
|
|
175
|
+
baseUrl;
|
|
176
|
+
siteId;
|
|
177
|
+
create(sessionId) {
|
|
178
|
+
let currentSession = sessionId?.trim() || null;
|
|
179
|
+
const client = this;
|
|
180
|
+
return {
|
|
181
|
+
get sessionId() {
|
|
182
|
+
return currentSession;
|
|
183
|
+
},
|
|
184
|
+
async *send(query, options = {}) {
|
|
185
|
+
const stream = client.send(query, { ...options, ...currentSession ? { sessionId: currentSession } : {} }, (id) => {
|
|
186
|
+
currentSession = id;
|
|
187
|
+
});
|
|
188
|
+
yield* stream;
|
|
189
|
+
},
|
|
190
|
+
async end(options = {}) {
|
|
191
|
+
if (!currentSession) return { ended: false };
|
|
192
|
+
const result = await client.end(currentSession, options);
|
|
193
|
+
if (result.ended) currentSession = null;
|
|
194
|
+
return result;
|
|
195
|
+
},
|
|
196
|
+
reset() {
|
|
197
|
+
currentSession = null;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async *send(query, options = {}, onSession) {
|
|
202
|
+
const trimmed = query.trim();
|
|
203
|
+
if (!trimmed) throw new ConvositeError({ message: "Conversation query is required.", code: "validation_error" });
|
|
204
|
+
const headers = new Headers({ "Content-Type": "application/json", "Accept": "application/x-ndjson" });
|
|
205
|
+
if (options.sessionId) headers.set("X-Conversation-Session", options.sessionId);
|
|
206
|
+
let response;
|
|
207
|
+
try {
|
|
208
|
+
const init = { method: "POST", headers, body: JSON.stringify({ query: trimmed }) };
|
|
209
|
+
if (options.signal) init.signal = options.signal;
|
|
210
|
+
response = await this.fetcher(joinUrl(this.baseUrl, `/conversations/${encodeSegment(this.siteId)}`), init);
|
|
211
|
+
} catch (cause) {
|
|
212
|
+
throw new ConvositeError({ message: options.signal?.aborted ? "Conversation request was aborted." : "Unable to connect to Convosite conversations.", code: options.signal?.aborted ? "request_aborted" : "network_error", cause });
|
|
213
|
+
}
|
|
214
|
+
if (!response.ok) throw await workerError(response);
|
|
215
|
+
const session = response.headers.get("X-Conversation-Session");
|
|
216
|
+
if (session) onSession?.(session);
|
|
217
|
+
yield* parseNdjson(response);
|
|
218
|
+
}
|
|
219
|
+
async end(sessionId, options = {}) {
|
|
220
|
+
const headers = new Headers({ "Accept": "application/json", "X-Conversation-Session": sessionId });
|
|
221
|
+
let response;
|
|
222
|
+
try {
|
|
223
|
+
const init = { method: "POST", headers };
|
|
224
|
+
if (options.signal) init.signal = options.signal;
|
|
225
|
+
response = await this.fetcher(joinUrl(this.baseUrl, `/conversations/${encodeSegment(this.siteId)}/end`), init);
|
|
226
|
+
} catch (cause) {
|
|
227
|
+
throw new ConvositeError({ message: options.signal?.aborted ? "Conversation request was aborted." : "Unable to connect to Convosite conversations.", code: options.signal?.aborted ? "request_aborted" : "network_error", cause });
|
|
228
|
+
}
|
|
229
|
+
if (!response.ok) throw await workerError(response);
|
|
230
|
+
return await response.json();
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// src/client.ts
|
|
235
|
+
var DEFAULT_BASE_URL = "https://app.convosite.io/api";
|
|
236
|
+
function createConvosite(config) {
|
|
237
|
+
if (!config || typeof config.site !== "string" || !config.site.trim()) {
|
|
238
|
+
throw new ConvositeError({ message: "A Convosite site ID is required.", code: "invalid_config" });
|
|
239
|
+
}
|
|
240
|
+
const fetcher = config.fetch ?? globalThis.fetch?.bind(globalThis);
|
|
241
|
+
if (!fetcher) throw new ConvositeError({ message: "No fetch implementation is available.", code: "invalid_config" });
|
|
242
|
+
const siteId = config.site.trim();
|
|
243
|
+
const baseUrl = normalizeBaseUrl(config.baseUrl ?? DEFAULT_BASE_URL);
|
|
244
|
+
const conversationUrl = normalizeBaseUrl(config.conversationUrl ?? baseUrl);
|
|
245
|
+
const http = new HttpClient(fetcher, baseUrl, config.headers ?? {}, config.timeout ?? 3e4);
|
|
246
|
+
const conversations = new ConversationsClient(fetcher, conversationUrl, siteId);
|
|
247
|
+
const site = encodeSegment(siteId);
|
|
248
|
+
const requestOptions = (options) => options?.signal ? { signal: options.signal } : {};
|
|
249
|
+
return {
|
|
250
|
+
site: {
|
|
251
|
+
get: (options) => http.api(`/${site}`, requestOptions(options))
|
|
252
|
+
},
|
|
253
|
+
pages: {
|
|
254
|
+
get: (path, options) => {
|
|
255
|
+
if (typeof path !== "string") throw new ConvositeError({ message: "Page path must be a string.", code: "validation_error" });
|
|
256
|
+
return http.api(`/content/${site}/pages${queryString({ path })}`, requestOptions(options));
|
|
257
|
+
},
|
|
258
|
+
find: (id, options) => http.api(`/content/${site}/pages/${encodeSegment(id)}`, requestOptions(options)),
|
|
259
|
+
list: (options = {}) => {
|
|
260
|
+
const { parentId, sort, direction, page, perPage, signal } = options;
|
|
261
|
+
return http.api(`/content/${site}/pages${queryString({
|
|
262
|
+
parent_id: parentId,
|
|
263
|
+
sort,
|
|
264
|
+
direction,
|
|
265
|
+
page,
|
|
266
|
+
per_page: perPage
|
|
267
|
+
})}`, requestOptions(signal ? { signal } : void 0));
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
menus: {
|
|
271
|
+
get: (id, options) => http.api(`/content/${site}/menus/${encodeSegment(id)}`, requestOptions(options))
|
|
272
|
+
},
|
|
273
|
+
search: (query, options = {}) => {
|
|
274
|
+
const { limit, signal } = options;
|
|
275
|
+
return http.api(`/search/${site}${queryString({ query, limit })}`, requestOptions(signal ? { signal } : void 0));
|
|
276
|
+
},
|
|
277
|
+
actions: {
|
|
278
|
+
run: (endpointId, input, options) => http.api(`/actions/${site}/${encodeSegment(endpointId)}`, {
|
|
279
|
+
method: "POST",
|
|
280
|
+
headers: { "Content-Type": "application/json", "Accept": "application/json" },
|
|
281
|
+
body: JSON.stringify(input),
|
|
282
|
+
...requestOptions(options)
|
|
283
|
+
})
|
|
284
|
+
},
|
|
285
|
+
conversations: {
|
|
286
|
+
create: (sessionId) => conversations.create(sessionId),
|
|
287
|
+
send: (query, options) => conversations.send(query, options),
|
|
288
|
+
end: (sessionId, options) => conversations.end(sessionId, options)
|
|
289
|
+
},
|
|
290
|
+
request: (path, options = {}) => http.raw(path, options)
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
export {
|
|
294
|
+
ConvositeError,
|
|
295
|
+
createConvosite
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/conversations.ts","../src/client.ts"],"sourcesContent":["export class ConvositeError extends Error {\n readonly status: number;\n readonly code: string | null;\n readonly details: unknown;\n readonly requestId: string | null;\n\n constructor(options: {\n message: string;\n status?: number;\n code?: string | null;\n details?: unknown;\n requestId?: string | null;\n cause?: unknown;\n }) {\n super(options.message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'ConvositeError';\n this.status = options.status ?? 0;\n this.code = options.code ?? null;\n this.details = options.details ?? null;\n this.requestId = options.requestId ?? null;\n }\n}\n","import { ConvositeError } from './errors';\nimport type { Fetch, RawRequestOptions } from './types';\n\ninterface ApiEnvelope<T> {\n success: boolean;\n message: string;\n data: T;\n errors: unknown;\n}\n\nexport function normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function joinUrl(base: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${normalizeBaseUrl(base)}/${path.replace(/^\\/+/, '')}`;\n}\n\nexport function encodeSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function queryString(values: Record<string, string | number | null | undefined>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined && value !== null) params.set(key, String(value));\n }\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n\nfunction timeoutSignal(signal: AbortSignal | undefined, timeout: number): { signal?: AbortSignal; cleanup: () => void } {\n if (timeout <= 0) return signal ? { signal, cleanup: () => undefined } : { cleanup: () => undefined };\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new DOMException('Request timed out.', 'TimeoutError')), timeout);\n const abort = () => controller.abort(signal?.reason);\n if (signal) {\n if (signal.aborted) abort();\n else signal.addEventListener('abort', abort, { once: true });\n }\n return {\n signal: controller.signal,\n cleanup: () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n },\n };\n}\n\nasync function responseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try { return JSON.parse(text); } catch { return text; }\n}\n\nfunction errorFrom(response: Response, body: unknown): ConvositeError {\n const object = body && typeof body === 'object' ? body as Record<string, unknown> : {};\n const message = typeof object.message === 'string' ? object.message : `Convosite request failed with status ${response.status}.`;\n const code = typeof object.error === 'string' ? object.error : null;\n const details = object.errors ?? body;\n return new ConvositeError({\n message,\n status: response.status,\n code,\n details,\n requestId: response.headers.get('X-Request-ID'),\n });\n}\n\nexport class HttpClient {\n constructor(\n private readonly fetcher: Fetch,\n private readonly baseUrl: string,\n private readonly headers: HeadersInit,\n private readonly timeout: number,\n ) {}\n\n async api<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await this.fetch(path, init, true);\n const body = await responseBody(response);\n if (!response.ok) throw errorFrom(response, body);\n if (!body || typeof body !== 'object' || !('success' in body)) {\n throw new ConvositeError({ message: 'Convosite returned an invalid API response.', status: response.status, details: body });\n }\n const envelope = body as ApiEnvelope<T>;\n if (envelope.success !== true) {\n throw new ConvositeError({ message: envelope.message || 'Convosite request failed.', status: response.status, details: envelope.errors });\n }\n return envelope.data;\n }\n\n async raw<T>(path: string, options: RawRequestOptions = {}): Promise<T> {\n const { parseAs = 'json', ...init } = options;\n const response = await this.fetch(path, init, true);\n if (!response.ok) throw errorFrom(response, await responseBody(response));\n if (parseAs === 'response') return response as T;\n if (parseAs === 'text') return await response.text() as T;\n if (response.status === 204) return undefined as T;\n return await response.json() as T;\n }\n\n async fetch(path: string, init: RequestInit = {}, useTimeout = false): Promise<Response> {\n const headers = new Headers(this.headers);\n new Headers(init.headers).forEach((value, key) => headers.set(key, value));\n const timed = useTimeout ? timeoutSignal(init.signal ?? undefined, this.timeout) : timeoutSignal(init.signal ?? undefined, 0);\n try {\n const requestInit: RequestInit = { ...init, headers };\n if (timed.signal) requestInit.signal = timed.signal;\n return await this.fetcher(joinUrl(this.baseUrl, path), requestInit);\n } catch (cause) {\n if (cause instanceof ConvositeError) throw cause;\n const aborted = timed.signal?.aborted;\n throw new ConvositeError({\n message: aborted ? 'Convosite request was aborted.' : 'Unable to connect to Convosite.',\n code: aborted ? 'request_aborted' : 'network_error',\n cause,\n });\n } finally {\n timed.cleanup();\n }\n }\n}\n\nexport async function workerError(response: Response): Promise<ConvositeError> {\n return errorFrom(response, await responseBody(response));\n}\n","import { ConvositeError } from './errors';\nimport { encodeSegment, joinUrl, workerError } from './http';\nimport type {\n Conversation,\n ConversationEndResponse,\n ConversationEvent,\n ConversationSendOptions,\n Fetch,\n RequestOptions,\n} from './types';\n\nasync function* parseNdjson(response: Response): AsyncGenerator<ConversationEvent> {\n if (!response.body) throw new ConvositeError({ message: 'Conversation response did not contain a stream.', status: response.status });\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n while (true) {\n const { value, done } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n let newline: number;\n while ((newline = buffer.indexOf('\\n')) !== -1) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (line) yield parseEvent(line);\n }\n if (done) break;\n }\n const tail = buffer.trim();\n if (tail) yield parseEvent(tail);\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseEvent(line: string): ConversationEvent {\n try {\n const event = JSON.parse(line) as unknown;\n if (!event || typeof event !== 'object' || typeof (event as { type?: unknown }).type !== 'string') {\n throw new Error('Event has no type.');\n }\n return event as ConversationEvent;\n } catch (cause) {\n throw new ConvositeError({ message: 'Conversation stream contained an invalid event.', code: 'invalid_stream', details: line, cause });\n }\n}\n\nexport class ConversationsClient {\n constructor(\n private readonly fetcher: Fetch,\n private readonly baseUrl: string,\n private readonly siteId: string,\n ) {}\n\n create(sessionId?: string): Conversation {\n let currentSession = sessionId?.trim() || null;\n const client = this;\n return {\n get sessionId() { return currentSession; },\n async *send(query: string, options: RequestOptions = {}) {\n const stream = client.send(query, { ...options, ...(currentSession ? { sessionId: currentSession } : {}) }, (id) => { currentSession = id; });\n yield* stream;\n },\n async end(options: RequestOptions = {}) {\n if (!currentSession) return { ended: false };\n const result = await client.end(currentSession, options);\n if (result.ended) currentSession = null;\n return result;\n },\n reset() { currentSession = null; },\n };\n }\n\n async *send(\n query: string,\n options: ConversationSendOptions = {},\n onSession?: (sessionId: string) => void,\n ): AsyncGenerator<ConversationEvent> {\n const trimmed = query.trim();\n if (!trimmed) throw new ConvositeError({ message: 'Conversation query is required.', code: 'validation_error' });\n const headers = new Headers({ 'Content-Type': 'application/json', 'Accept': 'application/x-ndjson' });\n if (options.sessionId) headers.set('X-Conversation-Session', options.sessionId);\n let response: Response;\n try {\n const init: RequestInit = { method: 'POST', headers, body: JSON.stringify({ query: trimmed }) };\n if (options.signal) init.signal = options.signal;\n response = await this.fetcher(joinUrl(this.baseUrl, `/conversations/${encodeSegment(this.siteId)}`), init);\n } catch (cause) {\n throw new ConvositeError({ message: options.signal?.aborted ? 'Conversation request was aborted.' : 'Unable to connect to Convosite conversations.', code: options.signal?.aborted ? 'request_aborted' : 'network_error', cause });\n }\n if (!response.ok) throw await workerError(response);\n const session = response.headers.get('X-Conversation-Session');\n if (session) onSession?.(session);\n yield* parseNdjson(response);\n }\n\n async end(sessionId: string, options: RequestOptions = {}): Promise<ConversationEndResponse> {\n const headers = new Headers({ 'Accept': 'application/json', 'X-Conversation-Session': sessionId });\n let response: Response;\n try {\n const init: RequestInit = { method: 'POST', headers };\n if (options.signal) init.signal = options.signal;\n response = await this.fetcher(joinUrl(this.baseUrl, `/conversations/${encodeSegment(this.siteId)}/end`), init);\n } catch (cause) {\n throw new ConvositeError({ message: options.signal?.aborted ? 'Conversation request was aborted.' : 'Unable to connect to Convosite conversations.', code: options.signal?.aborted ? 'request_aborted' : 'network_error', cause });\n }\n if (!response.ok) throw await workerError(response);\n return await response.json() as ConversationEndResponse;\n }\n}\n","import { ConvositeError } from './errors';\nimport { ConversationsClient } from './conversations';\nimport { encodeSegment, HttpClient, normalizeBaseUrl, queryString } from './http';\nimport type {\n ActionResponse,\n ConvositeClient,\n ConvositeConfig,\n MenuResponse,\n PageListOptions,\n PageListResponse,\n PageResponse,\n RawRequestOptions,\n RequestOptions,\n SearchOptions,\n SearchResponse,\n Site,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://app.convosite.io/api';\n\nexport function createConvosite(config: ConvositeConfig): ConvositeClient {\n if (!config || typeof config.site !== 'string' || !config.site.trim()) {\n throw new ConvositeError({ message: 'A Convosite site ID is required.', code: 'invalid_config' });\n }\n const fetcher = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!fetcher) throw new ConvositeError({ message: 'No fetch implementation is available.', code: 'invalid_config' });\n const siteId = config.site.trim();\n const baseUrl = normalizeBaseUrl(config.baseUrl ?? DEFAULT_BASE_URL);\n const conversationUrl = normalizeBaseUrl(config.conversationUrl ?? baseUrl);\n const http = new HttpClient(fetcher, baseUrl, config.headers ?? {}, config.timeout ?? 30_000);\n const conversations = new ConversationsClient(fetcher, conversationUrl, siteId);\n const site = encodeSegment(siteId);\n\n const requestOptions = (options?: RequestOptions): RequestInit => options?.signal ? { signal: options.signal } : {};\n\n return {\n site: {\n get: (options) => http.api<Site>(`/${site}`, requestOptions(options)),\n },\n pages: {\n get: (path, options) => {\n if (typeof path !== 'string') throw new ConvositeError({ message: 'Page path must be a string.', code: 'validation_error' });\n return http.api<PageResponse>(`/content/${site}/pages${queryString({ path })}`, requestOptions(options));\n },\n find: (id, options) => http.api<PageResponse>(`/content/${site}/pages/${encodeSegment(id)}`, requestOptions(options)),\n list: (options: PageListOptions = {}) => {\n const { parentId, sort, direction, page, perPage, signal } = options;\n return http.api<PageListResponse>(`/content/${site}/pages${queryString({\n parent_id: parentId,\n sort,\n direction,\n page,\n per_page: perPage,\n })}`, requestOptions(signal ? { signal } : undefined));\n },\n },\n menus: {\n get: (id, options) => http.api<MenuResponse>(`/content/${site}/menus/${encodeSegment(id)}`, requestOptions(options)),\n },\n search: (query: string, options: SearchOptions = {}) => {\n const { limit, signal } = options;\n return http.api<SearchResponse>(`/search/${site}${queryString({ query, limit })}`, requestOptions(signal ? { signal } : undefined));\n },\n actions: {\n run: (endpointId, input, options) => http.api<ActionResponse>(`/actions/${site}/${encodeSegment(endpointId)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify(input),\n ...requestOptions(options),\n }),\n },\n conversations: {\n create: (sessionId) => conversations.create(sessionId),\n send: (query, options) => conversations.send(query, options),\n end: (sessionId, options) => conversations.end(sessionId, options),\n },\n request: <T = unknown>(path: string, options: RawRequestOptions = {}) => http.raw<T>(path, options),\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@convosite/client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic JavaScript and TypeScript client for the Convosite runtime API.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
21
|
+
"build": "npm run clean && tsup src/index.ts --format esm,cjs --dts --sourcemap --clean",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"check": "npm run typecheck && npm test && npm run build",
|
|
25
|
+
"prepublishOnly": "npm run check"
|
|
26
|
+
},
|
|
27
|
+
"engines": { "node": ">=18" },
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"tsup": "^8.5.0",
|
|
30
|
+
"typescript": "^5.9.3",
|
|
31
|
+
"vitest": "^3.2.4"
|
|
32
|
+
},
|
|
33
|
+
"keywords": ["convosite", "cms", "headless-cms", "sdk", "typescript"]
|
|
34
|
+
}
|