@observa/sdk 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/README.md +20 -0
- package/dist/apis/ingestApi.d.ts +18 -0
- package/dist/apis/ingestApi.d.ts.map +1 -0
- package/dist/apis/ingestApi.js +27 -0
- package/dist/apis/ingestApi.js.map +1 -0
- package/dist/apis/uptimeApi.d.ts +30 -0
- package/dist/apis/uptimeApi.d.ts.map +1 -0
- package/dist/apis/uptimeApi.js +57 -0
- package/dist/apis/uptimeApi.js.map +1 -0
- package/dist/domain/ingest.d.ts +52 -0
- package/dist/domain/ingest.d.ts.map +1 -0
- package/dist/domain/ingest.js +2 -0
- package/dist/domain/ingest.js.map +1 -0
- package/dist/domain/uptime.d.ts +84 -0
- package/dist/domain/uptime.d.ts.map +1 -0
- package/dist/domain/uptime.js +2 -0
- package/dist/domain/uptime.js.map +1 -0
- package/dist/http/errors.d.ts +73 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +90 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/http/httpClient.d.ts +131 -0
- package/dist/http/httpClient.d.ts.map +1 -0
- package/dist/http/httpClient.js +235 -0
- package/dist/http/httpClient.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk.d.ts +51 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +46 -0
- package/dist/sdk.js.map +1 -0
- package/dist/utils/validate.d.ts +9 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +18 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# observa-sdk-node
|
|
2
|
+
|
|
3
|
+
To install dependencies:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
bun install
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
To run:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bun run index.ts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This project was created using `bun init` in bun v1.2.20. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
|
|
16
|
+
|
|
17
|
+
## SDK Contract
|
|
18
|
+
|
|
19
|
+
This SDK is an official client for the Observa backend.
|
|
20
|
+
It targets a fixed API and does not support custom base URLs.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IngestRequest, IngestResponse } from '../domain/ingest';
|
|
2
|
+
import type { HttpClient } from '../http/httpClient';
|
|
3
|
+
/**
|
|
4
|
+
* Event ingestion API.
|
|
5
|
+
*/
|
|
6
|
+
export declare class IngestApi {
|
|
7
|
+
private readonly http;
|
|
8
|
+
private readonly defaultDsnKey?;
|
|
9
|
+
/**
|
|
10
|
+
* Creates the ingestion client with an optional default DSN.
|
|
11
|
+
*/
|
|
12
|
+
constructor(http: HttpClient, defaultDsnKey?: string | undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Sends an event to the ingestion backend.
|
|
15
|
+
*/
|
|
16
|
+
event(input: IngestRequest): Promise<IngestResponse>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ingestApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestApi.d.ts","sourceRoot":"","sources":["../../src/apis/ingestApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;GAEG;AACH,qBAAa,SAAS;IAIN,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAc,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAH9E;;OAEG;gBAC0B,IAAI,EAAE,UAAU,EAAmB,aAAa,CAAC,EAAE,MAAM,YAAA;IAEtF;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAQ7D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ensureDefined, ensureNonEmpty } from '../utils/validate';
|
|
2
|
+
/**
|
|
3
|
+
* Event ingestion API.
|
|
4
|
+
*/
|
|
5
|
+
export class IngestApi {
|
|
6
|
+
http;
|
|
7
|
+
defaultDsnKey;
|
|
8
|
+
/**
|
|
9
|
+
* Creates the ingestion client with an optional default DSN.
|
|
10
|
+
*/
|
|
11
|
+
constructor(http, defaultDsnKey) {
|
|
12
|
+
this.http = http;
|
|
13
|
+
this.defaultDsnKey = defaultDsnKey;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Sends an event to the ingestion backend.
|
|
17
|
+
*/
|
|
18
|
+
async event(input) {
|
|
19
|
+
ensureDefined(input, 'input');
|
|
20
|
+
const dsnKey = input.dsnKey ?? this.defaultDsnKey;
|
|
21
|
+
ensureDefined(dsnKey, 'dsnKey');
|
|
22
|
+
ensureNonEmpty(dsnKey, 'dsnKey');
|
|
23
|
+
ensureDefined(input.event, 'event');
|
|
24
|
+
return this.http.post('/ingest/events', { ...input, dsnKey }, { auth: 'apiKey' });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ingestApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestApi.js","sourceRoot":"","sources":["../../src/apis/ingestApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGjE;;GAEG;AACH,MAAM,OAAO,SAAS;IAIW;IAAmC;IAHhE;;OAEG;IACH,YAA6B,IAAgB,EAAmB,aAAsB;QAAzD,SAAI,GAAJ,IAAI,CAAY;QAAmB,kBAAa,GAAb,aAAa,CAAS;IAAI,CAAC;IAE3F;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAAoB;QAC5B,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAA;QACjD,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC/B,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAChC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAiB,gBAAgB,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrG,CAAC;CACJ"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { UptimeEvent, UptimeHeartbeatInput, UptimeSummary } from '../domain/uptime';
|
|
2
|
+
import type { HttpClient } from '../http/httpClient';
|
|
3
|
+
/**
|
|
4
|
+
* Uptime API for heartbeats and public reads.
|
|
5
|
+
*/
|
|
6
|
+
export declare class UptimeApi {
|
|
7
|
+
private readonly http;
|
|
8
|
+
private readonly defaultDsnKey?;
|
|
9
|
+
/**
|
|
10
|
+
* Creates the uptime client with an optional default DSN.
|
|
11
|
+
*/
|
|
12
|
+
constructor(http: HttpClient, defaultDsnKey?: string | undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Records an uptime heartbeat.
|
|
15
|
+
*/
|
|
16
|
+
recordHeartbeat(input: UptimeHeartbeatInput): Promise<UptimeEvent>;
|
|
17
|
+
/**
|
|
18
|
+
* Lists a project's daily uptime history.
|
|
19
|
+
*/
|
|
20
|
+
history(projectId: string, date: string): Promise<UptimeEvent[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Gets the latest uptime event for a project.
|
|
23
|
+
*/
|
|
24
|
+
latest(projectId: string): Promise<UptimeEvent | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Summarizes daily uptime.
|
|
27
|
+
*/
|
|
28
|
+
summary(projectId: string, days?: number, delayThresholdMinutes?: number): Promise<UptimeSummary[]>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=uptimeApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptimeApi.d.ts","sourceRoot":"","sources":["../../src/apis/uptimeApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAExF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;GAEG;AACH,qBAAa,SAAS;IAIN,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAc,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAH9E;;OAEG;gBAC0B,IAAI,EAAE,UAAU,EAAmB,aAAa,CAAC,EAAE,MAAM,YAAA;IAEtF;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IASxE;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAStE;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO5D;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAO5G"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ensureDefined, ensureNonEmpty } from '../utils/validate';
|
|
2
|
+
/**
|
|
3
|
+
* Uptime API for heartbeats and public reads.
|
|
4
|
+
*/
|
|
5
|
+
export class UptimeApi {
|
|
6
|
+
http;
|
|
7
|
+
defaultDsnKey;
|
|
8
|
+
/**
|
|
9
|
+
* Creates the uptime client with an optional default DSN.
|
|
10
|
+
*/
|
|
11
|
+
constructor(http, defaultDsnKey) {
|
|
12
|
+
this.http = http;
|
|
13
|
+
this.defaultDsnKey = defaultDsnKey;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Records an uptime heartbeat.
|
|
17
|
+
*/
|
|
18
|
+
async recordHeartbeat(input) {
|
|
19
|
+
ensureDefined(input, 'input');
|
|
20
|
+
const dsnKey = input.dsnKey ?? this.defaultDsnKey;
|
|
21
|
+
ensureDefined(dsnKey, 'dsnKey');
|
|
22
|
+
ensureNonEmpty(dsnKey, 'dsnKey');
|
|
23
|
+
ensureNonEmpty(input.status, 'status');
|
|
24
|
+
return this.http.post('/uptime/heartbeats', { ...input, dsnKey }, { auth: 'apiKey' });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Lists a project's daily uptime history.
|
|
28
|
+
*/
|
|
29
|
+
async history(projectId, date) {
|
|
30
|
+
ensureNonEmpty(projectId, 'projectId');
|
|
31
|
+
ensureNonEmpty(date, 'date');
|
|
32
|
+
return this.http.get(`/projects/${encodeURIComponent(projectId)}/uptime/history`, {
|
|
33
|
+
query: { date },
|
|
34
|
+
auth: 'none',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets the latest uptime event for a project.
|
|
39
|
+
*/
|
|
40
|
+
async latest(projectId) {
|
|
41
|
+
ensureNonEmpty(projectId, 'projectId');
|
|
42
|
+
return this.http.get(`/projects/${encodeURIComponent(projectId)}/uptime/latest`, {
|
|
43
|
+
auth: 'none',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Summarizes daily uptime.
|
|
48
|
+
*/
|
|
49
|
+
async summary(projectId, days, delayThresholdMinutes) {
|
|
50
|
+
ensureNonEmpty(projectId, 'projectId');
|
|
51
|
+
return this.http.get(`/projects/${encodeURIComponent(projectId)}/uptime/summary`, {
|
|
52
|
+
query: { days, delayThresholdMinutes },
|
|
53
|
+
auth: 'none',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=uptimeApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptimeApi.js","sourceRoot":"","sources":["../../src/apis/uptimeApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGjE;;GAEG;AACH,MAAM,OAAO,SAAS;IAIW;IAAmC;IAHhE;;OAEG;IACH,YAA6B,IAAgB,EAAmB,aAAsB;QAAzD,SAAI,GAAJ,IAAI,CAAY;QAAmB,kBAAa,GAAb,aAAa,CAAS;IAAI,CAAC;IAE3F;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,KAA2B;QAC7C,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAA;QACjD,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC/B,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAChC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAc,oBAAoB,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IACtG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,IAAY;QACzC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACtC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,aAAa,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC7F,KAAK,EAAE,EAAE,IAAI,EAAE;YACf,IAAI,EAAE,MAAM;SACf,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC1B,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,aAAa,kBAAkB,CAAC,SAAS,CAAC,gBAAgB,EAAE;YACjG,IAAI,EAAE,MAAM;SACf,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,IAAa,EAAE,qBAA8B;QAC1E,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,aAAa,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC/F,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACtC,IAAI,EAAE,MAAM;SACf,CAAC,CAAA;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Severity levels for events.
|
|
3
|
+
*/
|
|
4
|
+
export type IngestLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
5
|
+
/**
|
|
6
|
+
* Ingestion event.
|
|
7
|
+
*/
|
|
8
|
+
export type IngestEvent = {
|
|
9
|
+
/**
|
|
10
|
+
* Unique event identifier.
|
|
11
|
+
*/
|
|
12
|
+
event_id?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Event ISO timestamp.
|
|
15
|
+
*/
|
|
16
|
+
timestamp?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Severity level.
|
|
19
|
+
*/
|
|
20
|
+
level?: IngestLevel;
|
|
21
|
+
/**
|
|
22
|
+
* Main message.
|
|
23
|
+
*/
|
|
24
|
+
message?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Free-form context payload.
|
|
27
|
+
*/
|
|
28
|
+
payload?: unknown;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Payload for sending an event to the backend.
|
|
32
|
+
*/
|
|
33
|
+
export type IngestRequest = {
|
|
34
|
+
/**
|
|
35
|
+
* Project DSN. Uses the SDK default when omitted.
|
|
36
|
+
*/
|
|
37
|
+
dsnKey?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Event to record.
|
|
40
|
+
*/
|
|
41
|
+
event: IngestEvent;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Response after sending an event.
|
|
45
|
+
*/
|
|
46
|
+
export type IngestResponse = {
|
|
47
|
+
/**
|
|
48
|
+
* Assigned event identifier.
|
|
49
|
+
*/
|
|
50
|
+
event_id: string;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/domain/ingest.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAEvE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,KAAK,EAAE,WAAW,CAAA;CACrB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/domain/ingest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Possible uptime statuses.
|
|
3
|
+
*/
|
|
4
|
+
export type UptimeStatus = 'up' | 'down' | 'degraded';
|
|
5
|
+
/**
|
|
6
|
+
* Recorded uptime event.
|
|
7
|
+
*/
|
|
8
|
+
export type UptimeEvent = {
|
|
9
|
+
/**
|
|
10
|
+
* Event identifier.
|
|
11
|
+
*/
|
|
12
|
+
id: string;
|
|
13
|
+
/**
|
|
14
|
+
* Project the event belongs to.
|
|
15
|
+
*/
|
|
16
|
+
projectId: string;
|
|
17
|
+
/**
|
|
18
|
+
* Uptime status.
|
|
19
|
+
*/
|
|
20
|
+
status: UptimeStatus;
|
|
21
|
+
/**
|
|
22
|
+
* Optional message for the event.
|
|
23
|
+
*/
|
|
24
|
+
message?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Response time in milliseconds.
|
|
27
|
+
*/
|
|
28
|
+
responseTimeMs?: number;
|
|
29
|
+
/**
|
|
30
|
+
* ISO timestamp of the check.
|
|
31
|
+
*/
|
|
32
|
+
checkedAt?: string;
|
|
33
|
+
/**
|
|
34
|
+
* ISO timestamp of backend creation.
|
|
35
|
+
*/
|
|
36
|
+
createdAt?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Payload for sending an uptime heartbeat.
|
|
40
|
+
*/
|
|
41
|
+
export type UptimeHeartbeatInput = {
|
|
42
|
+
/**
|
|
43
|
+
* Project DSN. Uses the SDK default when omitted.
|
|
44
|
+
*/
|
|
45
|
+
dsnKey?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Reported status.
|
|
48
|
+
*/
|
|
49
|
+
status: UptimeStatus;
|
|
50
|
+
/**
|
|
51
|
+
* Response time in milliseconds.
|
|
52
|
+
*/
|
|
53
|
+
responseTimeMs?: number;
|
|
54
|
+
/**
|
|
55
|
+
* ISO timestamp of the check.
|
|
56
|
+
*/
|
|
57
|
+
checkedAt?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Optional message.
|
|
60
|
+
*/
|
|
61
|
+
message?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Daily uptime summary.
|
|
65
|
+
*/
|
|
66
|
+
export type UptimeSummary = {
|
|
67
|
+
/**
|
|
68
|
+
* ISO date of the summary.
|
|
69
|
+
*/
|
|
70
|
+
date: string;
|
|
71
|
+
/**
|
|
72
|
+
* Hours without data.
|
|
73
|
+
*/
|
|
74
|
+
missingHours?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Accumulated delay minutes.
|
|
77
|
+
*/
|
|
78
|
+
delayMinutes?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Number of delayed events.
|
|
81
|
+
*/
|
|
82
|
+
delayedCount?: number;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=uptime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptime.d.ts","sourceRoot":"","sources":["../../src/domain/uptime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAA;AAErD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,EAAE,YAAY,CAAA;IACpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,MAAM,EAAE,YAAY,CAAA;IACpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptime.js","sourceRoot":"","sources":["../../src/domain/uptime.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Additional data to enrich SDK errors.
|
|
3
|
+
*/
|
|
4
|
+
export type ErrorDetails = {
|
|
5
|
+
status?: number;
|
|
6
|
+
code?: string;
|
|
7
|
+
details?: unknown;
|
|
8
|
+
retryAfter?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Base SDK error.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SdkError extends Error {
|
|
14
|
+
readonly status?: number;
|
|
15
|
+
readonly code?: string;
|
|
16
|
+
readonly details?: unknown;
|
|
17
|
+
/**
|
|
18
|
+
* Creates an error with optional metadata.
|
|
19
|
+
*/
|
|
20
|
+
constructor(message: string, details?: ErrorDetails);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Input validation error.
|
|
24
|
+
*/
|
|
25
|
+
export declare class ValidationError extends SdkError {
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Authentication error.
|
|
29
|
+
*/
|
|
30
|
+
export declare class AuthError extends SdkError {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Error caused by insufficient permissions.
|
|
34
|
+
*/
|
|
35
|
+
export declare class ForbiddenError extends SdkError {
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Error when a resource does not exist.
|
|
39
|
+
*/
|
|
40
|
+
export declare class NotFoundError extends SdkError {
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Error caused by a state conflict.
|
|
44
|
+
*/
|
|
45
|
+
export declare class ConflictError extends SdkError {
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Error caused by rate limiting.
|
|
49
|
+
*/
|
|
50
|
+
export declare class RateLimitError extends SdkError {
|
|
51
|
+
readonly retryAfter?: number;
|
|
52
|
+
constructor(message: string, details?: ErrorDetails);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Server-side error.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ServerError extends SdkError {
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Network error.
|
|
61
|
+
*/
|
|
62
|
+
export declare class NetworkError extends SdkError {
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Request timeout error.
|
|
66
|
+
*/
|
|
67
|
+
export declare class TimeoutError extends SdkError {
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Maps HTTP status codes to typed SDK errors.
|
|
71
|
+
*/
|
|
72
|
+
export declare function mapHttpError(status: number, details?: unknown, retryAfter?: number): SdkError;
|
|
73
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAE1B;;OAEG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAOtD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;CAAI;AACjD;;GAEG;AACH,qBAAa,SAAU,SAAQ,QAAQ;CAAI;AAC3C;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;CAAI;AAChD;;GAEG;AACH,qBAAa,aAAc,SAAQ,QAAQ;CAAI;AAC/C;;GAEG;AACH,qBAAa,aAAc,SAAQ,QAAQ;CAAI;AAC/C;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AACD;;GAEG;AACH,qBAAa,WAAY,SAAQ,QAAQ;CAAI;AAC7C;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;CAAI;AAC9C;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;CAAI;AAE9C;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAU7F"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base SDK error.
|
|
3
|
+
*/
|
|
4
|
+
export class SdkError extends Error {
|
|
5
|
+
status;
|
|
6
|
+
code;
|
|
7
|
+
details;
|
|
8
|
+
/**
|
|
9
|
+
* Creates an error with optional metadata.
|
|
10
|
+
*/
|
|
11
|
+
constructor(message, details) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = new.target.name;
|
|
14
|
+
this.status = details?.status;
|
|
15
|
+
this.code = details?.code;
|
|
16
|
+
this.details = details?.details;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Input validation error.
|
|
21
|
+
*/
|
|
22
|
+
export class ValidationError extends SdkError {
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Authentication error.
|
|
26
|
+
*/
|
|
27
|
+
export class AuthError extends SdkError {
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Error caused by insufficient permissions.
|
|
31
|
+
*/
|
|
32
|
+
export class ForbiddenError extends SdkError {
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Error when a resource does not exist.
|
|
36
|
+
*/
|
|
37
|
+
export class NotFoundError extends SdkError {
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Error caused by a state conflict.
|
|
41
|
+
*/
|
|
42
|
+
export class ConflictError extends SdkError {
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Error caused by rate limiting.
|
|
46
|
+
*/
|
|
47
|
+
export class RateLimitError extends SdkError {
|
|
48
|
+
retryAfter;
|
|
49
|
+
constructor(message, details) {
|
|
50
|
+
super(message, details);
|
|
51
|
+
this.retryAfter = details?.retryAfter;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Server-side error.
|
|
56
|
+
*/
|
|
57
|
+
export class ServerError extends SdkError {
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Network error.
|
|
61
|
+
*/
|
|
62
|
+
export class NetworkError extends SdkError {
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Request timeout error.
|
|
66
|
+
*/
|
|
67
|
+
export class TimeoutError extends SdkError {
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Maps HTTP status codes to typed SDK errors.
|
|
71
|
+
*/
|
|
72
|
+
export function mapHttpError(status, details, retryAfter) {
|
|
73
|
+
const info = { status, details, retryAfter };
|
|
74
|
+
if (status === 400)
|
|
75
|
+
return new ValidationError('Invalid request', info);
|
|
76
|
+
if (status === 401)
|
|
77
|
+
return new AuthError('Unauthorized', info);
|
|
78
|
+
if (status === 403)
|
|
79
|
+
return new ForbiddenError('Forbidden', info);
|
|
80
|
+
if (status === 404)
|
|
81
|
+
return new NotFoundError('Resource not found', info);
|
|
82
|
+
if (status === 409)
|
|
83
|
+
return new ConflictError('Conflict', info);
|
|
84
|
+
if (status === 429)
|
|
85
|
+
return new RateLimitError('Rate limit exceeded', info);
|
|
86
|
+
if (status >= 500)
|
|
87
|
+
return new ServerError('Server error', info);
|
|
88
|
+
return new SdkError('HTTP error', info);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACtB,MAAM,CAAS;IACf,IAAI,CAAS;IACb,OAAO,CAAU;IAE1B;;OAEG;IACH,YAAY,OAAe,EAAE,OAAsB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAA;IACnC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;CAAI;AACjD;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;CAAI;AAC3C;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;CAAI;AAChD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,QAAQ;CAAI;AAC/C;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,QAAQ;CAAI;AAC/C;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC/B,UAAU,CAAS;IAE5B,YAAY,OAAe,EAAE,OAAsB;QAC/C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAA;IACzC,CAAC;CACJ;AACD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;CAAI;AAC7C;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;CAAI;AAC9C;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;CAAI;AAE9C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAiB,EAAE,UAAmB;IAC/E,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;IAC5C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;IACvE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAC9D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAChE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,aAAa,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;IACxE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAC9D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAA;IAC1E,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAC/D,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication mode per request.
|
|
3
|
+
*/
|
|
4
|
+
export type AuthMode = 'apiKey' | 'none';
|
|
5
|
+
/**
|
|
6
|
+
* Supported HTTP methods.
|
|
7
|
+
*/
|
|
8
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
9
|
+
/**
|
|
10
|
+
* Serializable query parameters.
|
|
11
|
+
*/
|
|
12
|
+
export type QueryParams = Record<string, string | number | boolean | undefined>;
|
|
13
|
+
/**
|
|
14
|
+
* Retry policy for transient errors.
|
|
15
|
+
*/
|
|
16
|
+
export type RetryPolicy = {
|
|
17
|
+
/**
|
|
18
|
+
* Number of additional retries.
|
|
19
|
+
*/
|
|
20
|
+
retries: number;
|
|
21
|
+
/**
|
|
22
|
+
* Computes the delay between retries.
|
|
23
|
+
*/
|
|
24
|
+
retryDelayMs?: (attempt: number, response?: Response, error?: unknown) => number;
|
|
25
|
+
/**
|
|
26
|
+
* Determines whether a response or error should be retried.
|
|
27
|
+
*/
|
|
28
|
+
retryOn?: (response?: Response, error?: unknown) => boolean;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Base HTTP client configuration.
|
|
32
|
+
*/
|
|
33
|
+
export type HttpClientOptions = {
|
|
34
|
+
/**
|
|
35
|
+
* Backend base URL.
|
|
36
|
+
*/
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
/**
|
|
39
|
+
* API key used for SDK authentication.
|
|
40
|
+
*/
|
|
41
|
+
apiKey?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Request timeout in milliseconds.
|
|
44
|
+
*/
|
|
45
|
+
timeoutMs?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Global headers.
|
|
48
|
+
*/
|
|
49
|
+
headers?: Record<string, string>;
|
|
50
|
+
/**
|
|
51
|
+
* Retry policy.
|
|
52
|
+
*/
|
|
53
|
+
retry?: RetryPolicy;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Per-request options.
|
|
57
|
+
*/
|
|
58
|
+
export type RequestOptions = {
|
|
59
|
+
method: HttpMethod;
|
|
60
|
+
path: string;
|
|
61
|
+
query?: QueryParams;
|
|
62
|
+
body?: unknown;
|
|
63
|
+
headers?: Record<string, string>;
|
|
64
|
+
/**
|
|
65
|
+
* Defines whether the request requires an apiKey or is public.
|
|
66
|
+
*/
|
|
67
|
+
auth?: AuthMode;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Base HTTP client for the SDK.
|
|
71
|
+
*/
|
|
72
|
+
export declare class HttpClient {
|
|
73
|
+
private apiKey?;
|
|
74
|
+
private readonly baseUrl;
|
|
75
|
+
private readonly timeoutMs;
|
|
76
|
+
private readonly headers;
|
|
77
|
+
private readonly retry?;
|
|
78
|
+
private healthCheckPromise?;
|
|
79
|
+
/**
|
|
80
|
+
* Creates an HTTP client with baseUrl and optional apiKey.
|
|
81
|
+
*/
|
|
82
|
+
constructor(options: HttpClientOptions);
|
|
83
|
+
/**
|
|
84
|
+
* Updates the API key at runtime.
|
|
85
|
+
*/
|
|
86
|
+
setApiKey(apiKey?: string): void;
|
|
87
|
+
startHealthCheck(): void;
|
|
88
|
+
/**
|
|
89
|
+
* GET request.
|
|
90
|
+
*/
|
|
91
|
+
get<T>(path: string, options?: Omit<RequestOptions, 'method' | 'path'>): Promise<T>;
|
|
92
|
+
/**
|
|
93
|
+
* POST request.
|
|
94
|
+
*/
|
|
95
|
+
post<T>(path: string, body?: unknown, options?: Omit<RequestOptions, 'method' | 'path' | 'body'>): Promise<T>;
|
|
96
|
+
/**
|
|
97
|
+
* PUT request.
|
|
98
|
+
*/
|
|
99
|
+
put<T>(path: string, body?: unknown, options?: Omit<RequestOptions, 'method' | 'path' | 'body'>): Promise<T>;
|
|
100
|
+
/**
|
|
101
|
+
* PATCH request.
|
|
102
|
+
*/
|
|
103
|
+
patch<T>(path: string, body?: unknown, options?: Omit<RequestOptions, 'method' | 'path' | 'body'>): Promise<T>;
|
|
104
|
+
/**
|
|
105
|
+
* DELETE request.
|
|
106
|
+
*/
|
|
107
|
+
delete<T>(path: string, options?: Omit<RequestOptions, 'method' | 'path'>): Promise<T>;
|
|
108
|
+
/**
|
|
109
|
+
* Executes a request with retry logic.
|
|
110
|
+
*/
|
|
111
|
+
request<T>(options: RequestOptions): Promise<T>;
|
|
112
|
+
/**
|
|
113
|
+
* Executes a request without retry and returns response + data.
|
|
114
|
+
*/
|
|
115
|
+
private execute;
|
|
116
|
+
/**
|
|
117
|
+
* Builds the final URL with query params.
|
|
118
|
+
*/
|
|
119
|
+
private buildUrl;
|
|
120
|
+
/**
|
|
121
|
+
* Parses the body as JSON when possible.
|
|
122
|
+
*/
|
|
123
|
+
private readBody;
|
|
124
|
+
private checkHealth;
|
|
125
|
+
private parseRetryAfter;
|
|
126
|
+
/**
|
|
127
|
+
* Simple delay for retries.
|
|
128
|
+
*/
|
|
129
|
+
private delay;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=httpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../src/http/httpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { AuthError, NetworkError, TimeoutError, ServerError, mapHttpError } from './errors';
|
|
2
|
+
/**
|
|
3
|
+
* Base HTTP client for the SDK.
|
|
4
|
+
*/
|
|
5
|
+
export class HttpClient {
|
|
6
|
+
apiKey;
|
|
7
|
+
baseUrl;
|
|
8
|
+
timeoutMs;
|
|
9
|
+
headers;
|
|
10
|
+
retry;
|
|
11
|
+
healthCheckPromise;
|
|
12
|
+
/**
|
|
13
|
+
* Creates an HTTP client with baseUrl and optional apiKey.
|
|
14
|
+
*/
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, '');
|
|
17
|
+
this.apiKey = options.apiKey;
|
|
18
|
+
this.timeoutMs = options.timeoutMs ?? 5000;
|
|
19
|
+
this.headers = options.headers ?? {};
|
|
20
|
+
this.retry = options.retry;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Updates the API key at runtime.
|
|
24
|
+
*/
|
|
25
|
+
setApiKey(apiKey) {
|
|
26
|
+
this.apiKey = apiKey;
|
|
27
|
+
}
|
|
28
|
+
startHealthCheck() {
|
|
29
|
+
if (!this.healthCheckPromise) {
|
|
30
|
+
this.healthCheckPromise = this.checkHealth();
|
|
31
|
+
this.healthCheckPromise.catch(() => undefined);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* GET request.
|
|
36
|
+
*/
|
|
37
|
+
async get(path, options) {
|
|
38
|
+
return this.request({ method: 'GET', path, ...options });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* POST request.
|
|
42
|
+
*/
|
|
43
|
+
async post(path, body, options) {
|
|
44
|
+
return this.request({ method: 'POST', path, body, ...options });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PUT request.
|
|
48
|
+
*/
|
|
49
|
+
async put(path, body, options) {
|
|
50
|
+
return this.request({ method: 'PUT', path, body, ...options });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* PATCH request.
|
|
54
|
+
*/
|
|
55
|
+
async patch(path, body, options) {
|
|
56
|
+
return this.request({ method: 'PATCH', path, body, ...options });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* DELETE request.
|
|
60
|
+
*/
|
|
61
|
+
async delete(path, options) {
|
|
62
|
+
return this.request({ method: 'DELETE', path, ...options });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Executes a request with retry logic.
|
|
66
|
+
*/
|
|
67
|
+
async request(options) {
|
|
68
|
+
if (this.healthCheckPromise) {
|
|
69
|
+
await this.healthCheckPromise;
|
|
70
|
+
}
|
|
71
|
+
const retry = this.retry ?? { retries: 0 };
|
|
72
|
+
const retryOn = retry.retryOn ?? ((response, error) => {
|
|
73
|
+
if (response)
|
|
74
|
+
return response.status === 429 || response.status >= 500;
|
|
75
|
+
return error instanceof NetworkError || error instanceof TimeoutError || error instanceof TypeError;
|
|
76
|
+
});
|
|
77
|
+
const retryDelayMs = retry.retryDelayMs ?? ((attempt) => Math.min(1000 * 2 ** (attempt - 1), 8000));
|
|
78
|
+
let lastError;
|
|
79
|
+
for (let attempt = 0; attempt <= retry.retries; attempt += 1) {
|
|
80
|
+
try {
|
|
81
|
+
const { response, data } = await this.execute(options);
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const retryAfter = this.parseRetryAfter(response.headers.get('retry-after'));
|
|
84
|
+
const error = mapHttpError(response.status, data, retryAfter);
|
|
85
|
+
if (retryOn(response, error) && attempt < retry.retries) {
|
|
86
|
+
await this.delay(retryDelayMs(attempt + 1, response, error));
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
return data;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
lastError = error;
|
|
95
|
+
if (retryOn(undefined, error) && attempt < retry.retries) {
|
|
96
|
+
await this.delay(retryDelayMs(attempt + 1, undefined, error));
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw lastError;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Executes a request without retry and returns response + data.
|
|
106
|
+
*/
|
|
107
|
+
async execute(options) {
|
|
108
|
+
const url = this.buildUrl(options.path, options.query);
|
|
109
|
+
const headers = { ...this.headers, ...options.headers };
|
|
110
|
+
if (options.body !== undefined)
|
|
111
|
+
headers['content-type'] = 'application/json';
|
|
112
|
+
const authMode = options.auth ?? 'none';
|
|
113
|
+
if (authMode === 'apiKey') {
|
|
114
|
+
if (!this.apiKey)
|
|
115
|
+
throw new AuthError('API key is required');
|
|
116
|
+
headers['x-api-key'] = this.apiKey;
|
|
117
|
+
}
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
120
|
+
try {
|
|
121
|
+
const response = await fetch(url, {
|
|
122
|
+
method: options.method,
|
|
123
|
+
headers,
|
|
124
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
125
|
+
signal: controller.signal,
|
|
126
|
+
});
|
|
127
|
+
const data = await this.readBody(response);
|
|
128
|
+
return { response, data };
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (error?.name === 'AbortError') {
|
|
132
|
+
throw new TimeoutError('Request timeout');
|
|
133
|
+
}
|
|
134
|
+
if (error instanceof NetworkError || error instanceof TimeoutError)
|
|
135
|
+
throw error;
|
|
136
|
+
if (error instanceof Error) {
|
|
137
|
+
if (error instanceof AuthError)
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
if (error instanceof Error && 'status' in error)
|
|
141
|
+
throw error;
|
|
142
|
+
throw new NetworkError('Network error', { details: error });
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Builds the final URL with query params.
|
|
150
|
+
*/
|
|
151
|
+
buildUrl(path, query) {
|
|
152
|
+
const base = this.baseUrl;
|
|
153
|
+
const fullPath = path.startsWith('http') ? path : `${base}${path.startsWith('/') ? '' : '/'}${path}`;
|
|
154
|
+
if (!query)
|
|
155
|
+
return fullPath;
|
|
156
|
+
const params = new URLSearchParams();
|
|
157
|
+
for (const [key, value] of Object.entries(query)) {
|
|
158
|
+
if (value === undefined)
|
|
159
|
+
continue;
|
|
160
|
+
params.set(key, String(value));
|
|
161
|
+
}
|
|
162
|
+
const suffix = params.toString();
|
|
163
|
+
return suffix ? `${fullPath}?${suffix}` : fullPath;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Parses the body as JSON when possible.
|
|
167
|
+
*/
|
|
168
|
+
async readBody(response) {
|
|
169
|
+
if (response.status === 204)
|
|
170
|
+
return undefined;
|
|
171
|
+
const text = await response.text();
|
|
172
|
+
if (!text)
|
|
173
|
+
return undefined;
|
|
174
|
+
try {
|
|
175
|
+
return JSON.parse(text);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return text;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async checkHealth() {
|
|
182
|
+
const url = this.buildUrl('/api/health');
|
|
183
|
+
const controller = new AbortController();
|
|
184
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
185
|
+
try {
|
|
186
|
+
const response = await fetch(url, {
|
|
187
|
+
method: 'GET',
|
|
188
|
+
headers: this.headers,
|
|
189
|
+
signal: controller.signal,
|
|
190
|
+
});
|
|
191
|
+
const data = await this.readBody(response);
|
|
192
|
+
if (!response.ok) {
|
|
193
|
+
throw mapHttpError(response.status, data);
|
|
194
|
+
}
|
|
195
|
+
if (!data || typeof data !== 'object' || data.status !== 'ok') {
|
|
196
|
+
throw new ServerError('Health check failed', { details: data });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error?.name === 'AbortError') {
|
|
201
|
+
throw new TimeoutError('Request timeout');
|
|
202
|
+
}
|
|
203
|
+
if (error instanceof NetworkError || error instanceof TimeoutError)
|
|
204
|
+
throw error;
|
|
205
|
+
if (error instanceof Error && 'status' in error)
|
|
206
|
+
throw error;
|
|
207
|
+
throw new NetworkError('Network error', { details: error });
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
clearTimeout(timer);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
parseRetryAfter(value) {
|
|
214
|
+
if (!value)
|
|
215
|
+
return undefined;
|
|
216
|
+
const seconds = Number(value);
|
|
217
|
+
if (!Number.isNaN(seconds) && Number.isFinite(seconds)) {
|
|
218
|
+
return Math.max(0, seconds);
|
|
219
|
+
}
|
|
220
|
+
const parsedDate = Date.parse(value);
|
|
221
|
+
if (Number.isNaN(parsedDate))
|
|
222
|
+
return undefined;
|
|
223
|
+
const diffMs = parsedDate - Date.now();
|
|
224
|
+
if (diffMs <= 0)
|
|
225
|
+
return 0;
|
|
226
|
+
return Math.ceil(diffMs / 1000);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Simple delay for retries.
|
|
230
|
+
*/
|
|
231
|
+
async delay(ms) {
|
|
232
|
+
await new Promise(resolve => setTimeout(resolve, ms));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=httpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/http/httpClient.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main SDK.
|
|
3
|
+
*/
|
|
4
|
+
export { ObservaSDK } from './sdk';
|
|
5
|
+
/**
|
|
6
|
+
* SDK options.
|
|
7
|
+
*/
|
|
8
|
+
export type { ObservaSDKOptions } from './sdk';
|
|
9
|
+
/**
|
|
10
|
+
* Base HTTP client.
|
|
11
|
+
*/
|
|
12
|
+
export { HttpClient } from './http/httpClient';
|
|
13
|
+
/**
|
|
14
|
+
* HTTP types.
|
|
15
|
+
*/
|
|
16
|
+
export type { HttpClientOptions, RequestOptions, RetryPolicy, AuthMode } from './http/httpClient';
|
|
17
|
+
/**
|
|
18
|
+
* Typed SDK errors.
|
|
19
|
+
*/
|
|
20
|
+
export { SdkError, ValidationError, AuthError, ForbiddenError, NotFoundError, ConflictError, RateLimitError, ServerError, NetworkError, TimeoutError, } from './http/errors';
|
|
21
|
+
/**
|
|
22
|
+
* Domain APIs.
|
|
23
|
+
*/
|
|
24
|
+
export { UptimeApi } from './apis/uptimeApi';
|
|
25
|
+
export { IngestApi } from './apis/ingestApi';
|
|
26
|
+
/**
|
|
27
|
+
* Uptime types.
|
|
28
|
+
*/
|
|
29
|
+
export type { UptimeEvent, UptimeStatus, UptimeHeartbeatInput, UptimeSummary } from './domain/uptime';
|
|
30
|
+
/**
|
|
31
|
+
* Ingestion types.
|
|
32
|
+
*/
|
|
33
|
+
export type { IngestEvent, IngestLevel, IngestRequest, IngestResponse } from './domain/ingest';
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC;;GAEG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAE9C;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C;;GAEG;AACH,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjG;;GAEG;AACH,OAAO,EACL,QAAQ,EACR,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAA;AAEtB;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C;;GAEG;AACH,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACrG;;GAEG;AACH,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main SDK.
|
|
3
|
+
*/
|
|
4
|
+
export { ObservaSDK } from './sdk';
|
|
5
|
+
/**
|
|
6
|
+
* Base HTTP client.
|
|
7
|
+
*/
|
|
8
|
+
export { HttpClient } from './http/httpClient';
|
|
9
|
+
/**
|
|
10
|
+
* Typed SDK errors.
|
|
11
|
+
*/
|
|
12
|
+
export { SdkError, ValidationError, AuthError, ForbiddenError, NotFoundError, ConflictError, RateLimitError, ServerError, NetworkError, TimeoutError, } from './http/errors';
|
|
13
|
+
/**
|
|
14
|
+
* Domain APIs.
|
|
15
|
+
*/
|
|
16
|
+
export { UptimeApi } from './apis/uptimeApi';
|
|
17
|
+
export { IngestApi } from './apis/ingestApi';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAMlC;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAM9C;;GAEG;AACH,OAAO,EACL,QAAQ,EACR,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAA;AAEtB;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { IngestApi } from './apis/ingestApi';
|
|
2
|
+
import { UptimeApi } from './apis/uptimeApi';
|
|
3
|
+
import { type RetryPolicy } from './http/httpClient';
|
|
4
|
+
/**
|
|
5
|
+
* SDK configuration options.
|
|
6
|
+
*/
|
|
7
|
+
export type ObservaSDKOptions = {
|
|
8
|
+
/**
|
|
9
|
+
* Organization API key used to authenticate SDK requests.
|
|
10
|
+
*/
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/**
|
|
13
|
+
* Project DSN used to identify the destination of events and heartbeats.
|
|
14
|
+
*/
|
|
15
|
+
dsnKey: string;
|
|
16
|
+
/**
|
|
17
|
+
* HTTP request timeout in milliseconds.
|
|
18
|
+
*/
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Retry policy for transient errors.
|
|
22
|
+
*/
|
|
23
|
+
retry?: RetryPolicy;
|
|
24
|
+
/**
|
|
25
|
+
* Additional headers sent with every request.
|
|
26
|
+
*/
|
|
27
|
+
headers?: Record<string, string>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Main SDK for error ingestion and uptime heartbeats.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ObservaSDK {
|
|
33
|
+
/**
|
|
34
|
+
* Uptime API (heartbeats and public reads).
|
|
35
|
+
*/
|
|
36
|
+
readonly uptime: UptimeApi;
|
|
37
|
+
/**
|
|
38
|
+
* Event ingestion API.
|
|
39
|
+
*/
|
|
40
|
+
readonly ingest: IngestApi;
|
|
41
|
+
private readonly http;
|
|
42
|
+
/**
|
|
43
|
+
* Creates an SDK instance with required apiKey and dsnKey.
|
|
44
|
+
*/
|
|
45
|
+
constructor(options: ObservaSDKOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Updates the API key used by the SDK at runtime.
|
|
48
|
+
*/
|
|
49
|
+
setApiKey(apiKey: string): void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEhE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC,CAAA;AAOD;;GAEG;AACH,qBAAa,UAAU;IACnB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAE1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IAEjC;;OAEG;gBACS,OAAO,EAAE,iBAAiB;IAgBtC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM;CAG3B"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IngestApi } from './apis/ingestApi';
|
|
2
|
+
import { UptimeApi } from './apis/uptimeApi';
|
|
3
|
+
import { HttpClient } from './http/httpClient';
|
|
4
|
+
/**
|
|
5
|
+
* Fixed backend target for the SDK.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_BASE_URL = 'https://backend-observa-production.up.railway.app';
|
|
8
|
+
/**
|
|
9
|
+
* Main SDK for error ingestion and uptime heartbeats.
|
|
10
|
+
*/
|
|
11
|
+
export class ObservaSDK {
|
|
12
|
+
/**
|
|
13
|
+
* Uptime API (heartbeats and public reads).
|
|
14
|
+
*/
|
|
15
|
+
uptime;
|
|
16
|
+
/**
|
|
17
|
+
* Event ingestion API.
|
|
18
|
+
*/
|
|
19
|
+
ingest;
|
|
20
|
+
http;
|
|
21
|
+
/**
|
|
22
|
+
* Creates an SDK instance with required apiKey and dsnKey.
|
|
23
|
+
*/
|
|
24
|
+
constructor(options) {
|
|
25
|
+
if (!options || !options.apiKey || !options.dsnKey) {
|
|
26
|
+
throw new Error('ObservaSDK requires both apiKey and dsnKey');
|
|
27
|
+
}
|
|
28
|
+
this.http = new HttpClient({
|
|
29
|
+
baseUrl: DEFAULT_BASE_URL,
|
|
30
|
+
apiKey: options.apiKey,
|
|
31
|
+
timeoutMs: options.timeoutMs,
|
|
32
|
+
retry: options.retry,
|
|
33
|
+
headers: options.headers,
|
|
34
|
+
});
|
|
35
|
+
this.http.startHealthCheck();
|
|
36
|
+
this.uptime = new UptimeApi(this.http, options.dsnKey);
|
|
37
|
+
this.ingest = new IngestApi(this.http, options.dsnKey);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Updates the API key used by the SDK at runtime.
|
|
41
|
+
*/
|
|
42
|
+
setApiKey(apiKey) {
|
|
43
|
+
this.http.setApiKey(apiKey);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAA;AA4BhE;;GAEG;AACH,MAAM,gBAAgB,GAAG,mDAAmD,CAAA;AAE5E;;GAEG;AACH,MAAM,OAAO,UAAU;IACnB;;OAEG;IACM,MAAM,CAAW;IAC1B;;OAEG;IACM,MAAM,CAAW;IAET,IAAI,CAAY;IAEjC;;OAEG;IACH,YAAY,OAA0B;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC;YACvB,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;SAC3B,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1D,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAc;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;CACJ"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures a string is present and non-empty.
|
|
3
|
+
*/
|
|
4
|
+
export declare function ensureNonEmpty(value: string, name: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Ensures a value is neither null nor undefined.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ensureDefined<T>(value: T | null | undefined, name: string): asserts value is T;
|
|
9
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAIzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAI9F"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ValidationError } from '../http/errors';
|
|
2
|
+
/**
|
|
3
|
+
* Ensures a string is present and non-empty.
|
|
4
|
+
*/
|
|
5
|
+
export function ensureNonEmpty(value, name) {
|
|
6
|
+
if (!value || value.trim().length === 0) {
|
|
7
|
+
throw new ValidationError(`${name} is required`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Ensures a value is neither null nor undefined.
|
|
12
|
+
*/
|
|
13
|
+
export function ensureDefined(value, name) {
|
|
14
|
+
if (value === null || value === undefined) {
|
|
15
|
+
throw new ValidationError(`${name} is required`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEhD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,cAAc,CAAC,CAAA;IACpD,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAI,KAA2B,EAAE,IAAY;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,cAAc,CAAC,CAAA;IACpD,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@observa/sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Observa SDK for Node.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/ObservaSolutions/observa-sdk"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/bun": "latest",
|
|
32
|
+
"@types/jest": "^29.5.12",
|
|
33
|
+
"jest": "^29.7.0",
|
|
34
|
+
"ts-jest": "^29.1.2",
|
|
35
|
+
"typescript": "^5.6.3"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.build.json",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
|
+
"test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --config ./jest.config.mjs",
|
|
41
|
+
"test:watch": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --watch --config ./jest.config.mjs",
|
|
42
|
+
"test:list": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --listTests --config ./jest.config.mjs"
|
|
43
|
+
}
|
|
44
|
+
}
|