@pacspace-io/sdk 0.1.0 → 0.2.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 +65 -9
- package/dist/client.d.ts +33 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +294 -19
- package/dist/client.js.map +1 -1
- package/dist/errors/index.d.ts +24 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +44 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +49 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +106 -7
- package/dist/index.js.map +1 -1
- package/dist/resources/balance.d.ts +207 -13
- package/dist/resources/balance.d.ts.map +1 -1
- package/dist/resources/balance.js +356 -16
- package/dist/resources/balance.js.map +1 -1
- package/dist/resources/submission.d.ts +79 -0
- package/dist/resources/submission.d.ts.map +1 -0
- package/dist/resources/submission.js +398 -0
- package/dist/resources/submission.js.map +1 -0
- package/dist/types/balance.d.ts +489 -19
- package/dist/types/balance.d.ts.map +1 -1
- package/dist/types/config.d.ts +51 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/submission.d.ts +125 -0
- package/dist/types/submission.d.ts.map +1 -0
- package/dist/types/submission.js +3 -0
- package/dist/types/submission.js.map +1 -0
- package/dist/webhooks/index.d.ts +1 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/types.d.ts +27 -31
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/webhooks/types.js +0 -3
- package/dist/webhooks/types.js.map +1 -1
- package/dist/webhooks/verify.d.ts +5 -0
- package/dist/webhooks/verify.d.ts.map +1 -1
- package/dist/webhooks/verify.js +19 -4
- package/dist/webhooks/verify.js.map +1 -1
- package/package.json +1 -1
package/dist/types/config.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SubmissionAutomationOptions } from './submission';
|
|
1
2
|
/**
|
|
2
3
|
* PacSpace SDK configuration options.
|
|
3
4
|
*/
|
|
@@ -7,11 +8,30 @@ export interface PacSpaceConfig {
|
|
|
7
8
|
* Format: `pk_live_PUBLIC.SECRET` (production) or `pk_test_PUBLIC.SECRET` (sandbox).
|
|
8
9
|
*/
|
|
9
10
|
apiKey: string;
|
|
11
|
+
/**
|
|
12
|
+
* Optional webhook signing secret. When provided, `pac.webhooks` is enabled.
|
|
13
|
+
*/
|
|
14
|
+
webhookSecret?: string;
|
|
10
15
|
/**
|
|
11
16
|
* Base URL for the PacSpace API.
|
|
12
|
-
*
|
|
17
|
+
* If provided, this overrides auto-routing based on API key prefix.
|
|
18
|
+
* If not provided, the SDK auto-routes:
|
|
19
|
+
* - `pk_test_*` keys → sandbox API URL (or `sandboxUrl` if set)
|
|
20
|
+
* - `pk_live_*` keys → production API URL (or `productionUrl` if set)
|
|
13
21
|
*/
|
|
14
22
|
baseUrl?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Custom sandbox API URL.
|
|
25
|
+
* Used when auto-routing `pk_test_*` keys.
|
|
26
|
+
* Ignored if `baseUrl` is explicitly provided.
|
|
27
|
+
*/
|
|
28
|
+
sandboxUrl?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Custom production API URL.
|
|
31
|
+
* Used when auto-routing `pk_live_*` keys.
|
|
32
|
+
* Ignored if `baseUrl` is explicitly provided.
|
|
33
|
+
*/
|
|
34
|
+
productionUrl?: string;
|
|
15
35
|
/**
|
|
16
36
|
* Default chain ID to use for all requests.
|
|
17
37
|
* Auto-detected from API key prefix when not set:
|
|
@@ -37,6 +57,36 @@ export interface PacSpaceConfig {
|
|
|
37
57
|
* Custom fetch implementation. Uses global `fetch` by default (Node 18+).
|
|
38
58
|
*/
|
|
39
59
|
fetch?: typeof fetch;
|
|
60
|
+
/**
|
|
61
|
+
* Enable client-side buffering for write requests when the API is temporarily unavailable.
|
|
62
|
+
* Buffered requests are retried in the background and resolved once drained.
|
|
63
|
+
* @default true
|
|
64
|
+
*/
|
|
65
|
+
bufferWrites?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Maximum number of buffered write requests kept in memory.
|
|
68
|
+
* @default 1000
|
|
69
|
+
*/
|
|
70
|
+
bufferMaxItems?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Maximum retry attempts per buffered write before rejecting it.
|
|
73
|
+
* @default 100
|
|
74
|
+
*/
|
|
75
|
+
bufferMaxAttempts?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Base retry delay (ms) for buffered writes.
|
|
78
|
+
* @default 1000
|
|
79
|
+
*/
|
|
80
|
+
bufferBaseDelayMs?: number;
|
|
81
|
+
/**
|
|
82
|
+
* Maximum retry delay (ms) for buffered writes.
|
|
83
|
+
* @default 60000
|
|
84
|
+
*/
|
|
85
|
+
bufferMaxDelayMs?: number;
|
|
86
|
+
/**
|
|
87
|
+
* Submission automation profile for tenant-produced usage summaries.
|
|
88
|
+
*/
|
|
89
|
+
submission?: SubmissionAutomationOptions;
|
|
40
90
|
}
|
|
41
91
|
/**
|
|
42
92
|
* Per-request options that can override defaults.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,2BAA2B,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Submission automation profiles.
|
|
3
|
+
*
|
|
4
|
+
* - `daily`: one tenant-produced summary per customer per 24h window.
|
|
5
|
+
* - `sub_daily`: higher-frequency summary submission (enterprise only).
|
|
6
|
+
* - `immediate`: submit each queued summary as soon as it is enqueued (enterprise only).
|
|
7
|
+
*/
|
|
8
|
+
export type SubmissionProfile = 'daily' | 'sub_daily' | 'immediate';
|
|
9
|
+
/**
|
|
10
|
+
* A tenant-produced usage summary for one customer and one usage window.
|
|
11
|
+
*
|
|
12
|
+
* The SDK submits this summary as a delta. The SDK does not infer or meter
|
|
13
|
+
* raw product usage events.
|
|
14
|
+
*/
|
|
15
|
+
export interface CustomerUsageSummary {
|
|
16
|
+
customerId: string;
|
|
17
|
+
delta: number;
|
|
18
|
+
windowStart: string;
|
|
19
|
+
windowEnd: string;
|
|
20
|
+
reason?: string;
|
|
21
|
+
referenceId?: string;
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Options for SDK-managed summary submission automation.
|
|
26
|
+
*/
|
|
27
|
+
export interface SubmissionAutomationOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Submission profile.
|
|
30
|
+
* @default 'daily'
|
|
31
|
+
*/
|
|
32
|
+
profile?: SubmissionProfile;
|
|
33
|
+
/**
|
|
34
|
+
* Flush cadence in milliseconds.
|
|
35
|
+
* Defaults by profile:
|
|
36
|
+
* - daily: 86_400_000
|
|
37
|
+
* - sub_daily: 21_600_000 (6 hours)
|
|
38
|
+
* - immediate: 0
|
|
39
|
+
*/
|
|
40
|
+
cadenceMs?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Enables enterprise-only profiles (`sub_daily`, `immediate`).
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
enterprise?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Start the scheduler when the first summary is enqueued.
|
|
48
|
+
* @default true
|
|
49
|
+
*/
|
|
50
|
+
autoStart?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Attempt a best-effort flush on process shutdown signals.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
autoFlushOnShutdown?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Maximum deltas per request.
|
|
58
|
+
* The API cap is 100.
|
|
59
|
+
* @default 100
|
|
60
|
+
*/
|
|
61
|
+
batchSize?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Max batch requests per minute for client-side pacing.
|
|
64
|
+
* @default 10
|
|
65
|
+
*/
|
|
66
|
+
maxRequestsPerMinute?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Default reason used when summary.reason is omitted.
|
|
69
|
+
* @default 'usage_summary'
|
|
70
|
+
*/
|
|
71
|
+
defaultReason?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Internal queued summary shape with deterministic reference and queue metadata.
|
|
75
|
+
*/
|
|
76
|
+
export interface QueuedUsageSummary extends CustomerUsageSummary {
|
|
77
|
+
key: string;
|
|
78
|
+
referenceId: string;
|
|
79
|
+
queuedAt: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Snapshot of scheduler queue state.
|
|
83
|
+
*/
|
|
84
|
+
export interface SubmissionQueueState {
|
|
85
|
+
profile: SubmissionProfile;
|
|
86
|
+
cadenceMs: number;
|
|
87
|
+
enterprise: boolean;
|
|
88
|
+
queuedCount: number;
|
|
89
|
+
isRunning: boolean;
|
|
90
|
+
nextFlushAt: string | null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Manual flush options.
|
|
94
|
+
*/
|
|
95
|
+
export interface FlushSummariesOptions {
|
|
96
|
+
/**
|
|
97
|
+
* Limit number of queued summaries included in this flush.
|
|
98
|
+
* Omit to flush all.
|
|
99
|
+
*/
|
|
100
|
+
maxItems?: number;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* One failed item from a flush attempt.
|
|
104
|
+
*/
|
|
105
|
+
export interface SummaryFlushFailure {
|
|
106
|
+
customerId: string;
|
|
107
|
+
referenceId: string;
|
|
108
|
+
error: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Summary of one flush execution.
|
|
112
|
+
*/
|
|
113
|
+
export interface SummaryFlushResult {
|
|
114
|
+
profile: SubmissionProfile;
|
|
115
|
+
startedAt: string;
|
|
116
|
+
finishedAt: string;
|
|
117
|
+
attempted: number;
|
|
118
|
+
submitted: number;
|
|
119
|
+
failed: number;
|
|
120
|
+
replayed: number;
|
|
121
|
+
requestCount: number;
|
|
122
|
+
queuedAfterFlush: number;
|
|
123
|
+
failures: SummaryFlushFailure[];
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=submission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/types/submission.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/types/submission.ts"],"names":[],"mappings":""}
|
package/dist/webhooks/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { Webhooks, type VerifyOptions } from './verify';
|
|
2
|
-
export type { WebhookEventType, WebhookEvent, WebhookEventMap, WebhookHeaders, DeltaVerifiedPayload,
|
|
2
|
+
export type { KnownWebhookEventType, WebhookEventType, WebhookEvent, WebhookEventMap, WebhookHeaders, DeltaVerifiedPayload, DeltaFailedPayload, } from './types';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
package/dist/webhooks/types.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Known webhook events currently emitted by production workers.
|
|
3
3
|
*/
|
|
4
|
-
export type
|
|
4
|
+
export type KnownWebhookEventType = 'delta.verified' | 'delta.failed';
|
|
5
|
+
/**
|
|
6
|
+
* Event type union with forward-compat support for unknown future events.
|
|
7
|
+
*/
|
|
8
|
+
export type WebhookEventType = KnownWebhookEventType | (string & {});
|
|
5
9
|
export interface DeltaVerifiedPayload {
|
|
6
10
|
receiptId: string;
|
|
7
11
|
deltaIndex: number | null;
|
|
@@ -40,40 +44,28 @@ export interface DeltaVerifiedPayload {
|
|
|
40
44
|
overageRate: string;
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
|
-
export interface
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
contentHash: string;
|
|
59
|
-
proofHash: string;
|
|
60
|
-
verifiedAt: string;
|
|
61
|
-
verificationId: string;
|
|
62
|
-
}
|
|
63
|
-
export interface RecordTransferredPayload {
|
|
64
|
-
receiptId: string;
|
|
65
|
-
verifiedAt: string;
|
|
66
|
-
verificationId: string;
|
|
47
|
+
export interface DeltaFailedPayload {
|
|
48
|
+
anchorId: string;
|
|
49
|
+
receiptId: string | null;
|
|
50
|
+
customerId: string | null;
|
|
51
|
+
status: 'FAILED';
|
|
52
|
+
reason: string;
|
|
53
|
+
failedAt: string;
|
|
54
|
+
delta?: {
|
|
55
|
+
customerId: string | null;
|
|
56
|
+
amount: number | null;
|
|
57
|
+
reason: string | null;
|
|
58
|
+
referenceId: string | null;
|
|
59
|
+
metadata?: Record<string, unknown>;
|
|
60
|
+
submittedAt: string | null;
|
|
61
|
+
};
|
|
67
62
|
}
|
|
68
63
|
/**
|
|
69
64
|
* Map from event type to its payload shape.
|
|
70
65
|
*/
|
|
71
66
|
export interface WebhookEventMap {
|
|
72
67
|
'delta.verified': DeltaVerifiedPayload;
|
|
73
|
-
'delta.
|
|
74
|
-
'checkpoint.verified': CheckpointVerifiedPayload;
|
|
75
|
-
'fact.verified': FactVerifiedPayload;
|
|
76
|
-
'record.transferred': RecordTransferredPayload;
|
|
68
|
+
'delta.failed': DeltaFailedPayload;
|
|
77
69
|
}
|
|
78
70
|
/**
|
|
79
71
|
* A typed webhook event.
|
|
@@ -84,13 +76,17 @@ export interface WebhookEvent<T extends WebhookEventType = WebhookEventType> {
|
|
|
84
76
|
/** ISO 8601 timestamp of when the webhook was sent. */
|
|
85
77
|
timestamp: string;
|
|
86
78
|
/** Event-specific data. */
|
|
87
|
-
data: T extends
|
|
79
|
+
data: T extends KnownWebhookEventType ? WebhookEventMap[T] : unknown;
|
|
88
80
|
}
|
|
89
81
|
/**
|
|
90
82
|
* Headers sent with every webhook delivery.
|
|
91
83
|
*/
|
|
92
84
|
export interface WebhookHeaders {
|
|
93
85
|
'x-pacspace-signature': string;
|
|
86
|
+
/**
|
|
87
|
+
* Unix epoch timestamp string as sent by current webhook workers.
|
|
88
|
+
* Current production uses milliseconds.
|
|
89
|
+
*/
|
|
94
90
|
'x-pacspace-timestamp': string;
|
|
95
91
|
'x-webhook-event'?: string;
|
|
96
92
|
'x-event-id'?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks/types.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// ---------------------------------------------------------------------------
|
|
3
|
-
// Webhook Event Types
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":""}
|
|
@@ -96,6 +96,11 @@ export declare class Webhooks {
|
|
|
96
96
|
* Validate that the timestamp is within the tolerance window.
|
|
97
97
|
*/
|
|
98
98
|
private validateTimestamp;
|
|
99
|
+
/**
|
|
100
|
+
* Convert epoch timestamp string to seconds.
|
|
101
|
+
* Accepts both second and millisecond precision.
|
|
102
|
+
*/
|
|
103
|
+
private parseTimestampToSeconds;
|
|
99
104
|
/**
|
|
100
105
|
* Extract a header value from a headers object (handles arrays).
|
|
101
106
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;OAEG;gBACS,MAAM,EAAE,MAAM;IAS1B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY;IAyCf;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CACf,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACvE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY;IAkBf;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,IACxB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAgBvC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,SAAS;CAOlB"}
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;OAEG;gBACS,MAAM,EAAE,MAAM;IAS1B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY;IAyCf;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CACf,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACvE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY;IAkBf;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,IACxB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAgBvC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,SAAS;CAOlB"}
|
package/dist/webhooks/verify.js
CHANGED
|
@@ -145,16 +145,31 @@ class Webhooks {
|
|
|
145
145
|
* Validate that the timestamp is within the tolerance window.
|
|
146
146
|
*/
|
|
147
147
|
validateTimestamp(timestamp, toleranceSeconds) {
|
|
148
|
-
const
|
|
149
|
-
if (isNaN(
|
|
150
|
-
throw new errors_1.WebhookVerificationError(`Invalid timestamp: "${timestamp}". Expected
|
|
148
|
+
const webhookTimeSeconds = this.parseTimestampToSeconds(timestamp);
|
|
149
|
+
if (Number.isNaN(webhookTimeSeconds)) {
|
|
150
|
+
throw new errors_1.WebhookVerificationError(`Invalid timestamp: "${timestamp}". Expected Unix epoch in seconds or milliseconds.`);
|
|
151
151
|
}
|
|
152
152
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
153
|
-
const age = Math.abs(currentTime -
|
|
153
|
+
const age = Math.abs(currentTime - webhookTimeSeconds);
|
|
154
154
|
if (age > toleranceSeconds) {
|
|
155
155
|
throw new errors_1.WebhookVerificationError(`Timestamp too old (${age}s > ${toleranceSeconds}s tolerance). This may be a replay attack, or your server clock is skewed.`);
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Convert epoch timestamp string to seconds.
|
|
160
|
+
* Accepts both second and millisecond precision.
|
|
161
|
+
*/
|
|
162
|
+
parseTimestampToSeconds(timestamp) {
|
|
163
|
+
const raw = Number.parseInt(timestamp, 10);
|
|
164
|
+
if (!Number.isFinite(raw)) {
|
|
165
|
+
return Number.NaN;
|
|
166
|
+
}
|
|
167
|
+
// 13+ digits => milliseconds in current webhook workers.
|
|
168
|
+
if (Math.abs(raw) >= 1000000000000) {
|
|
169
|
+
return Math.floor(raw / 1000);
|
|
170
|
+
}
|
|
171
|
+
return raw;
|
|
172
|
+
}
|
|
158
173
|
/**
|
|
159
174
|
* Extract a header value from a headers object (handles arrays).
|
|
160
175
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"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"}
|