@37signals/fizzy 0.1.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/dist/auth/cookie-auth.d.ts +25 -0
- package/dist/auth/cookie-auth.d.ts.map +1 -0
- package/dist/auth/cookie-auth.js +29 -0
- package/dist/auth/cookie-auth.js.map +1 -0
- package/dist/auth/magic-link.d.ts +66 -0
- package/dist/auth/magic-link.d.ts.map +1 -0
- package/dist/auth/magic-link.js +78 -0
- package/dist/auth/magic-link.js.map +1 -0
- package/dist/auth-strategy.d.ts +32 -0
- package/dist/auth-strategy.d.ts.map +1 -0
- package/dist/auth-strategy.js +29 -0
- package/dist/auth-strategy.js.map +1 -0
- package/dist/cache/etag-cache.d.ts +49 -0
- package/dist/cache/etag-cache.d.ts.map +1 -0
- package/dist/cache/etag-cache.js +95 -0
- package/dist/cache/etag-cache.js.map +1 -0
- package/dist/client.d.ts +92 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +505 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +68 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +187 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/metadata.json +1272 -0
- package/dist/generated/openapi-stripped.json +12446 -0
- package/dist/generated/path-mapping.d.ts +8 -0
- package/dist/generated/path-mapping.d.ts.map +1 -0
- package/dist/generated/path-mapping.js +124 -0
- package/dist/generated/path-mapping.js.map +1 -0
- package/dist/generated/path-mapping.ts +135 -0
- package/dist/generated/schema.d.ts +10272 -0
- package/dist/generated/services/boards.d.ts +56 -0
- package/dist/generated/services/boards.d.ts.map +1 -0
- package/dist/generated/services/boards.js +100 -0
- package/dist/generated/services/boards.js.map +1 -0
- package/dist/generated/services/boards.ts +152 -0
- package/dist/generated/services/cards.d.ts +164 -0
- package/dist/generated/services/cards.d.ts.map +1 -0
- package/dist/generated/services/cards.js +353 -0
- package/dist/generated/services/cards.js.map +1 -0
- package/dist/generated/services/cards.ts +522 -0
- package/dist/generated/services/columns.d.ts +45 -0
- package/dist/generated/services/columns.d.ts.map +1 -0
- package/dist/generated/services/columns.js +77 -0
- package/dist/generated/services/columns.js.map +1 -0
- package/dist/generated/services/columns.ts +116 -0
- package/dist/generated/services/comments.d.ts +42 -0
- package/dist/generated/services/comments.d.ts.map +1 -0
- package/dist/generated/services/comments.js +77 -0
- package/dist/generated/services/comments.js.map +1 -0
- package/dist/generated/services/comments.ts +114 -0
- package/dist/generated/services/devices.d.ts +24 -0
- package/dist/generated/services/devices.d.ts.map +1 -0
- package/dist/generated/services/devices.js +36 -0
- package/dist/generated/services/devices.js.map +1 -0
- package/dist/generated/services/devices.ts +53 -0
- package/dist/generated/services/identity.d.ts +16 -0
- package/dist/generated/services/identity.d.ts.map +1 -0
- package/dist/generated/services/identity.js +21 -0
- package/dist/generated/services/identity.js.map +1 -0
- package/dist/generated/services/identity.ts +30 -0
- package/dist/generated/services/index.d.ts +17 -0
- package/dist/generated/services/index.d.ts.map +1 -0
- package/dist/generated/services/index.js +17 -0
- package/dist/generated/services/index.js.map +1 -0
- package/dist/generated/services/index.ts +16 -0
- package/dist/generated/services/miscellaneous.d.ts +136 -0
- package/dist/generated/services/miscellaneous.d.ts.map +1 -0
- package/dist/generated/services/miscellaneous.js +301 -0
- package/dist/generated/services/miscellaneous.js.map +1 -0
- package/dist/generated/services/miscellaneous.ts +443 -0
- package/dist/generated/services/notifications.d.ts +42 -0
- package/dist/generated/services/notifications.d.ts.map +1 -0
- package/dist/generated/services/notifications.js +75 -0
- package/dist/generated/services/notifications.js.map +1 -0
- package/dist/generated/services/notifications.ts +113 -0
- package/dist/generated/services/pins.d.ts +16 -0
- package/dist/generated/services/pins.d.ts.map +1 -0
- package/dist/generated/services/pins.js +21 -0
- package/dist/generated/services/pins.js.map +1 -0
- package/dist/generated/services/pins.ts +29 -0
- package/dist/generated/services/reactions.d.ts +45 -0
- package/dist/generated/services/reactions.d.ts.map +1 -0
- package/dist/generated/services/reactions.js +90 -0
- package/dist/generated/services/reactions.js.map +1 -0
- package/dist/generated/services/reactions.ts +129 -0
- package/dist/generated/services/sessions.d.ts +44 -0
- package/dist/generated/services/sessions.d.ts.map +1 -0
- package/dist/generated/services/sessions.js +73 -0
- package/dist/generated/services/sessions.js.map +1 -0
- package/dist/generated/services/sessions.ts +113 -0
- package/dist/generated/services/steps.d.ts +43 -0
- package/dist/generated/services/steps.d.ts.map +1 -0
- package/dist/generated/services/steps.js +77 -0
- package/dist/generated/services/steps.js.map +1 -0
- package/dist/generated/services/steps.ts +114 -0
- package/dist/generated/services/tags.d.ts +17 -0
- package/dist/generated/services/tags.d.ts.map +1 -0
- package/dist/generated/services/tags.js +21 -0
- package/dist/generated/services/tags.js.map +1 -0
- package/dist/generated/services/tags.ts +32 -0
- package/dist/generated/services/uploads.d.ts +22 -0
- package/dist/generated/services/uploads.d.ts.map +1 -0
- package/dist/generated/services/uploads.js +23 -0
- package/dist/generated/services/uploads.js.map +1 -0
- package/dist/generated/services/uploads.ts +38 -0
- package/dist/generated/services/users.d.ts +33 -0
- package/dist/generated/services/users.d.ts.map +1 -0
- package/dist/generated/services/users.js +61 -0
- package/dist/generated/services/users.js.map +1 -0
- package/dist/generated/services/users.ts +89 -0
- package/dist/generated/services/webhooks.d.ts +49 -0
- package/dist/generated/services/webhooks.d.ts.map +1 -0
- package/dist/generated/services/webhooks.js +90 -0
- package/dist/generated/services/webhooks.js.map +1 -0
- package/dist/generated/services/webhooks.ts +133 -0
- package/dist/hooks/gating.d.ts +35 -0
- package/dist/hooks/gating.d.ts.map +1 -0
- package/dist/hooks/gating.js +58 -0
- package/dist/hooks/gating.js.map +1 -0
- package/dist/hooks/otel.d.ts +49 -0
- package/dist/hooks/otel.d.ts.map +1 -0
- package/dist/hooks/otel.js +171 -0
- package/dist/hooks/otel.js.map +1 -0
- package/dist/hooks.d.ts +99 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +130 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination-utils.d.ts +22 -0
- package/dist/pagination-utils.d.ts.map +1 -0
- package/dist/pagination-utils.js +52 -0
- package/dist/pagination-utils.js.map +1 -0
- package/dist/pagination.d.ts +37 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +30 -0
- package/dist/pagination.js.map +1 -0
- package/dist/resilience/bulkhead.d.ts +34 -0
- package/dist/resilience/bulkhead.d.ts.map +1 -0
- package/dist/resilience/bulkhead.js +65 -0
- package/dist/resilience/bulkhead.js.map +1 -0
- package/dist/resilience/circuit-breaker.d.ts +48 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +74 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +41 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +46 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/rate-limiter.d.ts +38 -0
- package/dist/resilience/rate-limiter.d.ts.map +1 -0
- package/dist/resilience/rate-limiter.js +69 -0
- package/dist/resilience/rate-limiter.js.map +1 -0
- package/dist/security.d.ts +19 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +55 -0
- package/dist/security.js.map +1 -0
- package/dist/services/base.d.ts +51 -0
- package/dist/services/base.d.ts.map +1 -0
- package/dist/services/base.js +146 -0
- package/dist/services/base.js.map +1 -0
- package/dist/webhooks/handler.d.ts +62 -0
- package/dist/webhooks/handler.d.ts.map +1 -0
- package/dist/webhooks/handler.js +204 -0
- package/dist/webhooks/handler.js.map +1 -0
- package/dist/webhooks/index.d.ts +3 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +3 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/verify.d.ts +10 -0
- package/dist/webhooks/verify.d.ts.map +1 -0
- package/dist/webhooks/verify.js +23 -0
- package/dist/webhooks/verify.js.map +1 -0
- package/package.json +67 -0
- package/src/generated/metadata.json +1272 -0
- package/src/generated/openapi-stripped.json +12446 -0
- package/src/generated/path-mapping.ts +135 -0
- package/src/generated/schema.d.ts +10272 -0
- package/src/generated/services/boards.ts +152 -0
- package/src/generated/services/cards.ts +522 -0
- package/src/generated/services/columns.ts +116 -0
- package/src/generated/services/comments.ts +114 -0
- package/src/generated/services/devices.ts +53 -0
- package/src/generated/services/identity.ts +30 -0
- package/src/generated/services/index.ts +16 -0
- package/src/generated/services/miscellaneous.ts +443 -0
- package/src/generated/services/notifications.ts +113 -0
- package/src/generated/services/pins.ts +29 -0
- package/src/generated/services/reactions.ts +129 -0
- package/src/generated/services/sessions.ts +113 -0
- package/src/generated/services/steps.ts +114 -0
- package/src/generated/services/tags.ts +32 -0
- package/src/generated/services/uploads.ts +38 -0
- package/src/generated/services/users.ts +89 -0
- package/src/generated/services/webhooks.ts +133 -0
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability hooks system for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides a way to observe API operations and HTTP requests
|
|
5
|
+
* without modifying the core client logic.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Combines multiple hooks into a single hooks object.
|
|
9
|
+
*/
|
|
10
|
+
export function chainHooks(...hooks) {
|
|
11
|
+
const activeHooks = hooks.filter(Boolean);
|
|
12
|
+
if (activeHooks.length === 0)
|
|
13
|
+
return {};
|
|
14
|
+
if (activeHooks.length === 1)
|
|
15
|
+
return activeHooks[0];
|
|
16
|
+
return {
|
|
17
|
+
onOperationStart: (info) => {
|
|
18
|
+
for (const h of activeHooks) {
|
|
19
|
+
try {
|
|
20
|
+
h.onOperationStart?.(info);
|
|
21
|
+
}
|
|
22
|
+
catch { /* hooks must not interrupt */ }
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
onOperationEnd: (info, result) => {
|
|
26
|
+
for (const h of activeHooks) {
|
|
27
|
+
try {
|
|
28
|
+
h.onOperationEnd?.(info, result);
|
|
29
|
+
}
|
|
30
|
+
catch { /* hooks must not interrupt */ }
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
onRequestStart: (info) => {
|
|
34
|
+
for (const h of activeHooks) {
|
|
35
|
+
try {
|
|
36
|
+
h.onRequestStart?.(info);
|
|
37
|
+
}
|
|
38
|
+
catch { /* hooks must not interrupt */ }
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
onRequestEnd: (info, result) => {
|
|
42
|
+
for (const h of activeHooks) {
|
|
43
|
+
try {
|
|
44
|
+
h.onRequestEnd?.(info, result);
|
|
45
|
+
}
|
|
46
|
+
catch { /* hooks must not interrupt */ }
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
onRetry: (info, attempt, error, delayMs) => {
|
|
50
|
+
for (const h of activeHooks) {
|
|
51
|
+
try {
|
|
52
|
+
h.onRetry?.(info, attempt, error, delayMs);
|
|
53
|
+
}
|
|
54
|
+
catch { /* hooks must not interrupt */ }
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Creates hooks that log to the console.
|
|
61
|
+
*/
|
|
62
|
+
export function consoleHooks(options = {}) {
|
|
63
|
+
const { logOperations = true, logRequests = false, logRetries = true, minDurationMs = 0, logger = console, } = options;
|
|
64
|
+
return {
|
|
65
|
+
onOperationStart: logOperations
|
|
66
|
+
? (info) => {
|
|
67
|
+
const mutation = info.isMutation ? " [mutation]" : "";
|
|
68
|
+
const resource = info.resourceId ? ` #${info.resourceId}` : "";
|
|
69
|
+
const board = info.boardId ? ` (board: ${info.boardId})` : "";
|
|
70
|
+
logger.log(`[Fizzy] ${info.service}.${info.operation}${resource}${board}${mutation}`);
|
|
71
|
+
}
|
|
72
|
+
: undefined,
|
|
73
|
+
onOperationEnd: logOperations
|
|
74
|
+
? (info, result) => {
|
|
75
|
+
if (result.durationMs < minDurationMs)
|
|
76
|
+
return;
|
|
77
|
+
const duration = `${result.durationMs}ms`;
|
|
78
|
+
if (result.error) {
|
|
79
|
+
logger.error(`[Fizzy] ${info.service}.${info.operation} failed (${duration}):`, result.error.message);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
logger.log(`[Fizzy] ${info.service}.${info.operation} completed (${duration})`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
: undefined,
|
|
86
|
+
onRequestStart: logRequests
|
|
87
|
+
? (info) => {
|
|
88
|
+
const retry = info.attempt > 1 ? ` (attempt ${info.attempt})` : "";
|
|
89
|
+
logger.log(`[Fizzy] -> ${info.method} ${info.url}${retry}`);
|
|
90
|
+
}
|
|
91
|
+
: undefined,
|
|
92
|
+
onRequestEnd: logRequests
|
|
93
|
+
? (info, result) => {
|
|
94
|
+
if (result.durationMs < minDurationMs)
|
|
95
|
+
return;
|
|
96
|
+
const cache = result.fromCache ? " (cached)" : "";
|
|
97
|
+
const status = result.error ? "error" : result.statusCode;
|
|
98
|
+
logger.log(`[Fizzy] <- ${info.method} ${info.url} ${status} (${result.durationMs}ms)${cache}`);
|
|
99
|
+
}
|
|
100
|
+
: undefined,
|
|
101
|
+
onRetry: logRetries
|
|
102
|
+
? (info, attempt, error, delayMs) => {
|
|
103
|
+
logger.warn(`[Fizzy] Retrying ${info.method} ${info.url} (attempt ${attempt + 1}, waiting ${delayMs}ms): ${error.message}`);
|
|
104
|
+
}
|
|
105
|
+
: undefined,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Creates a no-op hooks object.
|
|
110
|
+
*/
|
|
111
|
+
export function noopHooks() {
|
|
112
|
+
return {};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Internal helper to safely invoke a hook.
|
|
116
|
+
*/
|
|
117
|
+
export function safeInvoke(hooks, hookName, ...args) {
|
|
118
|
+
if (!hooks)
|
|
119
|
+
return;
|
|
120
|
+
const hook = hooks[hookName];
|
|
121
|
+
if (!hook)
|
|
122
|
+
return;
|
|
123
|
+
try {
|
|
124
|
+
hook(...args);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.error(`Hook ${hookName} error:`, err);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAG,KAAmB;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,CAAC,CAAE,CAAC;IAErD,OAAO;QACL,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC/B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,CAAC,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAED,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,CAAC,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC7B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAaD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,WAAW,GAAG,KAAK,EACnB,UAAU,GAAG,IAAI,EACjB,aAAa,GAAG,CAAC,EACjB,MAAM,GAAG,OAAO,GACjB,GAAG,OAAO,CAAC;IAEZ,OAAO;QACL,gBAAgB,EAAE,aAAa;YAC7B,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;gBACP,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC;YACxF,CAAC;YACH,CAAC,CAAC,SAAS;QAEb,cAAc,EAAE,aAAa;YAC3B,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACf,IAAI,MAAM,CAAC,UAAU,GAAG,aAAa;oBAAE,OAAO;gBAC9C,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC;gBAC1C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,KAAK,CACV,WAAW,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,YAAY,QAAQ,IAAI,EACjE,MAAM,CAAC,KAAK,CAAC,OAAO,CACrB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,eAAe,QAAQ,GAAG,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;QAEb,cAAc,EAAE,WAAW;YACzB,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;gBACP,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;YACH,CAAC,CAAC,SAAS;QAEb,YAAY,EAAE,WAAW;YACvB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACf,IAAI,MAAM,CAAC,UAAU,GAAG,aAAa;oBAAE,OAAO;gBAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,KAAK,MAAM,CAAC,UAAU,MAAM,KAAK,EAAE,CAAC,CAAC;YACjG,CAAC;YACH,CAAC,CAAC,SAAS;QAEb,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChC,MAAM,CAAC,IAAI,CACT,oBAAoB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,aAAa,OAAO,GAAG,CAAC,aAAa,OAAO,QAAQ,KAAK,CAAC,OAAO,EAAE,CAC/G,CAAC;YACJ,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAA6B,EAC7B,QAAW,EACX,GAAG,IAA4C;IAE/C,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QACF,IAAkC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,QAAQ,QAAQ,SAAS,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fizzy TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Type-safe client for the Fizzy API.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createFizzyClient } from "@37signals/fizzy";
|
|
9
|
+
*
|
|
10
|
+
* const client = createFizzyClient({
|
|
11
|
+
* accessToken: process.env.FIZZY_TOKEN!,
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* // High-level service methods
|
|
15
|
+
* const boards = await client.boards.list();
|
|
16
|
+
* const card = await client.cards.create(boardId, {
|
|
17
|
+
* title: "Ship the feature",
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Or use low-level typed API calls
|
|
21
|
+
* const { data, error } = await client.GET("/boards.json");
|
|
22
|
+
*
|
|
23
|
+
* if (data) {
|
|
24
|
+
* console.log(data.map(b => b.name));
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
export { createFizzyClient, VERSION, API_VERSION, type FizzyClient, type FizzyClientOptions, type TokenProvider, type RawClient, } from "./client.js";
|
|
31
|
+
export { type AuthStrategy, BearerAuth, bearerAuth } from "./auth-strategy.js";
|
|
32
|
+
export { CookieAuth, cookieAuth, type CookieProvider } from "./auth/cookie-auth.js";
|
|
33
|
+
export { MagicLinkFlow, type MagicLinkFlowOptions, type MagicLinkRequestResult, type MagicLinkRedeemResult } from "./auth/magic-link.js";
|
|
34
|
+
export { fetchAllPages, paginateAll } from "./client.js";
|
|
35
|
+
export { ListResult, type ListMeta, type PaginationOptions } from "./pagination.js";
|
|
36
|
+
export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
|
|
37
|
+
export { FizzyError, Errors, errorFromResponse, isFizzyError, isErrorCode, type ErrorCode, type FizzyErrorOptions, } from "./errors.js";
|
|
38
|
+
export { chainHooks, consoleHooks, noopHooks, safeInvoke, type FizzyHooks, type OperationInfo, type RequestInfo, type RequestResult, type OperationResult, type ConsoleHooksOptions, } from "./hooks.js";
|
|
39
|
+
export { BaseService, type FetchResponse } from "./services/base.js";
|
|
40
|
+
export { IdentityService, type Identity, } from "./generated/services/identity.js";
|
|
41
|
+
export { BoardsService, type Board, type CreateBoardRequest, type UpdateBoardRequest, } from "./generated/services/boards.js";
|
|
42
|
+
export { ColumnsService, type Column, type CreateColumnRequest, type UpdateColumnRequest, } from "./generated/services/columns.js";
|
|
43
|
+
export { CardsService, type Card, type CreateCardRequest, type UpdateCardRequest, type MoveCardRequest, type AssignCardRequest, type TagCardRequest, } from "./generated/services/cards.js";
|
|
44
|
+
export { CommentsService, type Comment, type CreateCommentRequest, type UpdateCommentRequest, } from "./generated/services/comments.js";
|
|
45
|
+
export { StepsService, type Step, type CreateStepRequest, type UpdateStepRequest, } from "./generated/services/steps.js";
|
|
46
|
+
export { ReactionsService, type Reaction, type CreateCardReactionRequest, type CreateCommentReactionRequest, } from "./generated/services/reactions.js";
|
|
47
|
+
export { NotificationsService, type Notification, } from "./generated/services/notifications.js";
|
|
48
|
+
export { TagsService, type Tag, } from "./generated/services/tags.js";
|
|
49
|
+
export { UsersService, type User, type UpdateUserRequest, } from "./generated/services/users.js";
|
|
50
|
+
export { PinsService, } from "./generated/services/pins.js";
|
|
51
|
+
export { UploadsService, type DirectUpload, type CreateDirectUploadRequest, } from "./generated/services/uploads.js";
|
|
52
|
+
export { WebhooksService, type Webhook, type CreateWebhookRequest, type UpdateWebhookRequest, } from "./generated/services/webhooks.js";
|
|
53
|
+
export { SessionsService, type CreateSessionRequest, type RedeemMagicLinkRequest, type CompleteSignupRequest, } from "./generated/services/sessions.js";
|
|
54
|
+
export { DevicesService, type RegisterDeviceRequest, } from "./generated/services/devices.js";
|
|
55
|
+
export { MiscellaneousService, type CreateAccessTokenRequest, type UpdateAccountEntropyRequest, type UpdateJoinCodeRequest, type UpdateAccountSettingsRequest, type UpdateBoardEntropyRequest, type UpdateBoardInvolvementRequest, type UpdateNotificationSettingsRequest, type CreatePushSubscriptionRequest, type UpdateUserRoleRequest, } from "./generated/services/miscellaneous.js";
|
|
56
|
+
export { WebhookReceiver, WebhookVerificationError, type WebhookEvent, type WebhookEventHandler, type WebhookMiddleware, type WebhookReceiverOptions, type HeaderAccessor, } from "./webhooks/handler.js";
|
|
57
|
+
export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
|
|
58
|
+
export { ETagCache, type ETagCacheOptions } from "./cache/etag-cache.js";
|
|
59
|
+
export { CircuitBreaker, type CircuitBreakerOptions, Bulkhead, type BulkheadOptions, RateLimiter, type RateLimiterOptions, type ResilienceConfig, createResilienceComponents, resilienceHooks, } from "./resilience/index.js";
|
|
60
|
+
export { gatingHooks, type GatingHooks, } from "./hooks/gating.js";
|
|
61
|
+
export { otelHooks, type OtelHooksOptions, } from "./hooks/otel.js";
|
|
62
|
+
export { redactHeaders, redactHeadersRecord, } from "./security.js";
|
|
63
|
+
export type { paths } from "./generated/schema.js";
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fizzy TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Type-safe client for the Fizzy API.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createFizzyClient } from "@37signals/fizzy";
|
|
9
|
+
*
|
|
10
|
+
* const client = createFizzyClient({
|
|
11
|
+
* accessToken: process.env.FIZZY_TOKEN!,
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* // High-level service methods
|
|
15
|
+
* const boards = await client.boards.list();
|
|
16
|
+
* const card = await client.cards.create(boardId, {
|
|
17
|
+
* title: "Ship the feature",
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Or use low-level typed API calls
|
|
21
|
+
* const { data, error } = await client.GET("/boards.json");
|
|
22
|
+
*
|
|
23
|
+
* if (data) {
|
|
24
|
+
* console.log(data.map(b => b.name));
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
// Main client factory
|
|
31
|
+
export { createFizzyClient, VERSION, API_VERSION, } from "./client.js";
|
|
32
|
+
// Authentication strategies
|
|
33
|
+
export { BearerAuth, bearerAuth } from "./auth-strategy.js";
|
|
34
|
+
export { CookieAuth, cookieAuth } from "./auth/cookie-auth.js";
|
|
35
|
+
export { MagicLinkFlow } from "./auth/magic-link.js";
|
|
36
|
+
// Pagination helpers
|
|
37
|
+
export { fetchAllPages, paginateAll } from "./client.js";
|
|
38
|
+
// Pagination types and utilities
|
|
39
|
+
export { ListResult } from "./pagination.js";
|
|
40
|
+
export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
|
|
41
|
+
// Errors
|
|
42
|
+
export { FizzyError, Errors, errorFromResponse, isFizzyError, isErrorCode, } from "./errors.js";
|
|
43
|
+
// Hooks
|
|
44
|
+
export { chainHooks, consoleHooks, noopHooks, safeInvoke, } from "./hooks.js";
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// Services - Generated from OpenAPI spec (spec-driven)
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Base service (for extending)
|
|
49
|
+
export { BaseService } from "./services/base.js";
|
|
50
|
+
// Identity service
|
|
51
|
+
export { IdentityService, } from "./generated/services/identity.js";
|
|
52
|
+
// Core services
|
|
53
|
+
export { BoardsService, } from "./generated/services/boards.js";
|
|
54
|
+
export { ColumnsService, } from "./generated/services/columns.js";
|
|
55
|
+
export { CardsService, } from "./generated/services/cards.js";
|
|
56
|
+
export { CommentsService, } from "./generated/services/comments.js";
|
|
57
|
+
export { StepsService, } from "./generated/services/steps.js";
|
|
58
|
+
export { ReactionsService, } from "./generated/services/reactions.js";
|
|
59
|
+
export { NotificationsService, } from "./generated/services/notifications.js";
|
|
60
|
+
export { TagsService, } from "./generated/services/tags.js";
|
|
61
|
+
export { UsersService, } from "./generated/services/users.js";
|
|
62
|
+
export { PinsService, } from "./generated/services/pins.js";
|
|
63
|
+
export { UploadsService, } from "./generated/services/uploads.js";
|
|
64
|
+
// Webhooks management service
|
|
65
|
+
export { WebhooksService, } from "./generated/services/webhooks.js";
|
|
66
|
+
// Sessions service
|
|
67
|
+
export { SessionsService, } from "./generated/services/sessions.js";
|
|
68
|
+
// Devices service
|
|
69
|
+
export { DevicesService, } from "./generated/services/devices.js";
|
|
70
|
+
// Miscellaneous service (access tokens, account/board settings, entropy, etc.)
|
|
71
|
+
export { MiscellaneousService, } from "./generated/services/miscellaneous.js";
|
|
72
|
+
// =============================================================================
|
|
73
|
+
// Webhook Receiving Infrastructure (hand-written, framework-agnostic)
|
|
74
|
+
// =============================================================================
|
|
75
|
+
export { WebhookReceiver, WebhookVerificationError, } from "./webhooks/handler.js";
|
|
76
|
+
export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Cache
|
|
79
|
+
// =============================================================================
|
|
80
|
+
export { ETagCache } from "./cache/etag-cache.js";
|
|
81
|
+
// =============================================================================
|
|
82
|
+
// Resilience
|
|
83
|
+
// =============================================================================
|
|
84
|
+
export { CircuitBreaker, Bulkhead, RateLimiter, createResilienceComponents, resilienceHooks, } from "./resilience/index.js";
|
|
85
|
+
// =============================================================================
|
|
86
|
+
// Gating hooks (circuit breaker, rate limiter integration)
|
|
87
|
+
// =============================================================================
|
|
88
|
+
export { gatingHooks, } from "./hooks/gating.js";
|
|
89
|
+
// =============================================================================
|
|
90
|
+
// OpenTelemetry hooks
|
|
91
|
+
// =============================================================================
|
|
92
|
+
export { otelHooks, } from "./hooks/otel.js";
|
|
93
|
+
// =============================================================================
|
|
94
|
+
// Security Utilities
|
|
95
|
+
// =============================================================================
|
|
96
|
+
export { redactHeaders, redactHeadersRecord, } from "./security.js";
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to its own module to avoid circular dependencies between
|
|
5
|
+
* client.ts (which imports generated services) and base.ts (which
|
|
6
|
+
* generated services extend).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parses the next URL from a Link header.
|
|
10
|
+
* Looks for rel="next" in the header value.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseNextLink(linkHeader: string | null): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a possibly-relative URL against a base URL.
|
|
15
|
+
* If target is already absolute, it is returned unchanged.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveURL(base: string, target: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Checks whether two absolute URLs share the same origin (scheme + host + port).
|
|
20
|
+
*/
|
|
21
|
+
export declare function isSameOrigin(a: string, b: string): boolean;
|
|
22
|
+
//# sourceMappingURL=pagination-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination-utils.d.ts","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CActE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to its own module to avoid circular dependencies between
|
|
5
|
+
* client.ts (which imports generated services) and base.ts (which
|
|
6
|
+
* generated services extend).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parses the next URL from a Link header.
|
|
10
|
+
* Looks for rel="next" in the header value.
|
|
11
|
+
*/
|
|
12
|
+
export function parseNextLink(linkHeader) {
|
|
13
|
+
if (!linkHeader)
|
|
14
|
+
return null;
|
|
15
|
+
for (const part of linkHeader.split(",")) {
|
|
16
|
+
const trimmed = part.trim();
|
|
17
|
+
if (trimmed.includes('rel="next"')) {
|
|
18
|
+
const start = trimmed.indexOf("<");
|
|
19
|
+
const end = trimmed.indexOf(">", start);
|
|
20
|
+
if (start !== -1 && end !== -1)
|
|
21
|
+
return trimmed.slice(start + 1, end);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolves a possibly-relative URL against a base URL.
|
|
29
|
+
* If target is already absolute, it is returned unchanged.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveURL(base, target) {
|
|
32
|
+
try {
|
|
33
|
+
return new URL(target, base).href;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return target;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks whether two absolute URLs share the same origin (scheme + host + port).
|
|
41
|
+
*/
|
|
42
|
+
export function isSameOrigin(a, b) {
|
|
43
|
+
try {
|
|
44
|
+
const urlA = new URL(a);
|
|
45
|
+
const urlB = new URL(b);
|
|
46
|
+
return urlA.origin === urlB.origin;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=pagination-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination-utils.js","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination types and utilities for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides ListResult (an Array subclass with metadata) and pagination options.
|
|
5
|
+
* Fizzy does not emit X-Total-Count headers — totalCount is not available.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Metadata about a paginated list response.
|
|
9
|
+
* Note: Fizzy does not provide a total count header.
|
|
10
|
+
*/
|
|
11
|
+
export interface ListMeta {
|
|
12
|
+
/** True when results were truncated (by maxItems or page safety cap). */
|
|
13
|
+
readonly truncated: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Options for controlling pagination behavior.
|
|
17
|
+
*/
|
|
18
|
+
export interface PaginationOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Maximum number of items to return across all pages.
|
|
21
|
+
* When undefined or 0, all pages are fetched.
|
|
22
|
+
*/
|
|
23
|
+
maxItems?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* An array of results with pagination metadata.
|
|
27
|
+
*
|
|
28
|
+
* Extends Array<T> so it's fully backwards-compatible: works with
|
|
29
|
+
* .forEach(), .map(), spread, .length, indexing, and Array.isArray().
|
|
30
|
+
* Additional metadata is accessible via the `.meta` property.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ListResult<T> extends Array<T> {
|
|
33
|
+
readonly meta: ListMeta;
|
|
34
|
+
static get [Symbol.species](): ArrayConstructor;
|
|
35
|
+
constructor(items: T[], meta: ListMeta);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAExB,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ;CAUvC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination types and utilities for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides ListResult (an Array subclass with metadata) and pagination options.
|
|
5
|
+
* Fizzy does not emit X-Total-Count headers — totalCount is not available.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* An array of results with pagination metadata.
|
|
9
|
+
*
|
|
10
|
+
* Extends Array<T> so it's fully backwards-compatible: works with
|
|
11
|
+
* .forEach(), .map(), spread, .length, indexing, and Array.isArray().
|
|
12
|
+
* Additional metadata is accessible via the `.meta` property.
|
|
13
|
+
*/
|
|
14
|
+
export class ListResult extends Array {
|
|
15
|
+
meta;
|
|
16
|
+
static get [Symbol.species]() {
|
|
17
|
+
return Array;
|
|
18
|
+
}
|
|
19
|
+
constructor(items, meta) {
|
|
20
|
+
super(0);
|
|
21
|
+
if (items.length > 0) {
|
|
22
|
+
this.length = items.length;
|
|
23
|
+
for (let i = 0; i < items.length; i++) {
|
|
24
|
+
this[i] = items[i];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
this.meta = meta;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH;;;;;;GAMG;AACH,MAAM,OAAO,UAAc,SAAQ,KAAQ;IAChC,IAAI,CAAW;IAExB,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,KAAU,EAAE,IAAc;QACpC,KAAK,CAAC,CAAC,CAAC,CAAC;QACT,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulkhead (concurrency limiter) for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Limits the number of concurrent in-flight requests to prevent
|
|
5
|
+
* resource exhaustion and provide backpressure.
|
|
6
|
+
*/
|
|
7
|
+
export interface BulkheadOptions {
|
|
8
|
+
/** Maximum concurrent executions (default: 10) */
|
|
9
|
+
maxConcurrent?: number;
|
|
10
|
+
/** Maximum queue size for waiting requests (default: 100, 0 = no queue) */
|
|
11
|
+
maxQueue?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Concurrency limiter that queues excess requests.
|
|
15
|
+
*/
|
|
16
|
+
export declare class Bulkhead {
|
|
17
|
+
private active;
|
|
18
|
+
private readonly queue;
|
|
19
|
+
private readonly maxConcurrent;
|
|
20
|
+
private readonly maxQueue;
|
|
21
|
+
constructor(options?: BulkheadOptions);
|
|
22
|
+
/** Number of currently active executions. */
|
|
23
|
+
get activeCount(): number;
|
|
24
|
+
/** Number of requests waiting in the queue. */
|
|
25
|
+
get queueLength(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Execute a function with concurrency limiting.
|
|
28
|
+
* If at capacity, queues the request. If the queue is full, rejects immediately.
|
|
29
|
+
*/
|
|
30
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
31
|
+
private acquire;
|
|
32
|
+
private release;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=bulkhead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkhead.d.ts","sourceRoot":"","sources":["../../src/resilience/bulkhead.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,CAAC,EAAE,eAAe;IAKrC,6CAA6C;IAC7C,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,+CAA+C;IAC/C,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;OAGG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASlD,OAAO,CAAC,OAAO;IAmBf,OAAO,CAAC,OAAO;CAQhB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulkhead (concurrency limiter) for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Limits the number of concurrent in-flight requests to prevent
|
|
5
|
+
* resource exhaustion and provide backpressure.
|
|
6
|
+
*/
|
|
7
|
+
import { FizzyError } from "../errors.js";
|
|
8
|
+
/**
|
|
9
|
+
* Concurrency limiter that queues excess requests.
|
|
10
|
+
*/
|
|
11
|
+
export class Bulkhead {
|
|
12
|
+
active = 0;
|
|
13
|
+
queue = [];
|
|
14
|
+
maxConcurrent;
|
|
15
|
+
maxQueue;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.maxConcurrent = options?.maxConcurrent ?? 10;
|
|
18
|
+
this.maxQueue = options?.maxQueue ?? 100;
|
|
19
|
+
}
|
|
20
|
+
/** Number of currently active executions. */
|
|
21
|
+
get activeCount() {
|
|
22
|
+
return this.active;
|
|
23
|
+
}
|
|
24
|
+
/** Number of requests waiting in the queue. */
|
|
25
|
+
get queueLength() {
|
|
26
|
+
return this.queue.length;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Execute a function with concurrency limiting.
|
|
30
|
+
* If at capacity, queues the request. If the queue is full, rejects immediately.
|
|
31
|
+
*/
|
|
32
|
+
async execute(fn) {
|
|
33
|
+
await this.acquire();
|
|
34
|
+
try {
|
|
35
|
+
return await fn();
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
this.release();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
acquire() {
|
|
42
|
+
if (this.active < this.maxConcurrent) {
|
|
43
|
+
this.active++;
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
}
|
|
46
|
+
if (this.queue.length >= this.maxQueue) {
|
|
47
|
+
return Promise.reject(new FizzyError("api_error", "Bulkhead queue full — too many concurrent requests", {
|
|
48
|
+
hint: "Reduce concurrency or increase bulkhead limits",
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
this.queue.push({ resolve, reject });
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
release() {
|
|
56
|
+
const next = this.queue.shift();
|
|
57
|
+
if (next) {
|
|
58
|
+
next.resolve();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.active--;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=bulkhead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkhead.js","sourceRoot":"","sources":["../../src/resilience/bulkhead.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C;;GAEG;AACH,MAAM,OAAO,QAAQ;IACX,MAAM,GAAG,CAAC,CAAC;IACF,KAAK,GAAiB,EAAE,CAAC;IACzB,aAAa,CAAS;IACtB,QAAQ,CAAS;IAElC,YAAY,OAAyB;QACnC,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;IAC3C,CAAC;IAED,6CAA6C;IAC7C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,+CAA+C;IAC/C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,UAAU,CAAC,WAAW,EAAE,oDAAoD,EAAE;gBAChF,IAAI,EAAE,gDAAgD;aACvD,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker for the Fizzy SDK.
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by tracking error rates and temporarily
|
|
5
|
+
* stopping requests when the failure threshold is exceeded.
|
|
6
|
+
*/
|
|
7
|
+
export type CircuitState = "closed" | "open" | "half-open";
|
|
8
|
+
export interface CircuitBreakerOptions {
|
|
9
|
+
/** Number of failures before opening the circuit (default: 5) */
|
|
10
|
+
failureThreshold?: number;
|
|
11
|
+
/** Time in ms before attempting to half-open (default: 30000) */
|
|
12
|
+
resetTimeoutMs?: number;
|
|
13
|
+
/** Number of successful requests to close from half-open (default: 1) */
|
|
14
|
+
successThreshold?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Circuit breaker implementation using the standard closed/open/half-open pattern.
|
|
18
|
+
*/
|
|
19
|
+
export declare class CircuitBreaker {
|
|
20
|
+
private state;
|
|
21
|
+
private failureCount;
|
|
22
|
+
private successCount;
|
|
23
|
+
private lastFailureTime;
|
|
24
|
+
private readonly failureThreshold;
|
|
25
|
+
private readonly resetTimeoutMs;
|
|
26
|
+
private readonly successThreshold;
|
|
27
|
+
constructor(options?: CircuitBreakerOptions);
|
|
28
|
+
/** Current circuit state. */
|
|
29
|
+
get currentState(): CircuitState;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a request is allowed through the circuit.
|
|
32
|
+
* Returns true if the circuit is closed or half-open.
|
|
33
|
+
*/
|
|
34
|
+
allowRequest(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Record a successful request.
|
|
37
|
+
*/
|
|
38
|
+
recordSuccess(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Record a failed request.
|
|
41
|
+
*/
|
|
42
|
+
recordFailure(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Reset the circuit breaker to closed state.
|
|
45
|
+
*/
|
|
46
|
+
reset(): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/resilience/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,CAAC,EAAE,qBAAqB;IAM3C,6BAA6B;IAC7B,IAAI,YAAY,IAAI,YAAY,CAK/B;IAED;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,aAAa,IAAI,IAAI;IAarB;;OAEG;IACH,aAAa,IAAI,IAAI;IAUrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd"}
|