@meistrari/audit-sdk 0.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.
@@ -0,0 +1,33 @@
1
+ export type AuditOrigin = 'api' | 'worker' | 'ui';
2
+ export interface AuditEvent {
3
+ action: string;
4
+ object_type: string;
5
+ object_id?: string;
6
+ origin: AuditOrigin;
7
+ actor_type?: 'user' | 'system' | 'api_key';
8
+ correlation_id?: string;
9
+ ip_address?: string;
10
+ user_agent?: string;
11
+ occurred_at?: string;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ export interface AuditClientConfig {
15
+ baseUrl: string;
16
+ timeoutMs?: number;
17
+ maxRetries?: number;
18
+ }
19
+ export declare class AuditClient {
20
+ private baseUrl;
21
+ private timeoutMs;
22
+ private maxRetries;
23
+ constructor(config: AuditClientConfig);
24
+ track(dataToken: string, event: AuditEvent): Promise<void>;
25
+ trackMany(dataToken: string, events: AuditEvent[]): Promise<void>;
26
+ private logFailure;
27
+ private sleep;
28
+ }
29
+ export declare class AuditError extends Error {
30
+ details?: unknown | undefined;
31
+ constructor(message: string, details?: unknown | undefined);
32
+ }
33
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,iBAAiB;IAM/B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CvE,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,KAAK;CAGd;AAED,qBAAa,UAAW,SAAQ,KAAK;IACC,OAAO,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,OAAO,YAAA;CAItD"}
package/dist/client.js ADDED
@@ -0,0 +1,70 @@
1
+ export class AuditClient {
2
+ constructor(config) {
3
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
4
+ this.timeoutMs = config.timeoutMs ?? 5000;
5
+ this.maxRetries = config.maxRetries ?? 3;
6
+ }
7
+ async track(dataToken, event) {
8
+ await this.trackMany(dataToken, [event]);
9
+ }
10
+ async trackMany(dataToken, events) {
11
+ let lastError;
12
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
13
+ try {
14
+ const response = await fetch(`${this.baseUrl}/v1/events`, {
15
+ method: 'POST',
16
+ headers: {
17
+ Authorization: `Bearer ${dataToken}`,
18
+ 'Content-Type': 'application/json',
19
+ },
20
+ body: JSON.stringify({ events }),
21
+ signal: AbortSignal.timeout(this.timeoutMs),
22
+ });
23
+ if (response.ok || response.status === 202) {
24
+ return;
25
+ }
26
+ if (response.status === 429) {
27
+ const retryAfter = Number(response.headers.get('Retry-After') ?? '5');
28
+ await this.sleep(retryAfter * 1000);
29
+ continue;
30
+ }
31
+ if (response.status >= 400 && response.status < 500) {
32
+ const body = await response.json().catch(() => ({}));
33
+ throw new AuditError(`Client error: ${response.status}`, body);
34
+ }
35
+ lastError = new Error(`Server error: ${response.status}`);
36
+ }
37
+ catch (error) {
38
+ if (error instanceof AuditError) {
39
+ throw error;
40
+ }
41
+ lastError = error;
42
+ }
43
+ await this.sleep(Math.pow(2, attempt) * 1000);
44
+ }
45
+ this.logFailure(events, lastError);
46
+ }
47
+ logFailure(events, error) {
48
+ const payload = {
49
+ level: 'error',
50
+ service: 'audit-sdk',
51
+ message: 'Failed to send audit events after retries',
52
+ event_count: events.length,
53
+ actions: events.map((event) => event.action),
54
+ object_types: events.map((event) => event.object_type),
55
+ error: error?.message,
56
+ timestamp: new Date().toISOString(),
57
+ };
58
+ console.error(JSON.stringify(payload));
59
+ }
60
+ sleep(ms) {
61
+ return new Promise((resolve) => setTimeout(resolve, ms));
62
+ }
63
+ }
64
+ export class AuditError extends Error {
65
+ constructor(message, details) {
66
+ super(message);
67
+ this.details = details;
68
+ this.name = 'AuditError';
69
+ }
70
+ }
@@ -0,0 +1,2 @@
1
+ export * from './client';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './client';
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@meistrari/audit-sdk",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "description": "",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/meistrari/audit-service.git"
10
+ },
11
+ "types": "dist/index.d.ts",
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.json",
17
+ "postinstall": "mise-en-place postinstall",
18
+ "clean": "rm -rf dist"
19
+ },
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
23
+ "devDependencies": {
24
+ "@meistrari/mise-en-place": "2.10.2",
25
+ "typescript": "^5.3.3"
26
+ },
27
+ "dependencies": {
28
+ "@meistrari/logger": "2.1.3"
29
+ }
30
+ }