@logwolf/client-js 1.1.1 → 2.0.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/CHANGELOG.md +22 -0
- package/README.md +38 -1
- package/dist/logwolf-client.d.ts +16 -1
- package/dist/logwolf-client.js +24 -4
- package/dist/logwolf-client.js.map +1 -1
- package/package.json +55 -54
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
Needs a Logwolf server with `GET /logs/:id`: the multi-tenancy release or later. Against an older server, `getOne` always resolves to `undefined`.
|
|
6
|
+
|
|
7
|
+
### Breaking
|
|
8
|
+
|
|
9
|
+
- **`getOne(id)` asks the server for that event** (`GET /logs/:id`) instead of fetching the latest page and searching it. It now finds an event of any age; it used to miss anything older than the newest 20. It resolves to `undefined` when the key's project has no event with that id, and throws on any other failure, as the other methods do. It needs a key with the `read` scope.
|
|
10
|
+
- **`getAll()` refuses a page the server would.** `pageSize` must be a whole number up to `MAX_PAGE_SIZE` (100) and `page` one up to `MAX_PAGE` (1,000,000). Anything else throws a `ZodError` before a request is made. A fractional or oversized `pageSize` used to be sent as it was.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `MAX_PAGE_SIZE` and `MAX_PAGE`, exported.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- `getAll()`'s response was typed as the DOM's `Event[]` before parsing.
|
|
19
|
+
|
|
20
|
+
## 1.1.1
|
|
21
|
+
|
|
22
|
+
- Handle base URLs with a path (`https://example.com/api`).
|
package/README.md
CHANGED
|
@@ -1 +1,38 @@
|
|
|
1
|
-
# logwolf
|
|
1
|
+
# @logwolf/client-js
|
|
2
|
+
|
|
3
|
+
The JavaScript client for [Logwolf](https://github.com/jpricardo/logwolf), a self-hosted logging platform. It captures events in the browser or in Node, samples them, and delivers them to your Logwolf instance in batches, with retries.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @logwolf/client-js
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import Logwolf, { LogwolfEvent } from '@logwolf/client-js';
|
|
13
|
+
|
|
14
|
+
const logwolf = new Logwolf({
|
|
15
|
+
url: 'https://logs.your-domain.com/api/',
|
|
16
|
+
apiKey: process.env.LOGWOLF_API_KEY!, // an lw_ key from the dashboard's Keys page
|
|
17
|
+
flushIntervalMs: 5000,
|
|
18
|
+
maxBatchSize: 20,
|
|
19
|
+
maxQueueSize: 500,
|
|
20
|
+
retryDelaysMs: [1000, 3000, 10000],
|
|
21
|
+
requestTimeoutMs: 10000,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const event = new LogwolfEvent({ name: 'checkout.completed', severity: 'info', tags: ['payments'] });
|
|
25
|
+
event.set('orderId', 'ord_123');
|
|
26
|
+
logwolf.capture(event); // returns at once; delivery is batched in the background
|
|
27
|
+
|
|
28
|
+
await logwolf.flush(); // before the process exits, so nothing queued is lost
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`capture()` is synchronous and never throws: events are queued and sent in batches. `create()` sends one event now and awaits the server. `getAll()`, `getOne()` and `delete()` read and delete events; they need a key with the `read` or `delete` scope, which a key only has if it was created with them.
|
|
32
|
+
|
|
33
|
+
Severity is one of `info`, `warning`, `error` or `critical`.
|
|
34
|
+
|
|
35
|
+
## Documentation
|
|
36
|
+
|
|
37
|
+
- [SDK reference](https://github.com/jpricardo/logwolf/blob/main/docs/sdk/js.md): every option and method.
|
|
38
|
+
- [Changelog](https://github.com/jpricardo/logwolf/blob/main/logwolf-client/js/CHANGELOG.md): 2.0.0 changed `getOne` and `getAll`'s pagination, and needs a recent Logwolf server.
|
package/dist/logwolf-client.d.ts
CHANGED
|
@@ -75,6 +75,10 @@ declare const LogwolfEventDTOSchema: z.ZodObject<{
|
|
|
75
75
|
tags: z.ZodArray<z.ZodString>;
|
|
76
76
|
}, z.core.$strip>;
|
|
77
77
|
type LogwolfEventDTO = z.infer<typeof LogwolfEventDTOSchema>;
|
|
78
|
+
/** The largest page the server serves; it answers 400 to more. */
|
|
79
|
+
declare const MAX_PAGE_SIZE = 100;
|
|
80
|
+
/** The deepest page the server serves. */
|
|
81
|
+
declare const MAX_PAGE = 1000000;
|
|
78
82
|
declare const PaginationSchema: z.ZodCodec<z.ZodCustom<URLSearchParams, URLSearchParams>, z.ZodObject<{
|
|
79
83
|
page: z.ZodNumber;
|
|
80
84
|
pageSize: z.ZodNumber;
|
|
@@ -139,7 +143,18 @@ declare class Logwolf {
|
|
|
139
143
|
* Awaitable — resolves when the server has accepted the event.
|
|
140
144
|
*/
|
|
141
145
|
create(event: LogwolfEvent): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* Fetches one page of events, newest first: the first 20 without
|
|
148
|
+
* `pagination`. `pageSize` can be at most {@link MAX_PAGE_SIZE}; a page
|
|
149
|
+
* outside the bounds throws before any request is made.
|
|
150
|
+
*/
|
|
142
151
|
getAll(p?: Pagination): Promise<LogwolfEventData[]>;
|
|
152
|
+
/**
|
|
153
|
+
* Fetches one event by id, or `undefined` if the key's project has no event
|
|
154
|
+
* with that id. It asks the server for that event alone (`GET /logs/:id`),
|
|
155
|
+
* so it finds any event, not only the latest page; that route needs a
|
|
156
|
+
* Logwolf server that has it.
|
|
157
|
+
*/
|
|
143
158
|
getOne(id: string): Promise<LogwolfEventData | undefined>;
|
|
144
159
|
delete(dto: DeleteLogwolfEventDTO): Promise<void>;
|
|
145
160
|
/**
|
|
@@ -162,5 +177,5 @@ declare class Logwolf {
|
|
|
162
177
|
private sendBatchWithRetry;
|
|
163
178
|
}
|
|
164
179
|
|
|
165
|
-
export { CreateLogwolfEventDTOSchema, DeleteLogwolfEventDTOSchema, Logwolf, LogwolfConfigSchema, LogwolfDatetimeSchema, LogwolfEvent, LogwolfEventDTOSchema, LogwolfEventDataSchema, LogwolfEventSchema, LogwolfEventSeveritySchema, PaginationSchema, Logwolf as default };
|
|
180
|
+
export { CreateLogwolfEventDTOSchema, DeleteLogwolfEventDTOSchema, Logwolf, LogwolfConfigSchema, LogwolfDatetimeSchema, LogwolfEvent, LogwolfEventDTOSchema, LogwolfEventDataSchema, LogwolfEventSchema, LogwolfEventSeveritySchema, MAX_PAGE, MAX_PAGE_SIZE, PaginationSchema, Logwolf as default };
|
|
166
181
|
export type { CreateLogwolfEventDTO, DeleteLogwolfEventDTO, LogwolfApiResponse, LogwolfConfig, LogwolfEventDTO, LogwolfEventData, Pagination, Severity };
|
package/dist/logwolf-client.js
CHANGED
|
@@ -61,9 +61,13 @@ const LogwolfEventDTOSchema = LogwolfEventSchema.pick({
|
|
|
61
61
|
}).partial({
|
|
62
62
|
data: true,
|
|
63
63
|
});
|
|
64
|
+
/** The largest page the server serves; it answers 400 to more. */
|
|
65
|
+
const MAX_PAGE_SIZE = 100;
|
|
66
|
+
/** The deepest page the server serves. */
|
|
67
|
+
const MAX_PAGE = 1_000_000;
|
|
64
68
|
const PaginationSchema = z.codec(z.instanceof(URLSearchParams), z.object({
|
|
65
|
-
page: z.number().positive(),
|
|
66
|
-
pageSize: z.number().positive(),
|
|
69
|
+
page: z.number().int().positive().max(MAX_PAGE),
|
|
70
|
+
pageSize: z.number().int().positive().max(MAX_PAGE_SIZE),
|
|
67
71
|
}), {
|
|
68
72
|
encode: (v) => {
|
|
69
73
|
return new URLSearchParams({ page: '' + v.page, pageSize: '' + v.pageSize });
|
|
@@ -148,6 +152,11 @@ class Logwolf {
|
|
|
148
152
|
.then((r) => this.handleResponse(r));
|
|
149
153
|
return res;
|
|
150
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Fetches one page of events, newest first: the first 20 without
|
|
157
|
+
* `pagination`. `pageSize` can be at most {@link MAX_PAGE_SIZE}; a page
|
|
158
|
+
* outside the bounds throws before any request is made.
|
|
159
|
+
*/
|
|
151
160
|
async getAll(p) {
|
|
152
161
|
const params = p ? PaginationSchema.encode(p) : '';
|
|
153
162
|
const url = new URL('logs?' + params, this.baseUrl);
|
|
@@ -156,8 +165,19 @@ class Logwolf {
|
|
|
156
165
|
.then((r) => this.handleResponse(r));
|
|
157
166
|
return z.array(LogwolfEventSchema).parse(res);
|
|
158
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Fetches one event by id, or `undefined` if the key's project has no event
|
|
170
|
+
* with that id. It asks the server for that event alone (`GET /logs/:id`),
|
|
171
|
+
* so it finds any event, not only the latest page; that route needs a
|
|
172
|
+
* Logwolf server that has it.
|
|
173
|
+
*/
|
|
159
174
|
async getOne(id) {
|
|
160
|
-
|
|
175
|
+
const url = new URL(`logs/${encodeURIComponent(id)}`, this.baseUrl);
|
|
176
|
+
const response = await this.fetchWithTimeout(url, { method: 'GET', headers: this.getHeaders() });
|
|
177
|
+
if (response.status === 404)
|
|
178
|
+
return undefined;
|
|
179
|
+
const body = (await response.json());
|
|
180
|
+
return LogwolfEventSchema.parse(this.handleResponse(body));
|
|
161
181
|
}
|
|
162
182
|
async delete(dto) {
|
|
163
183
|
const url = new URL('logs', this.baseUrl);
|
|
@@ -327,5 +347,5 @@ class LogwolfEvent {
|
|
|
327
347
|
}
|
|
328
348
|
}
|
|
329
349
|
|
|
330
|
-
export { CreateLogwolfEventDTOSchema, DeleteLogwolfEventDTOSchema, Logwolf, LogwolfConfigSchema, LogwolfDatetimeSchema, LogwolfEvent, LogwolfEventDTOSchema, LogwolfEventDataSchema, LogwolfEventSchema, LogwolfEventSeveritySchema, PaginationSchema, Logwolf as default };
|
|
350
|
+
export { CreateLogwolfEventDTOSchema, DeleteLogwolfEventDTOSchema, Logwolf, LogwolfConfigSchema, LogwolfDatetimeSchema, LogwolfEvent, LogwolfEventDTOSchema, LogwolfEventDataSchema, LogwolfEventSchema, LogwolfEventSeveritySchema, MAX_PAGE, MAX_PAGE_SIZE, PaginationSchema, Logwolf as default };
|
|
331
351
|
//# sourceMappingURL=logwolf-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logwolf-client.js","sources":["lib/schema.js","lib/client.js","lib/event.js"],"sourcesContent":["import z from 'zod';\nexport const LogwolfEventSeveritySchema = z.enum(['info', 'warning', 'error', 'critical']);\nexport const LogwolfEventDataSchema = z.codec(z.string(), z.record(z.string(), z.any()), {\n decode: (jsonString, ctx) => {\n try {\n return JSON.parse(jsonString);\n }\n catch (err) {\n ctx.issues.push({\n code: 'invalid_format',\n format: 'json',\n input: jsonString,\n message: err.message,\n });\n return z.NEVER;\n }\n },\n encode: (value) => JSON.stringify(value),\n});\nexport const LogwolfDatetimeSchema = z.codec(z.iso.datetime(), z.date(), {\n decode: (isoString) => new Date(isoString),\n encode: (date) => date.toISOString(),\n});\nexport const LogwolfEventSchema = z.object({\n id: z.string(),\n name: z.string(),\n severity: LogwolfEventSeveritySchema,\n tags: z.array(z.string()),\n data: LogwolfEventDataSchema,\n duration: z.int().optional(),\n created_at: LogwolfDatetimeSchema,\n updated_at: LogwolfDatetimeSchema,\n});\nexport const CreateLogwolfEventDTOSchema = LogwolfEventSchema.pick({\n name: true,\n severity: true,\n tags: true,\n data: true,\n duration: true,\n});\nexport const DeleteLogwolfEventDTOSchema = LogwolfEventSchema.pick({ id: true });\nexport const LogwolfConfigSchema = z.object({\n url: z.url(),\n apiKey: z.string().startsWith('lw_').min(10),\n sampleRate: z.number().positive().lte(1).optional(),\n errorSampleRate: z.number().positive().lte(1).optional(),\n // Batching options\n flushIntervalMs: z.number().positive(),\n maxBatchSize: z.number().positive(),\n maxQueueSize: z.number().positive(),\n retryDelaysMs: z.number().gte(0).array(),\n requestTimeoutMs: z.number().positive(),\n onDropped: z.function({ input: [z.any().array(), z.string()] }).optional(),\n});\nexport const LogwolfEventDTOSchema = LogwolfEventSchema.pick({\n name: true,\n severity: true,\n tags: true,\n data: true,\n}).partial({\n data: true,\n});\nexport const PaginationSchema = z.codec(z.instanceof(URLSearchParams), z.object({\n page: z.number().positive(),\n pageSize: z.number().positive(),\n}), {\n encode: (v) => {\n return new URLSearchParams({ page: '' + v.page, pageSize: '' + v.pageSize });\n },\n decode: (v) => {\n const page = v.get('page') ?? '0';\n const pageSize = v.get('pageSize') ?? '0';\n return { page: parseInt(page), pageSize: parseInt(pageSize) };\n },\n});\n//# sourceMappingURL=schema.js.map","import z from 'zod';\nimport { DeleteLogwolfEventDTOSchema, LogwolfConfigSchema, LogwolfEventSchema, PaginationSchema, } from './schema';\nexport class Logwolf {\n config;\n baseUrl;\n // Queue holds stopped LogwolfEvent instances ready to be flushed.\n queue = [];\n flushTimer = null;\n flushPromise = null;\n constructor(config) {\n this.config = LogwolfConfigSchema.parse(config);\n // Normalize to a trailing slash so relative paths append correctly.\n const raw = this.config.url;\n this.baseUrl = new URL(raw.endsWith('/') ? raw : raw + '/');\n }\n // --- Private: helpers ---\n shouldCapture(event) {\n switch (event.severity) {\n case 'error':\n return this.config.errorSampleRate === undefined || event.random >= 1 - this.config.errorSampleRate;\n case 'critical':\n return true;\n default:\n return this.config.sampleRate === undefined || event.random >= 1 - this.config.sampleRate;\n }\n }\n getHeaders() {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n }\n handleResponse(r) {\n if (r.error)\n throw new Error(r.message);\n return r.data;\n }\n sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n async fetchWithTimeout(url, init) {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), this.config.requestTimeoutMs);\n return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(id));\n }\n // --- Public API ---\n /**\n * Enqueues an event for batched delivery. Respects sampleRate and\n * errorSampleRate. Returns true if the event was accepted into the queue,\n * false if it was dropped (either by sampling or queue cap).\n *\n * capture() is synchronous and returns immediately — delivery happens in\n * the background. Call flush() before process exit to drain the queue.\n */\n capture(event) {\n if (!this.shouldCapture(event))\n return false;\n return this.enqueue(event);\n }\n /**\n * Sends an event immediately, bypassing sampling and the queue.\n * Awaitable — resolves when the server has accepted the event.\n */\n async create(event) {\n event.stop();\n const url = new URL('logs', this.baseUrl);\n const res = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(event.toObject()),\n })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return res;\n }\n async getAll(p) {\n const params = p ? PaginationSchema.encode(p) : '';\n const url = new URL('logs?' + params, this.baseUrl);\n const res = await this.fetchWithTimeout(url, { method: 'GET', headers: this.getHeaders() })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return z.array(LogwolfEventSchema).parse(res);\n }\n async getOne(id) {\n return this.getAll().then((r) => r.find((i) => i.id === id));\n }\n async delete(dto) {\n const url = new URL('logs', this.baseUrl);\n const res = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n body: JSON.stringify(DeleteLogwolfEventDTOSchema.parse(dto)),\n })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return res;\n }\n /**\n * Flushes all queued events immediately. Call this before process exit\n * or page unload to avoid losing buffered events.\n *\n * If a background flush is already in progress, waits for it to complete\n * before flushing any remaining events — so all enqueued events are sent.\n */\n async flush() {\n if (this.flushPromise)\n await this.flushPromise;\n if (this.queue.length > 0)\n await this.flushQueue();\n }\n /**\n * Clears the flush interval and prevents further background flushing.\n * Call this to allow Node.js to exit cleanly, or in test teardown.\n * Any queued events that haven't been flushed will be lost — call\n * flush() first if you need to drain the queue.\n */\n destroy() {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n // --- Private: queue management ---\n enqueue(event) {\n // Stop the stopwatch at enqueue time — this is the correct moment.\n event.stop();\n // Enforce the queue cap: drop the oldest event to make room.\n if (this.queue.length >= this.config.maxQueueSize) {\n const dropped = this.queue.splice(0, 1);\n this.config.onDropped?.(dropped, 'queue_full');\n }\n this.queue.push(event);\n // Start the flush timer lazily on first enqueue.\n if (this.flushTimer === null) {\n this.flushTimer = setInterval(() => {\n this.flushQueue().catch(() => {\n // Errors are handled inside flushQueue; this prevents\n // unhandled promise rejection from the interval callback.\n });\n }, this.config.flushIntervalMs);\n }\n // Flush immediately if the batch size threshold is reached.\n if (this.queue.length >= this.config.maxBatchSize) {\n this.flushQueue().catch(() => { });\n }\n return true;\n }\n flushQueue() {\n if (this.flushPromise !== null || this.queue.length === 0)\n return Promise.resolve();\n // Drain the queue into a local batch atomically. Any events captured\n // during the flush go into the next batch.\n const batch = this.queue.splice(0, this.queue.length);\n this.flushPromise = this.sendBatchWithRetry(batch)\n .catch(() => {\n // All retries exhausted — notify caller via onDropped.\n this.config.onDropped?.(batch, 'send_failed');\n })\n .finally(() => {\n this.flushPromise = null;\n });\n return this.flushPromise;\n }\n async sendBatchWithRetry(batch) {\n const url = new URL('logs/batch', this.baseUrl);\n const body = JSON.stringify(batch.map((ev) => ev.toObject()));\n let lastError;\n for (let attempt = 0; attempt <= this.config.retryDelaysMs.length; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body,\n });\n // 401/403 — bad key, do not retry, surface immediately.\n if (response.status === 401 || response.status === 403) {\n this.config.onDropped?.(batch, `auth_error_${response.status}`);\n return;\n }\n if (response.ok)\n return;\n // Non-2xx that isn't an auth error — retry.\n lastError = new Error(`Server returned ${response.status}`);\n }\n catch (err) {\n // Network error — retry.\n lastError = err;\n }\n // Wait before the next attempt, unless this was the last one.\n if (attempt < this.config.retryDelaysMs.length) {\n await this.sleep(this.config.retryDelaysMs[attempt]);\n }\n }\n throw lastError;\n }\n}\n//# sourceMappingURL=client.js.map","import { CreateLogwolfEventDTOSchema } from './schema';\nexport class LogwolfEvent {\n random = Math.random();\n start = performance.now();\n createdAt = new Date();\n name;\n severity;\n tags;\n data = {};\n _duration = null;\n constructor(props) {\n this.name = props.name;\n this.severity = props.severity;\n this.tags = props.tags;\n if (props.data) {\n this.data = props.data;\n }\n }\n /**\n * Stops the stopwatch. Duration is frozen from construction to this call.\n * Called automatically by `capture()` and `create()` — you only need to\n * call this manually if you want to stop the clock before those methods.\n *\n * Calling `stop()` more than once is a no-op; the first call wins.\n */\n stop() {\n if (this._duration === null) {\n this._duration = Math.floor(performance.now() - this.start);\n }\n }\n setName(n) {\n this.name = n;\n }\n setSeverity(s) {\n this.severity = s;\n }\n set(key, value) {\n this.data[key] = value;\n }\n get(key) {\n return this.data[key];\n }\n addTag(t) {\n this.tags.push(t);\n }\n toObject() {\n const duration = this._duration ?? Math.floor(performance.now() - this.start);\n const encoded = CreateLogwolfEventDTOSchema.encode({\n name: this.name,\n severity: this.severity,\n tags: Array.from(new Set(this.tags)),\n data: this.data,\n duration: duration,\n });\n return encoded;\n }\n}\n//# sourceMappingURL=event.js.map"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logwolf-client.js","sources":["lib/schema.js","lib/client.js","lib/event.js"],"sourcesContent":["import z from 'zod';\nexport const LogwolfEventSeveritySchema = z.enum(['info', 'warning', 'error', 'critical']);\nexport const LogwolfEventDataSchema = z.codec(z.string(), z.record(z.string(), z.any()), {\n decode: (jsonString, ctx) => {\n try {\n return JSON.parse(jsonString);\n }\n catch (err) {\n ctx.issues.push({\n code: 'invalid_format',\n format: 'json',\n input: jsonString,\n message: err.message,\n });\n return z.NEVER;\n }\n },\n encode: (value) => JSON.stringify(value),\n});\nexport const LogwolfDatetimeSchema = z.codec(z.iso.datetime(), z.date(), {\n decode: (isoString) => new Date(isoString),\n encode: (date) => date.toISOString(),\n});\nexport const LogwolfEventSchema = z.object({\n id: z.string(),\n name: z.string(),\n severity: LogwolfEventSeveritySchema,\n tags: z.array(z.string()),\n data: LogwolfEventDataSchema,\n duration: z.int().optional(),\n created_at: LogwolfDatetimeSchema,\n updated_at: LogwolfDatetimeSchema,\n});\nexport const CreateLogwolfEventDTOSchema = LogwolfEventSchema.pick({\n name: true,\n severity: true,\n tags: true,\n data: true,\n duration: true,\n});\nexport const DeleteLogwolfEventDTOSchema = LogwolfEventSchema.pick({ id: true });\nexport const LogwolfConfigSchema = z.object({\n url: z.url(),\n apiKey: z.string().startsWith('lw_').min(10),\n sampleRate: z.number().positive().lte(1).optional(),\n errorSampleRate: z.number().positive().lte(1).optional(),\n // Batching options\n flushIntervalMs: z.number().positive(),\n maxBatchSize: z.number().positive(),\n maxQueueSize: z.number().positive(),\n retryDelaysMs: z.number().gte(0).array(),\n requestTimeoutMs: z.number().positive(),\n onDropped: z.function({ input: [z.any().array(), z.string()] }).optional(),\n});\nexport const LogwolfEventDTOSchema = LogwolfEventSchema.pick({\n name: true,\n severity: true,\n tags: true,\n data: true,\n}).partial({\n data: true,\n});\n/** The largest page the server serves; it answers 400 to more. */\nexport const MAX_PAGE_SIZE = 100;\n/** The deepest page the server serves. */\nexport const MAX_PAGE = 1_000_000;\nexport const PaginationSchema = z.codec(z.instanceof(URLSearchParams), z.object({\n page: z.number().int().positive().max(MAX_PAGE),\n pageSize: z.number().int().positive().max(MAX_PAGE_SIZE),\n}), {\n encode: (v) => {\n return new URLSearchParams({ page: '' + v.page, pageSize: '' + v.pageSize });\n },\n decode: (v) => {\n const page = v.get('page') ?? '0';\n const pageSize = v.get('pageSize') ?? '0';\n return { page: parseInt(page), pageSize: parseInt(pageSize) };\n },\n});\n//# sourceMappingURL=schema.js.map","import z from 'zod';\nimport { DeleteLogwolfEventDTOSchema, LogwolfConfigSchema, LogwolfEventSchema, PaginationSchema, } from './schema';\nexport class Logwolf {\n config;\n baseUrl;\n // Queue holds stopped LogwolfEvent instances ready to be flushed.\n queue = [];\n flushTimer = null;\n flushPromise = null;\n constructor(config) {\n this.config = LogwolfConfigSchema.parse(config);\n // Normalize to a trailing slash so relative paths append correctly.\n const raw = this.config.url;\n this.baseUrl = new URL(raw.endsWith('/') ? raw : raw + '/');\n }\n // --- Private: helpers ---\n shouldCapture(event) {\n switch (event.severity) {\n case 'error':\n return this.config.errorSampleRate === undefined || event.random >= 1 - this.config.errorSampleRate;\n case 'critical':\n return true;\n default:\n return this.config.sampleRate === undefined || event.random >= 1 - this.config.sampleRate;\n }\n }\n getHeaders() {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n }\n handleResponse(r) {\n if (r.error)\n throw new Error(r.message);\n return r.data;\n }\n sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n async fetchWithTimeout(url, init) {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), this.config.requestTimeoutMs);\n return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(id));\n }\n // --- Public API ---\n /**\n * Enqueues an event for batched delivery. Respects sampleRate and\n * errorSampleRate. Returns true if the event was accepted into the queue,\n * false if it was dropped (either by sampling or queue cap).\n *\n * capture() is synchronous and returns immediately — delivery happens in\n * the background. Call flush() before process exit to drain the queue.\n */\n capture(event) {\n if (!this.shouldCapture(event))\n return false;\n return this.enqueue(event);\n }\n /**\n * Sends an event immediately, bypassing sampling and the queue.\n * Awaitable — resolves when the server has accepted the event.\n */\n async create(event) {\n event.stop();\n const url = new URL('logs', this.baseUrl);\n const res = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(event.toObject()),\n })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return res;\n }\n /**\n * Fetches one page of events, newest first: the first 20 without\n * `pagination`. `pageSize` can be at most {@link MAX_PAGE_SIZE}; a page\n * outside the bounds throws before any request is made.\n */\n async getAll(p) {\n const params = p ? PaginationSchema.encode(p) : '';\n const url = new URL('logs?' + params, this.baseUrl);\n const res = await this.fetchWithTimeout(url, { method: 'GET', headers: this.getHeaders() })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return z.array(LogwolfEventSchema).parse(res);\n }\n /**\n * Fetches one event by id, or `undefined` if the key's project has no event\n * with that id. It asks the server for that event alone (`GET /logs/:id`),\n * so it finds any event, not only the latest page; that route needs a\n * Logwolf server that has it.\n */\n async getOne(id) {\n const url = new URL(`logs/${encodeURIComponent(id)}`, this.baseUrl);\n const response = await this.fetchWithTimeout(url, { method: 'GET', headers: this.getHeaders() });\n if (response.status === 404)\n return undefined;\n const body = (await response.json());\n return LogwolfEventSchema.parse(this.handleResponse(body));\n }\n async delete(dto) {\n const url = new URL('logs', this.baseUrl);\n const res = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n body: JSON.stringify(DeleteLogwolfEventDTOSchema.parse(dto)),\n })\n .then((r) => r.json())\n .then((r) => this.handleResponse(r));\n return res;\n }\n /**\n * Flushes all queued events immediately. Call this before process exit\n * or page unload to avoid losing buffered events.\n *\n * If a background flush is already in progress, waits for it to complete\n * before flushing any remaining events — so all enqueued events are sent.\n */\n async flush() {\n if (this.flushPromise)\n await this.flushPromise;\n if (this.queue.length > 0)\n await this.flushQueue();\n }\n /**\n * Clears the flush interval and prevents further background flushing.\n * Call this to allow Node.js to exit cleanly, or in test teardown.\n * Any queued events that haven't been flushed will be lost — call\n * flush() first if you need to drain the queue.\n */\n destroy() {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n // --- Private: queue management ---\n enqueue(event) {\n // Stop the stopwatch at enqueue time — this is the correct moment.\n event.stop();\n // Enforce the queue cap: drop the oldest event to make room.\n if (this.queue.length >= this.config.maxQueueSize) {\n const dropped = this.queue.splice(0, 1);\n this.config.onDropped?.(dropped, 'queue_full');\n }\n this.queue.push(event);\n // Start the flush timer lazily on first enqueue.\n if (this.flushTimer === null) {\n this.flushTimer = setInterval(() => {\n this.flushQueue().catch(() => {\n // Errors are handled inside flushQueue; this prevents\n // unhandled promise rejection from the interval callback.\n });\n }, this.config.flushIntervalMs);\n }\n // Flush immediately if the batch size threshold is reached.\n if (this.queue.length >= this.config.maxBatchSize) {\n this.flushQueue().catch(() => { });\n }\n return true;\n }\n flushQueue() {\n if (this.flushPromise !== null || this.queue.length === 0)\n return Promise.resolve();\n // Drain the queue into a local batch atomically. Any events captured\n // during the flush go into the next batch.\n const batch = this.queue.splice(0, this.queue.length);\n this.flushPromise = this.sendBatchWithRetry(batch)\n .catch(() => {\n // All retries exhausted — notify caller via onDropped.\n this.config.onDropped?.(batch, 'send_failed');\n })\n .finally(() => {\n this.flushPromise = null;\n });\n return this.flushPromise;\n }\n async sendBatchWithRetry(batch) {\n const url = new URL('logs/batch', this.baseUrl);\n const body = JSON.stringify(batch.map((ev) => ev.toObject()));\n let lastError;\n for (let attempt = 0; attempt <= this.config.retryDelaysMs.length; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body,\n });\n // 401/403 — bad key, do not retry, surface immediately.\n if (response.status === 401 || response.status === 403) {\n this.config.onDropped?.(batch, `auth_error_${response.status}`);\n return;\n }\n if (response.ok)\n return;\n // Non-2xx that isn't an auth error — retry.\n lastError = new Error(`Server returned ${response.status}`);\n }\n catch (err) {\n // Network error — retry.\n lastError = err;\n }\n // Wait before the next attempt, unless this was the last one.\n if (attempt < this.config.retryDelaysMs.length) {\n await this.sleep(this.config.retryDelaysMs[attempt]);\n }\n }\n throw lastError;\n }\n}\n//# sourceMappingURL=client.js.map","import { CreateLogwolfEventDTOSchema } from './schema';\nexport class LogwolfEvent {\n random = Math.random();\n start = performance.now();\n createdAt = new Date();\n name;\n severity;\n tags;\n data = {};\n _duration = null;\n constructor(props) {\n this.name = props.name;\n this.severity = props.severity;\n this.tags = props.tags;\n if (props.data) {\n this.data = props.data;\n }\n }\n /**\n * Stops the stopwatch. Duration is frozen from construction to this call.\n * Called automatically by `capture()` and `create()` — you only need to\n * call this manually if you want to stop the clock before those methods.\n *\n * Calling `stop()` more than once is a no-op; the first call wins.\n */\n stop() {\n if (this._duration === null) {\n this._duration = Math.floor(performance.now() - this.start);\n }\n }\n setName(n) {\n this.name = n;\n }\n setSeverity(s) {\n this.severity = s;\n }\n set(key, value) {\n this.data[key] = value;\n }\n get(key) {\n return this.data[key];\n }\n addTag(t) {\n this.tags.push(t);\n }\n toObject() {\n const duration = this._duration ?? Math.floor(performance.now() - this.start);\n const encoded = CreateLogwolfEventDTOSchema.encode({\n name: this.name,\n severity: this.severity,\n tags: Array.from(new Set(this.tags)),\n data: this.data,\n duration: duration,\n });\n return encoded;\n }\n}\n//# sourceMappingURL=event.js.map"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,54 +1,55 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@logwolf/client-js",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "JavaScript client for Logwolf",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"logwolf"
|
|
7
|
-
],
|
|
8
|
-
"homepage": "https://github.com/jpricardo/logwolf#readme",
|
|
9
|
-
"bugs": {
|
|
10
|
-
"url": "https://github.com/jpricardo/logwolf/issues"
|
|
11
|
-
},
|
|
12
|
-
"license": "ISC",
|
|
13
|
-
"author": "jpricardo",
|
|
14
|
-
"repository": {
|
|
15
|
-
"type": "git",
|
|
16
|
-
"url": "git+https://github.com/jpricardo/logwolf.git"
|
|
17
|
-
},
|
|
18
|
-
"directories": {
|
|
19
|
-
"lib": "lib"
|
|
20
|
-
},
|
|
21
|
-
"files": [
|
|
22
|
-
"./dist/logwolf-client.d.ts",
|
|
23
|
-
"./dist/logwolf-client.js",
|
|
24
|
-
"./dist/logwolf-client.js.map"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"lint
|
|
36
|
-
"
|
|
37
|
-
"format
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"@
|
|
45
|
-
"@
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"rollup
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@logwolf/client-js",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "JavaScript client for Logwolf",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"logwolf"
|
|
7
|
+
],
|
|
8
|
+
"homepage": "https://github.com/jpricardo/logwolf#readme",
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/jpricardo/logwolf/issues"
|
|
11
|
+
},
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"author": "jpricardo",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/jpricardo/logwolf.git"
|
|
17
|
+
},
|
|
18
|
+
"directories": {
|
|
19
|
+
"lib": "lib"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"./dist/logwolf-client.d.ts",
|
|
23
|
+
"./dist/logwolf-client.js",
|
|
24
|
+
"./dist/logwolf-client.js.map",
|
|
25
|
+
"CHANGELOG.md"
|
|
26
|
+
],
|
|
27
|
+
"type": "module",
|
|
28
|
+
"main": "./dist/logwolf-client.js",
|
|
29
|
+
"types": "./dist/logwolf-client.d.ts",
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc && rollup -c",
|
|
32
|
+
"test": "vitest",
|
|
33
|
+
"coverage": "vitest run --coverage",
|
|
34
|
+
"prepublishOnly": "npm run build",
|
|
35
|
+
"lint": "oxlint",
|
|
36
|
+
"lint:fix": "oxlint --fix",
|
|
37
|
+
"format": "oxfmt",
|
|
38
|
+
"format:check": "oxfmt --check"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"zod": "^4.3.6"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@rollup/plugin-typescript": "12.3.0",
|
|
45
|
+
"@types/node": "24",
|
|
46
|
+
"@vitest/coverage-v8": "4.1.4",
|
|
47
|
+
"oxfmt": "0.45.0",
|
|
48
|
+
"oxlint": "1.60.0",
|
|
49
|
+
"rollup": "4.60.1",
|
|
50
|
+
"rollup-plugin-dts": "^6.4.1",
|
|
51
|
+
"tslib": "^2.8.1",
|
|
52
|
+
"typescript": "6.0.3",
|
|
53
|
+
"vitest": "4.1.4"
|
|
54
|
+
}
|
|
55
|
+
}
|