@logdash/node 1.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/.changeset/README.md +8 -0
- package/.changeset/config.json +11 -0
- package/.editorconfig +13 -0
- package/.github/workflows/build-and-publish.yml +39 -0
- package/.github/workflows/ci.yml +36 -0
- package/.prettierignore +12 -0
- package/.prettierrc +12 -0
- package/CHANGELOG.md +146 -0
- package/LICENSE.md +21 -0
- package/README.md +81 -0
- package/dist/Logdash.d.ts +36 -0
- package/dist/Logdash.d.ts.map +1 -0
- package/dist/Logdash.js +145 -0
- package/dist/Logdash.js.map +1 -0
- package/dist/__tests__/HttpTransport.test.d.ts +2 -0
- package/dist/__tests__/HttpTransport.test.d.ts.map +1 -0
- package/dist/__tests__/HttpTransport.test.js +148 -0
- package/dist/__tests__/HttpTransport.test.js.map +1 -0
- package/dist/__tests__/Logdash.test.d.ts +2 -0
- package/dist/__tests__/Logdash.test.d.ts.map +1 -0
- package/dist/__tests__/Logdash.test.js +131 -0
- package/dist/__tests__/Logdash.test.js.map +1 -0
- package/dist/__tests__/RequestQueue.test.d.ts +2 -0
- package/dist/__tests__/RequestQueue.test.d.ts.map +1 -0
- package/dist/__tests__/RequestQueue.test.js +129 -0
- package/dist/__tests__/RequestQueue.test.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/internalLogger.d.ts +7 -0
- package/dist/logger/internalLogger.d.ts.map +1 -0
- package/dist/logger/internalLogger.js +17 -0
- package/dist/logger/internalLogger.js.map +1 -0
- package/dist/queue/RequestQueue.d.ts +24 -0
- package/dist/queue/RequestQueue.d.ts.map +1 -0
- package/dist/queue/RequestQueue.js +87 -0
- package/dist/queue/RequestQueue.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +28 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +37 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/types/LogLevel.d.ts +10 -0
- package/dist/types/LogLevel.d.ts.map +1 -0
- package/dist/types/LogLevel.js +11 -0
- package/dist/types/LogLevel.js.map +1 -0
- package/docs/delta.png +0 -0
- package/docs/logs.png +0 -0
- package/package.json +49 -0
- package/test.ts +32 -0
- package/tsconfig.json +20 -0
- package/tsconfig.lib.json +29 -0
- package/vite.config.ts +8 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface HttpTransportOptions {
|
|
2
|
+
host: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class HttpTransport {
|
|
7
|
+
private readonly host;
|
|
8
|
+
private readonly apiKey;
|
|
9
|
+
private readonly timeoutMs;
|
|
10
|
+
constructor(options: HttpTransportOptions);
|
|
11
|
+
sendLogs(logs: LogPayload[]): Promise<void>;
|
|
12
|
+
sendMetrics(metrics: MetricPayload[]): Promise<void>;
|
|
13
|
+
private request;
|
|
14
|
+
}
|
|
15
|
+
export interface LogPayload {
|
|
16
|
+
message: string;
|
|
17
|
+
level: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
sequenceNumber: number;
|
|
20
|
+
namespace?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface MetricPayload {
|
|
23
|
+
name: string;
|
|
24
|
+
value: number;
|
|
25
|
+
operation: 'set' | 'change';
|
|
26
|
+
namespace?: string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=HttpTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpTransport.d.ts","sourceRoot":"","sources":["../../src/transport/HttpTransport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;IAMnC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAO5C,OAAO;CA4BrB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const DEFAULT_TIMEOUT_MS = 10000;
|
|
2
|
+
export class HttpTransport {
|
|
3
|
+
constructor(options) {
|
|
4
|
+
this.host = options.host;
|
|
5
|
+
this.apiKey = options.apiKey;
|
|
6
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
7
|
+
}
|
|
8
|
+
async sendLogs(logs) {
|
|
9
|
+
await this.request('POST', '/logs/batch', { logs });
|
|
10
|
+
}
|
|
11
|
+
async sendMetrics(metrics) {
|
|
12
|
+
// Send metrics one by one since the API expects single metric updates
|
|
13
|
+
await Promise.all(metrics.map((metric) => this.request('PUT', '/metrics', metric)));
|
|
14
|
+
}
|
|
15
|
+
async request(method, path, body) {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch(`${this.host}${path}`, {
|
|
20
|
+
method,
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
'project-api-key': this.apiKey,
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify(body),
|
|
26
|
+
signal: controller.signal,
|
|
27
|
+
});
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
clearTimeout(timeoutId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=HttpTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpTransport.js","sourceRoot":"","sources":["../../src/transport/HttpTransport.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,MAAM,OAAO,aAAa;IAKzB,YAAY,OAA6B;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAkB;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAwB;QACzC,sEAAsE;QACtE,MAAM,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACpB,MAAsB,EACtB,IAAY,EACZ,IAAa;QAEb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE;gBACnD,MAAM;gBACN,OAAO,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,iBAAiB,EAAE,IAAI,CAAC,MAAM;iBAC9B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;aACzB,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACd,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CACjD,CAAC;YACH,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogLevel.d.ts","sourceRoot":"","sources":["../../src/types/LogLevel.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IACnB,KAAK,UAAU;IACf,IAAI,YAAY;IAChB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CACf"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export var LogLevel;
|
|
2
|
+
(function (LogLevel) {
|
|
3
|
+
LogLevel["ERROR"] = "error";
|
|
4
|
+
LogLevel["WARN"] = "warning";
|
|
5
|
+
LogLevel["INFO"] = "info";
|
|
6
|
+
LogLevel["HTTP"] = "http";
|
|
7
|
+
LogLevel["VERBOSE"] = "verbose";
|
|
8
|
+
LogLevel["DEBUG"] = "debug";
|
|
9
|
+
LogLevel["SILLY"] = "silly";
|
|
10
|
+
})(LogLevel || (LogLevel = {}));
|
|
11
|
+
//# sourceMappingURL=LogLevel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogLevel.js","sourceRoot":"","sources":["../../src/types/LogLevel.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAQX;AARD,WAAY,QAAQ;IACnB,2BAAe,CAAA;IACf,4BAAgB,CAAA;IAChB,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,2BAAe,CAAA;IACf,2BAAe,CAAA;AAChB,CAAC,EARW,QAAQ,KAAR,QAAQ,QAQnB"}
|
package/docs/delta.png
ADDED
|
Binary file
|
package/docs/logs.png
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@logdash/node",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "How solo founders keep their SaaS apps healthy.",
|
|
6
|
+
"author": "Logdash Team <logdash.contact@gmail.com>",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/logdash-io/node-sdk.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/logdash-io/node-sdk",
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@changesets/cli": "^2.29.8",
|
|
15
|
+
"@swc/core": "^1.15.6",
|
|
16
|
+
"@types/node": "^25.0.3",
|
|
17
|
+
"prettier": "^3.7.4",
|
|
18
|
+
"typescript": "5.9.3",
|
|
19
|
+
"vitest": "^4.0.16"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/logdash-io/node-sdk/issues"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"module": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"keywords": [
|
|
32
|
+
"observability",
|
|
33
|
+
"monitoring",
|
|
34
|
+
"logging",
|
|
35
|
+
"tracing",
|
|
36
|
+
"metrics"
|
|
37
|
+
],
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"chalk": "^5.6.2"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.lib.json",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"test:watch": "vitest",
|
|
45
|
+
"release": "pnpm build && changeset publish",
|
|
46
|
+
"changeset": "changeset",
|
|
47
|
+
"version-packages": "changeset version"
|
|
48
|
+
}
|
|
49
|
+
}
|
package/test.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// npx ts-node test.ts
|
|
2
|
+
import { Logdash } from './dist/index';
|
|
3
|
+
|
|
4
|
+
// Basic usage without API key (logs to console only, queues but won't send)
|
|
5
|
+
const logdash = new Logdash();
|
|
6
|
+
|
|
7
|
+
logdash.error('This is an error message');
|
|
8
|
+
logdash.warn('This is a warning message');
|
|
9
|
+
logdash.info('This is an info message');
|
|
10
|
+
logdash.http('This is an http message');
|
|
11
|
+
logdash.verbose('This is a verbose message');
|
|
12
|
+
logdash.debug('This is a debug message');
|
|
13
|
+
logdash.silly('This is a silly message');
|
|
14
|
+
|
|
15
|
+
// Usage with API key
|
|
16
|
+
const syncedLogdash = new Logdash('MY_API_KEY');
|
|
17
|
+
|
|
18
|
+
syncedLogdash.error('This is a SYNCED error message');
|
|
19
|
+
|
|
20
|
+
// Namespaced logging
|
|
21
|
+
const authLogger = syncedLogdash.withNamespace('auth');
|
|
22
|
+
authLogger.info('User logged in');
|
|
23
|
+
authLogger.setMetric('login_count', 1);
|
|
24
|
+
|
|
25
|
+
// Metrics
|
|
26
|
+
syncedLogdash.setMetric('active_users', 42);
|
|
27
|
+
syncedLogdash.mutateMetric('requests', 1);
|
|
28
|
+
|
|
29
|
+
// Graceful shutdown - wait for all pending items
|
|
30
|
+
syncedLogdash.flush().then(() => {
|
|
31
|
+
console.log('All logs and metrics flushed!');
|
|
32
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": [],
|
|
3
|
+
"include": [],
|
|
4
|
+
"references": [
|
|
5
|
+
{
|
|
6
|
+
"path": "./tsconfig.lib.json"
|
|
7
|
+
}
|
|
8
|
+
],
|
|
9
|
+
"compilerOptions": {
|
|
10
|
+
"rootDir": ".",
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"strict": false,
|
|
13
|
+
"noImplicitOverride": true,
|
|
14
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
15
|
+
"noImplicitReturns": true,
|
|
16
|
+
"noFallthroughCasesInSwitch": true,
|
|
17
|
+
"experimentalDecorators": true,
|
|
18
|
+
"emitDecoratorMetadata": true,
|
|
19
|
+
},
|
|
20
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"esModuleInterop": true,
|
|
5
|
+
"skipLibCheck": true,
|
|
6
|
+
"target": "ES2020",
|
|
7
|
+
"allowJs": true,
|
|
8
|
+
"resolveJsonModule": true,
|
|
9
|
+
"moduleDetection": "force",
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"strict": false,
|
|
12
|
+
"noUncheckedIndexedAccess": true,
|
|
13
|
+
"noImplicitOverride": true,
|
|
14
|
+
"module": "NodeNext",
|
|
15
|
+
"moduleResolution": "NodeNext",
|
|
16
|
+
"outDir": "dist",
|
|
17
|
+
"rootDir": "src",
|
|
18
|
+
"sourceMap": true,
|
|
19
|
+
"declaration": true,
|
|
20
|
+
"declarationMap": true
|
|
21
|
+
},
|
|
22
|
+
"exclude": [
|
|
23
|
+
"src/**/*.spec.ts",
|
|
24
|
+
"node_modules/**/*"
|
|
25
|
+
],
|
|
26
|
+
"include": [
|
|
27
|
+
"src/**/*.ts"
|
|
28
|
+
]
|
|
29
|
+
}
|