@pacspace-io/sdk 0.1.0 → 0.2.1

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.
Files changed (46) hide show
  1. package/README.md +67 -11
  2. package/dist/client.d.ts +34 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +296 -21
  5. package/dist/client.js.map +1 -1
  6. package/dist/errors/index.d.ts +24 -1
  7. package/dist/errors/index.d.ts.map +1 -1
  8. package/dist/errors/index.js +44 -4
  9. package/dist/errors/index.js.map +1 -1
  10. package/dist/index.d.ts +51 -13
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +107 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/resources/balance.d.ts +221 -15
  15. package/dist/resources/balance.d.ts.map +1 -1
  16. package/dist/resources/balance.js +772 -27
  17. package/dist/resources/balance.js.map +1 -1
  18. package/dist/resources/submission.d.ts +79 -0
  19. package/dist/resources/submission.d.ts.map +1 -0
  20. package/dist/resources/submission.js +398 -0
  21. package/dist/resources/submission.js.map +1 -0
  22. package/dist/types/balance.d.ts +493 -28
  23. package/dist/types/balance.d.ts.map +1 -1
  24. package/dist/types/common.d.ts +3 -3
  25. package/dist/types/common.d.ts.map +1 -1
  26. package/dist/types/config.d.ts +53 -3
  27. package/dist/types/config.d.ts.map +1 -1
  28. package/dist/types/submission.d.ts +125 -0
  29. package/dist/types/submission.d.ts.map +1 -0
  30. package/dist/types/submission.js +3 -0
  31. package/dist/types/submission.js.map +1 -0
  32. package/dist/utils/polling.d.ts +2 -2
  33. package/dist/utils/polling.d.ts.map +1 -1
  34. package/dist/utils/polling.js +2 -6
  35. package/dist/utils/polling.js.map +1 -1
  36. package/dist/webhooks/index.d.ts +1 -1
  37. package/dist/webhooks/index.d.ts.map +1 -1
  38. package/dist/webhooks/types.d.ts +31 -31
  39. package/dist/webhooks/types.d.ts.map +1 -1
  40. package/dist/webhooks/types.js +0 -3
  41. package/dist/webhooks/types.js.map +1 -1
  42. package/dist/webhooks/verify.d.ts +5 -0
  43. package/dist/webhooks/verify.d.ts.map +1 -1
  44. package/dist/webhooks/verify.js +19 -4
  45. package/dist/webhooks/verify.js.map +1 -1
  46. package/package.json +1 -1
@@ -1,17 +1,37 @@
1
+ import type { SubmissionAutomationOptions } from './submission';
1
2
  /**
2
3
  * PacSpace SDK configuration options.
3
4
  */
4
5
  export interface PacSpaceConfig {
5
6
  /**
6
- * Your PacSpace API key.
7
+ * Your Balance API key.
7
8
  * Format: `pk_live_PUBLIC.SECRET` (production) or `pk_test_PUBLIC.SECRET` (sandbox).
8
9
  */
9
10
  apiKey: string;
10
11
  /**
11
- * Base URL for the PacSpace API.
12
- * Defaults to `https://balance-api.pacspace.io`.
12
+ * Optional webhook signing secret. When provided, `pac.webhooks` is enabled.
13
+ */
14
+ webhookSecret?: string;
15
+ /**
16
+ * Base URL for the Balance API.
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;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;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;CACtB;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"}
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=submission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/types/submission.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import type { AnchorStatus } from '../types/common';
1
+ import type { RecordStatus } from '../types/common';
2
2
  /**
3
3
  * Options for the poll utility.
4
4
  */
@@ -27,6 +27,6 @@ export interface PollOptions {
27
27
  * @internal
28
28
  */
29
29
  export declare function pollUntilTerminal<T extends {
30
- status: AnchorStatus;
30
+ status: RecordStatus;
31
31
  }>(statusFn: () => Promise<T>, options?: PollOptions): Promise<T>;
32
32
  //# sourceMappingURL=polling.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAYpD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,EACxE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,CAAC,CAAC,CA0CZ"}
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,EACxE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,CAAC,CAAC,CA0CZ"}
@@ -3,13 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pollUntilTerminal = pollUntilTerminal;
4
4
  const errors_1 = require("../errors");
5
5
  /**
6
- * Terminal statuses — once an anchor reaches these, polling stops.
6
+ * Terminal statuses — once a record reaches these, polling stops.
7
7
  */
8
- const TERMINAL_STATUSES = new Set([
9
- 'ANCHORED',
10
- 'VERIFIED',
11
- 'FAILED',
12
- ]);
8
+ const TERMINAL_STATUSES = new Set(['VERIFIED', 'FAILED']);
13
9
  /**
14
10
  * Poll a status-returning function until a terminal status is reached.
15
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":";;AAwCA,8CA6CC;AApFD,sCAAyC;AAEzC;;GAEG;AACH,MAAM,iBAAiB,GAAsB,IAAI,GAAG,CAAC;IACnD,UAAU;IACV,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAoBH;;;;;;;;;GASG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAA0B,EAC1B,OAAqB;IAErB,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAM,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAK,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,qBAAqB;QACrB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,qBAAY,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;QAEhC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM;QAEtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEzC,iDAAiD;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,CAAC,IAAI,qBAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,qBAAY,CACpB,oDAAoD,OAAO,IAAI,CAChE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":";;AAoCA,8CA6CC;AAhFD,sCAAyC;AAEzC;;GAEG;AACH,MAAM,iBAAiB,GAAsB,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAoB7E;;;;;;;;;GASG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAA0B,EAC1B,OAAqB;IAErB,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAM,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAK,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,qBAAqB;QACrB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,qBAAY,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;QAEhC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM;QAEtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEzC,iDAAiD;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,CAAC,IAAI,qBAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,qBAAY,CACpB,oDAAoD,OAAO,IAAI,CAChE,CAAC;AACJ,CAAC"}
@@ -1,3 +1,3 @@
1
1
  export { Webhooks, type VerifyOptions } from './verify';
2
- export type { WebhookEventType, WebhookEvent, WebhookEventMap, WebhookHeaders, DeltaVerifiedPayload, DeltaStoredPayload, CheckpointVerifiedPayload, FactVerifiedPayload, RecordTransferredPayload, } from './types';
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,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,SAAS,CAAC"}
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"}
@@ -1,9 +1,17 @@
1
1
  /**
2
- * All supported webhook event types.
2
+ * Known webhook events currently emitted by production workers.
3
3
  */
4
- export type WebhookEventType = 'delta.verified' | 'delta.stored' | 'checkpoint.verified' | 'fact.verified' | 'record.transferred';
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;
11
+ /**
12
+ * Per-customer monotonic sequence number for the delta.
13
+ * Null for non-credit-delta records.
14
+ */
7
15
  deltaIndex: number | null;
8
16
  status: 'verified';
9
17
  verifiedAt: string;
@@ -40,40 +48,28 @@ export interface DeltaVerifiedPayload {
40
48
  overageRate: string;
41
49
  };
42
50
  }
43
- export interface DeltaStoredPayload {
44
- startIndex: string;
45
- count: string;
46
- verificationId: string;
47
- verifiedAt: string;
48
- }
49
- export interface CheckpointVerifiedPayload {
50
- fromIndex: string;
51
- toIndex: string;
52
- proofHash: string;
53
- verifiedAt: string;
54
- verificationId: string;
55
- message: string;
56
- }
57
- export interface FactVerifiedPayload {
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;
51
+ export interface DeltaFailedPayload {
52
+ recordId: string;
53
+ receiptId: string | null;
54
+ customerId: string | null;
55
+ status: 'FAILED';
56
+ reason: string;
57
+ failedAt: string;
58
+ delta?: {
59
+ customerId: string | null;
60
+ amount: number | null;
61
+ reason: string | null;
62
+ referenceId: string | null;
63
+ metadata?: Record<string, unknown>;
64
+ submittedAt: string | null;
65
+ };
67
66
  }
68
67
  /**
69
68
  * Map from event type to its payload shape.
70
69
  */
71
70
  export interface WebhookEventMap {
72
71
  'delta.verified': DeltaVerifiedPayload;
73
- 'delta.stored': DeltaStoredPayload;
74
- 'checkpoint.verified': CheckpointVerifiedPayload;
75
- 'fact.verified': FactVerifiedPayload;
76
- 'record.transferred': RecordTransferredPayload;
72
+ 'delta.failed': DeltaFailedPayload;
77
73
  }
78
74
  /**
79
75
  * A typed webhook event.
@@ -84,13 +80,17 @@ export interface WebhookEvent<T extends WebhookEventType = WebhookEventType> {
84
80
  /** ISO 8601 timestamp of when the webhook was sent. */
85
81
  timestamp: string;
86
82
  /** Event-specific data. */
87
- data: T extends keyof WebhookEventMap ? WebhookEventMap[T] : unknown;
83
+ data: T extends KnownWebhookEventType ? WebhookEventMap[T] : unknown;
88
84
  }
89
85
  /**
90
86
  * Headers sent with every webhook delivery.
91
87
  */
92
88
  export interface WebhookHeaders {
93
89
  'x-pacspace-signature': string;
90
+ /**
91
+ * Unix epoch timestamp string as sent by current webhook workers.
92
+ * Current production uses milliseconds.
93
+ */
94
94
  'x-pacspace-timestamp': string;
95
95
  'x-webhook-event'?: string;
96
96
  'x-event-id'?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"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"}
@@ -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":";AAAA,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E"}
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"}
@@ -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 webhookTime = parseInt(timestamp, 10);
149
- if (isNaN(webhookTime)) {
150
- throw new errors_1.WebhookVerificationError(`Invalid timestamp: "${timestamp}". Expected a Unix timestamp in seconds.`);
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 - webhookTime);
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pacspace-io/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Official PacSpace Balance API SDK — zero-dependency TypeScript client",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",