@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.
Files changed (199) hide show
  1. package/dist/auth/cookie-auth.d.ts +25 -0
  2. package/dist/auth/cookie-auth.d.ts.map +1 -0
  3. package/dist/auth/cookie-auth.js +29 -0
  4. package/dist/auth/cookie-auth.js.map +1 -0
  5. package/dist/auth/magic-link.d.ts +66 -0
  6. package/dist/auth/magic-link.d.ts.map +1 -0
  7. package/dist/auth/magic-link.js +78 -0
  8. package/dist/auth/magic-link.js.map +1 -0
  9. package/dist/auth-strategy.d.ts +32 -0
  10. package/dist/auth-strategy.d.ts.map +1 -0
  11. package/dist/auth-strategy.js +29 -0
  12. package/dist/auth-strategy.js.map +1 -0
  13. package/dist/cache/etag-cache.d.ts +49 -0
  14. package/dist/cache/etag-cache.d.ts.map +1 -0
  15. package/dist/cache/etag-cache.js +95 -0
  16. package/dist/cache/etag-cache.js.map +1 -0
  17. package/dist/client.d.ts +92 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +505 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/errors.d.ts +68 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +187 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/generated/metadata.json +1272 -0
  26. package/dist/generated/openapi-stripped.json +12446 -0
  27. package/dist/generated/path-mapping.d.ts +8 -0
  28. package/dist/generated/path-mapping.d.ts.map +1 -0
  29. package/dist/generated/path-mapping.js +124 -0
  30. package/dist/generated/path-mapping.js.map +1 -0
  31. package/dist/generated/path-mapping.ts +135 -0
  32. package/dist/generated/schema.d.ts +10272 -0
  33. package/dist/generated/services/boards.d.ts +56 -0
  34. package/dist/generated/services/boards.d.ts.map +1 -0
  35. package/dist/generated/services/boards.js +100 -0
  36. package/dist/generated/services/boards.js.map +1 -0
  37. package/dist/generated/services/boards.ts +152 -0
  38. package/dist/generated/services/cards.d.ts +164 -0
  39. package/dist/generated/services/cards.d.ts.map +1 -0
  40. package/dist/generated/services/cards.js +353 -0
  41. package/dist/generated/services/cards.js.map +1 -0
  42. package/dist/generated/services/cards.ts +522 -0
  43. package/dist/generated/services/columns.d.ts +45 -0
  44. package/dist/generated/services/columns.d.ts.map +1 -0
  45. package/dist/generated/services/columns.js +77 -0
  46. package/dist/generated/services/columns.js.map +1 -0
  47. package/dist/generated/services/columns.ts +116 -0
  48. package/dist/generated/services/comments.d.ts +42 -0
  49. package/dist/generated/services/comments.d.ts.map +1 -0
  50. package/dist/generated/services/comments.js +77 -0
  51. package/dist/generated/services/comments.js.map +1 -0
  52. package/dist/generated/services/comments.ts +114 -0
  53. package/dist/generated/services/devices.d.ts +24 -0
  54. package/dist/generated/services/devices.d.ts.map +1 -0
  55. package/dist/generated/services/devices.js +36 -0
  56. package/dist/generated/services/devices.js.map +1 -0
  57. package/dist/generated/services/devices.ts +53 -0
  58. package/dist/generated/services/identity.d.ts +16 -0
  59. package/dist/generated/services/identity.d.ts.map +1 -0
  60. package/dist/generated/services/identity.js +21 -0
  61. package/dist/generated/services/identity.js.map +1 -0
  62. package/dist/generated/services/identity.ts +30 -0
  63. package/dist/generated/services/index.d.ts +17 -0
  64. package/dist/generated/services/index.d.ts.map +1 -0
  65. package/dist/generated/services/index.js +17 -0
  66. package/dist/generated/services/index.js.map +1 -0
  67. package/dist/generated/services/index.ts +16 -0
  68. package/dist/generated/services/miscellaneous.d.ts +136 -0
  69. package/dist/generated/services/miscellaneous.d.ts.map +1 -0
  70. package/dist/generated/services/miscellaneous.js +301 -0
  71. package/dist/generated/services/miscellaneous.js.map +1 -0
  72. package/dist/generated/services/miscellaneous.ts +443 -0
  73. package/dist/generated/services/notifications.d.ts +42 -0
  74. package/dist/generated/services/notifications.d.ts.map +1 -0
  75. package/dist/generated/services/notifications.js +75 -0
  76. package/dist/generated/services/notifications.js.map +1 -0
  77. package/dist/generated/services/notifications.ts +113 -0
  78. package/dist/generated/services/pins.d.ts +16 -0
  79. package/dist/generated/services/pins.d.ts.map +1 -0
  80. package/dist/generated/services/pins.js +21 -0
  81. package/dist/generated/services/pins.js.map +1 -0
  82. package/dist/generated/services/pins.ts +29 -0
  83. package/dist/generated/services/reactions.d.ts +45 -0
  84. package/dist/generated/services/reactions.d.ts.map +1 -0
  85. package/dist/generated/services/reactions.js +90 -0
  86. package/dist/generated/services/reactions.js.map +1 -0
  87. package/dist/generated/services/reactions.ts +129 -0
  88. package/dist/generated/services/sessions.d.ts +44 -0
  89. package/dist/generated/services/sessions.d.ts.map +1 -0
  90. package/dist/generated/services/sessions.js +73 -0
  91. package/dist/generated/services/sessions.js.map +1 -0
  92. package/dist/generated/services/sessions.ts +113 -0
  93. package/dist/generated/services/steps.d.ts +43 -0
  94. package/dist/generated/services/steps.d.ts.map +1 -0
  95. package/dist/generated/services/steps.js +77 -0
  96. package/dist/generated/services/steps.js.map +1 -0
  97. package/dist/generated/services/steps.ts +114 -0
  98. package/dist/generated/services/tags.d.ts +17 -0
  99. package/dist/generated/services/tags.d.ts.map +1 -0
  100. package/dist/generated/services/tags.js +21 -0
  101. package/dist/generated/services/tags.js.map +1 -0
  102. package/dist/generated/services/tags.ts +32 -0
  103. package/dist/generated/services/uploads.d.ts +22 -0
  104. package/dist/generated/services/uploads.d.ts.map +1 -0
  105. package/dist/generated/services/uploads.js +23 -0
  106. package/dist/generated/services/uploads.js.map +1 -0
  107. package/dist/generated/services/uploads.ts +38 -0
  108. package/dist/generated/services/users.d.ts +33 -0
  109. package/dist/generated/services/users.d.ts.map +1 -0
  110. package/dist/generated/services/users.js +61 -0
  111. package/dist/generated/services/users.js.map +1 -0
  112. package/dist/generated/services/users.ts +89 -0
  113. package/dist/generated/services/webhooks.d.ts +49 -0
  114. package/dist/generated/services/webhooks.d.ts.map +1 -0
  115. package/dist/generated/services/webhooks.js +90 -0
  116. package/dist/generated/services/webhooks.js.map +1 -0
  117. package/dist/generated/services/webhooks.ts +133 -0
  118. package/dist/hooks/gating.d.ts +35 -0
  119. package/dist/hooks/gating.d.ts.map +1 -0
  120. package/dist/hooks/gating.js +58 -0
  121. package/dist/hooks/gating.js.map +1 -0
  122. package/dist/hooks/otel.d.ts +49 -0
  123. package/dist/hooks/otel.d.ts.map +1 -0
  124. package/dist/hooks/otel.js +171 -0
  125. package/dist/hooks/otel.js.map +1 -0
  126. package/dist/hooks.d.ts +99 -0
  127. package/dist/hooks.d.ts.map +1 -0
  128. package/dist/hooks.js +130 -0
  129. package/dist/hooks.js.map +1 -0
  130. package/dist/index.d.ts +64 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +97 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/pagination-utils.d.ts +22 -0
  135. package/dist/pagination-utils.d.ts.map +1 -0
  136. package/dist/pagination-utils.js +52 -0
  137. package/dist/pagination-utils.js.map +1 -0
  138. package/dist/pagination.d.ts +37 -0
  139. package/dist/pagination.d.ts.map +1 -0
  140. package/dist/pagination.js +30 -0
  141. package/dist/pagination.js.map +1 -0
  142. package/dist/resilience/bulkhead.d.ts +34 -0
  143. package/dist/resilience/bulkhead.d.ts.map +1 -0
  144. package/dist/resilience/bulkhead.js +65 -0
  145. package/dist/resilience/bulkhead.js.map +1 -0
  146. package/dist/resilience/circuit-breaker.d.ts +48 -0
  147. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  148. package/dist/resilience/circuit-breaker.js +74 -0
  149. package/dist/resilience/circuit-breaker.js.map +1 -0
  150. package/dist/resilience/index.d.ts +41 -0
  151. package/dist/resilience/index.d.ts.map +1 -0
  152. package/dist/resilience/index.js +46 -0
  153. package/dist/resilience/index.js.map +1 -0
  154. package/dist/resilience/rate-limiter.d.ts +38 -0
  155. package/dist/resilience/rate-limiter.d.ts.map +1 -0
  156. package/dist/resilience/rate-limiter.js +69 -0
  157. package/dist/resilience/rate-limiter.js.map +1 -0
  158. package/dist/security.d.ts +19 -0
  159. package/dist/security.d.ts.map +1 -0
  160. package/dist/security.js +55 -0
  161. package/dist/security.js.map +1 -0
  162. package/dist/services/base.d.ts +51 -0
  163. package/dist/services/base.d.ts.map +1 -0
  164. package/dist/services/base.js +146 -0
  165. package/dist/services/base.js.map +1 -0
  166. package/dist/webhooks/handler.d.ts +62 -0
  167. package/dist/webhooks/handler.d.ts.map +1 -0
  168. package/dist/webhooks/handler.js +204 -0
  169. package/dist/webhooks/handler.js.map +1 -0
  170. package/dist/webhooks/index.d.ts +3 -0
  171. package/dist/webhooks/index.d.ts.map +1 -0
  172. package/dist/webhooks/index.js +3 -0
  173. package/dist/webhooks/index.js.map +1 -0
  174. package/dist/webhooks/verify.d.ts +10 -0
  175. package/dist/webhooks/verify.d.ts.map +1 -0
  176. package/dist/webhooks/verify.js +23 -0
  177. package/dist/webhooks/verify.js.map +1 -0
  178. package/package.json +67 -0
  179. package/src/generated/metadata.json +1272 -0
  180. package/src/generated/openapi-stripped.json +12446 -0
  181. package/src/generated/path-mapping.ts +135 -0
  182. package/src/generated/schema.d.ts +10272 -0
  183. package/src/generated/services/boards.ts +152 -0
  184. package/src/generated/services/cards.ts +522 -0
  185. package/src/generated/services/columns.ts +116 -0
  186. package/src/generated/services/comments.ts +114 -0
  187. package/src/generated/services/devices.ts +53 -0
  188. package/src/generated/services/identity.ts +30 -0
  189. package/src/generated/services/index.ts +16 -0
  190. package/src/generated/services/miscellaneous.ts +443 -0
  191. package/src/generated/services/notifications.ts +113 -0
  192. package/src/generated/services/pins.ts +29 -0
  193. package/src/generated/services/reactions.ts +129 -0
  194. package/src/generated/services/sessions.ts +113 -0
  195. package/src/generated/services/steps.ts +114 -0
  196. package/src/generated/services/tags.ts +32 -0
  197. package/src/generated/services/uploads.ts +38 -0
  198. package/src/generated/services/users.ts +89 -0
  199. package/src/generated/services/webhooks.ts +133 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Webhooks service for the Fizzy API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ * Run `npm run generate` to regenerate.
6
+ */
7
+ import { BaseService } from "../../services/base.js";
8
+ export class WebhooksService extends BaseService {
9
+ /**
10
+ * ListWebhooks
11
+ */
12
+ async list(boardId) {
13
+ return this.request({
14
+ service: "Webhooks",
15
+ operation: "ListWebhooks",
16
+ resourceType: "webhooks",
17
+ isMutation: false,
18
+ }, () => this.client.GET("/boards/{boardId}/webhooks.json", {
19
+ params: { path: { boardId } },
20
+ }));
21
+ }
22
+ /**
23
+ * CreateWebhook
24
+ */
25
+ async create(boardId, body) {
26
+ return this.request({
27
+ service: "Webhook",
28
+ operation: "CreateWebhook",
29
+ resourceType: "webhook",
30
+ isMutation: true,
31
+ }, () => this.client.POST("/boards/{boardId}/webhooks.json", {
32
+ params: { path: { boardId } },
33
+ body: { name: body.name, url: body.url, subscribed_actions: body.subscribedActions },
34
+ }));
35
+ }
36
+ /**
37
+ * DeleteWebhook
38
+ */
39
+ async delete(boardId, webhookId) {
40
+ return this.request({
41
+ service: "Webhook",
42
+ operation: "DeleteWebhook",
43
+ resourceType: "webhook",
44
+ isMutation: true,
45
+ }, () => this.client.DELETE("/boards/{boardId}/webhooks/{webhookId}", {
46
+ params: { path: { boardId, webhookId } },
47
+ }));
48
+ }
49
+ /**
50
+ * GetWebhook
51
+ */
52
+ async get(boardId, webhookId) {
53
+ return this.request({
54
+ service: "Webhook",
55
+ operation: "GetWebhook",
56
+ resourceType: "webhook",
57
+ isMutation: false,
58
+ }, () => this.client.GET("/boards/{boardId}/webhooks/{webhookId}", {
59
+ params: { path: { boardId, webhookId } },
60
+ }));
61
+ }
62
+ /**
63
+ * UpdateWebhook
64
+ */
65
+ async update(boardId, webhookId, body) {
66
+ return this.request({
67
+ service: "Webhook",
68
+ operation: "UpdateWebhook",
69
+ resourceType: "webhook",
70
+ isMutation: true,
71
+ }, () => this.client.PATCH("/boards/{boardId}/webhooks/{webhookId}", {
72
+ params: { path: { boardId, webhookId } },
73
+ body: { name: body?.name, url: body?.url, subscribed_actions: body?.subscribedActions },
74
+ }));
75
+ }
76
+ /**
77
+ * ActivateWebhook
78
+ */
79
+ async activate(boardId, webhookId) {
80
+ return this.request({
81
+ service: "Webhook",
82
+ operation: "ActivateWebhook",
83
+ resourceType: "webhook",
84
+ isMutation: true,
85
+ }, () => this.client.POST("/boards/{boardId}/webhooks/{webhookId}/activation.json", {
86
+ params: { path: { boardId, webhookId } },
87
+ }));
88
+ }
89
+ }
90
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/generated/services/webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Webhooks service for the Fizzy API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ * Run `npm run generate` to regenerate.
6
+ */
7
+
8
+ import { BaseService, type FetchResponse } from "../../services/base.js";
9
+ import { ListResult, type PaginationOptions } from "../../pagination.js";
10
+ import type { components } from "../schema.js";
11
+
12
+ export type Webhook = components["schemas"]["Webhook"];
13
+
14
+ export interface CreateWebhookRequest {
15
+ /** Display name */
16
+ name: string;
17
+ url: string;
18
+ subscribedActions?: string[];
19
+ }
20
+
21
+ export interface UpdateWebhookRequest {
22
+ /** Display name */
23
+ name?: string;
24
+ url?: string;
25
+ subscribedActions?: string[];
26
+ }
27
+
28
+ export class WebhooksService extends BaseService {
29
+
30
+ /**
31
+ * ListWebhooks
32
+ */
33
+ async list(boardId: string): Promise<ListResult<Webhook>> {
34
+ return this.request(
35
+ {
36
+ service: "Webhooks",
37
+ operation: "ListWebhooks",
38
+ resourceType: "webhooks",
39
+ isMutation: false,
40
+ },
41
+ () => this.client.GET("/boards/{boardId}/webhooks.json" as never, {
42
+ params: { path: { boardId } },
43
+ } as never),
44
+ );
45
+ }
46
+
47
+ /**
48
+ * CreateWebhook
49
+ */
50
+ async create(boardId: string, body: CreateWebhookRequest): Promise<Webhook> {
51
+ return this.request(
52
+ {
53
+ service: "Webhook",
54
+ operation: "CreateWebhook",
55
+ resourceType: "webhook",
56
+ isMutation: true,
57
+ },
58
+ () => this.client.POST("/boards/{boardId}/webhooks.json" as never, {
59
+ params: { path: { boardId } },
60
+ body: { name: body.name, url: body.url, subscribed_actions: body.subscribedActions } as never,
61
+ } as never),
62
+ );
63
+ }
64
+
65
+ /**
66
+ * DeleteWebhook
67
+ */
68
+ async delete(boardId: string, webhookId: string): Promise<void> {
69
+ return this.request(
70
+ {
71
+ service: "Webhook",
72
+ operation: "DeleteWebhook",
73
+ resourceType: "webhook",
74
+ isMutation: true,
75
+ },
76
+ () => this.client.DELETE("/boards/{boardId}/webhooks/{webhookId}" as never, {
77
+ params: { path: { boardId, webhookId } },
78
+ } as never),
79
+ );
80
+ }
81
+
82
+ /**
83
+ * GetWebhook
84
+ */
85
+ async get(boardId: string, webhookId: string): Promise<Webhook> {
86
+ return this.request(
87
+ {
88
+ service: "Webhook",
89
+ operation: "GetWebhook",
90
+ resourceType: "webhook",
91
+ isMutation: false,
92
+ },
93
+ () => this.client.GET("/boards/{boardId}/webhooks/{webhookId}" as never, {
94
+ params: { path: { boardId, webhookId } },
95
+ } as never),
96
+ );
97
+ }
98
+
99
+ /**
100
+ * UpdateWebhook
101
+ */
102
+ async update(boardId: string, webhookId: string, body?: UpdateWebhookRequest): Promise<Webhook> {
103
+ return this.request(
104
+ {
105
+ service: "Webhook",
106
+ operation: "UpdateWebhook",
107
+ resourceType: "webhook",
108
+ isMutation: true,
109
+ },
110
+ () => this.client.PATCH("/boards/{boardId}/webhooks/{webhookId}" as never, {
111
+ params: { path: { boardId, webhookId } },
112
+ body: { name: body?.name, url: body?.url, subscribed_actions: body?.subscribedActions } as never,
113
+ } as never),
114
+ );
115
+ }
116
+
117
+ /**
118
+ * ActivateWebhook
119
+ */
120
+ async activate(boardId: string, webhookId: string): Promise<void> {
121
+ return this.request(
122
+ {
123
+ service: "Webhook",
124
+ operation: "ActivateWebhook",
125
+ resourceType: "webhook",
126
+ isMutation: true,
127
+ },
128
+ () => this.client.POST("/boards/{boardId}/webhooks/{webhookId}/activation.json" as never, {
129
+ params: { path: { boardId, webhookId } },
130
+ } as never),
131
+ );
132
+ }
133
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Gating hooks — extend standard hooks with a pre-flight gate that can
3
+ * reject operations before they execute (e.g., circuit breaker, rate limiter).
4
+ */
5
+ import type { FizzyHooks, OperationInfo } from "../hooks.js";
6
+ /**
7
+ * Extended hooks interface that adds a gating check before operations.
8
+ */
9
+ export interface GatingHooks extends FizzyHooks {
10
+ /**
11
+ * Called before an operation is attempted. Throw to reject the operation.
12
+ * Use this for circuit breakers, rate limiters, bulkheads, etc.
13
+ */
14
+ onOperationGate?(info: OperationInfo): void;
15
+ }
16
+ /**
17
+ * Creates gating hooks from a gate function and optional inner hooks.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const hooks = gatingHooks({
22
+ * gate: (info) => {
23
+ * if (circuitBreaker.isOpen(info.service)) {
24
+ * throw new FizzyError("network", "Circuit breaker is open");
25
+ * }
26
+ * },
27
+ * inner: consoleHooks(),
28
+ * });
29
+ * ```
30
+ */
31
+ export declare function gatingHooks(options: {
32
+ gate: (info: OperationInfo) => void;
33
+ inner?: FizzyHooks;
34
+ }): GatingHooks;
35
+ //# sourceMappingURL=gating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gating.d.ts","sourceRoot":"","sources":["../../src/hooks/gating.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAA+C,MAAM,aAAa,CAAC;AAG1G;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C;;;OAGG;IACH,eAAe,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;CAC7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,WAAW,CA4Bd"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Gating hooks — extend standard hooks with a pre-flight gate that can
3
+ * reject operations before they execute (e.g., circuit breaker, rate limiter).
4
+ */
5
+ /**
6
+ * Creates gating hooks from a gate function and optional inner hooks.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const hooks = gatingHooks({
11
+ * gate: (info) => {
12
+ * if (circuitBreaker.isOpen(info.service)) {
13
+ * throw new FizzyError("network", "Circuit breaker is open");
14
+ * }
15
+ * },
16
+ * inner: consoleHooks(),
17
+ * });
18
+ * ```
19
+ */
20
+ export function gatingHooks(options) {
21
+ const { gate, inner } = options;
22
+ return {
23
+ onOperationGate(info) {
24
+ gate(info);
25
+ },
26
+ onOperationStart(info) {
27
+ try {
28
+ inner?.onOperationStart?.(info);
29
+ }
30
+ catch { /* hooks must not interrupt */ }
31
+ },
32
+ onOperationEnd(info, result) {
33
+ try {
34
+ inner?.onOperationEnd?.(info, result);
35
+ }
36
+ catch { /* hooks must not interrupt */ }
37
+ },
38
+ onRequestStart(info) {
39
+ try {
40
+ inner?.onRequestStart?.(info);
41
+ }
42
+ catch { /* hooks must not interrupt */ }
43
+ },
44
+ onRequestEnd(info, result) {
45
+ try {
46
+ inner?.onRequestEnd?.(info, result);
47
+ }
48
+ catch { /* hooks must not interrupt */ }
49
+ },
50
+ onRetry(info, attempt, error, delayMs) {
51
+ try {
52
+ inner?.onRetry?.(info, attempt, error, delayMs);
53
+ }
54
+ catch { /* hooks must not interrupt */ }
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=gating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gating.js","sourceRoot":"","sources":["../../src/hooks/gating.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,OAG3B;IACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEhC,OAAO;QACL,eAAe,CAAC,IAAmB;YACjC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,CAAC;QAED,gBAAgB,CAAC,IAAmB;YAClC,IAAI,CAAC;gBAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACnF,CAAC;QAED,cAAc,CAAC,IAAmB,EAAE,MAAuB;YACzD,IAAI,CAAC;gBAAC,KAAK,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACzF,CAAC;QAED,cAAc,CAAC,IAAiB;YAC9B,IAAI,CAAC;gBAAC,KAAK,EAAE,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACjF,CAAC;QAED,YAAY,CAAC,IAAiB,EAAE,MAAqB;YACnD,IAAI,CAAC;gBAAC,KAAK,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,CAAC,IAAiB,EAAE,OAAe,EAAE,KAAY,EAAE,OAAe;YACvE,IAAI,CAAC;gBAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACnG,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OpenTelemetry hooks for the Fizzy SDK.
3
+ *
4
+ * Provides distributed tracing and metrics for API operations.
5
+ * Requires @opentelemetry/api as an optional peer dependency.
6
+ */
7
+ import type { FizzyHooks } from "../hooks.js";
8
+ interface OtelSpan {
9
+ setAttribute(key: string, value: string | number | boolean): this;
10
+ setStatus(status: {
11
+ code: number;
12
+ message?: string;
13
+ }): this;
14
+ recordException(exception: Error): this;
15
+ end(): void;
16
+ }
17
+ interface OtelTracer {
18
+ startSpan(name: string, options?: {
19
+ attributes?: Record<string, string | number | boolean>;
20
+ }): OtelSpan;
21
+ }
22
+ interface OtelMeter {
23
+ createHistogram(name: string, options?: {
24
+ description?: string;
25
+ unit?: string;
26
+ }): OtelHistogram;
27
+ createCounter(name: string, options?: {
28
+ description?: string;
29
+ }): OtelCounter;
30
+ }
31
+ interface OtelHistogram {
32
+ record(value: number, attributes?: Record<string, string | number | boolean>): void;
33
+ }
34
+ interface OtelCounter {
35
+ add(value: number, attributes?: Record<string, string | number | boolean>): void;
36
+ }
37
+ export interface OtelHooksOptions {
38
+ tracer?: OtelTracer;
39
+ meter?: OtelMeter;
40
+ recordRequestSpans?: boolean;
41
+ spanPrefix?: string;
42
+ metricPrefix?: string;
43
+ }
44
+ /**
45
+ * Creates OpenTelemetry hooks for distributed tracing and metrics.
46
+ */
47
+ export declare function otelHooks(options?: OtelHooksOptions): FizzyHooks;
48
+ export {};
49
+ //# sourceMappingURL=otel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/hooks/otel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA8D,MAAM,aAAa,CAAC;AAE1G,UAAU,QAAQ;IAChB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,eAAe,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxC,GAAG,IAAI,IAAI,CAAC;CACb;AAED,UAAU,UAAU;IAClB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;KAAE,GAAG,QAAQ,CAAC;CACzG;AAED,UAAU,SAAS;IACjB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;IAChG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;CAC9E;AAED,UAAU,aAAa;IACrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CACrF;AAED,UAAU,WAAW;IACnB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAClF;AAQD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAuBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CA2KpE"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * OpenTelemetry hooks for the Fizzy SDK.
3
+ *
4
+ * Provides distributed tracing and metrics for API operations.
5
+ * Requires @opentelemetry/api as an optional peer dependency.
6
+ */
7
+ const SpanStatusCode = {
8
+ UNSET: 0,
9
+ OK: 1,
10
+ ERROR: 2,
11
+ };
12
+ let keyCounter = 0;
13
+ function requestPrefix(info) {
14
+ return `${info.method}:${info.url}:${info.attempt}`;
15
+ }
16
+ function requestKey() {
17
+ return String(++keyCounter);
18
+ }
19
+ /**
20
+ * Creates OpenTelemetry hooks for distributed tracing and metrics.
21
+ */
22
+ export function otelHooks(options = {}) {
23
+ const { tracer, meter, recordRequestSpans = false, spanPrefix = "fizzy", metricPrefix = "fizzy", } = options;
24
+ const state = {
25
+ operationSpans: new WeakMap(),
26
+ requestSpans: new Map(),
27
+ requestKeyStack: new Map(),
28
+ };
29
+ if (meter) {
30
+ state.operationDuration = meter.createHistogram(`${metricPrefix}.operation.duration`, {
31
+ description: "Duration of Fizzy SDK operations",
32
+ unit: "ms",
33
+ });
34
+ state.requestDuration = meter.createHistogram(`${metricPrefix}.request.duration`, {
35
+ description: "Duration of HTTP requests",
36
+ unit: "ms",
37
+ });
38
+ state.operationCounter = meter.createCounter(`${metricPrefix}.operations.total`, {
39
+ description: "Total number of Fizzy SDK operations",
40
+ });
41
+ state.errorCounter = meter.createCounter(`${metricPrefix}.errors.total`, {
42
+ description: "Total number of errors",
43
+ });
44
+ state.retryCounter = meter.createCounter(`${metricPrefix}.retries.total`, {
45
+ description: "Total number of retry attempts",
46
+ });
47
+ }
48
+ return {
49
+ onOperationStart(info) {
50
+ state.operationCounter?.add(1, {
51
+ service: info.service,
52
+ operation: info.operation,
53
+ is_mutation: info.isMutation,
54
+ });
55
+ if (!tracer)
56
+ return;
57
+ const spanName = `${spanPrefix}.${info.service}.${info.operation}`;
58
+ const attributes = {
59
+ [`${spanPrefix}.service`]: info.service,
60
+ [`${spanPrefix}.operation`]: info.operation,
61
+ [`${spanPrefix}.resource_type`]: info.resourceType,
62
+ [`${spanPrefix}.is_mutation`]: info.isMutation,
63
+ };
64
+ if (info.boardId) {
65
+ attributes[`${spanPrefix}.board_id`] = info.boardId;
66
+ }
67
+ if (info.resourceId) {
68
+ attributes[`${spanPrefix}.resource_id`] = info.resourceId;
69
+ }
70
+ const span = tracer.startSpan(spanName, { attributes });
71
+ state.operationSpans.set(info, span);
72
+ },
73
+ onOperationEnd(info, result) {
74
+ if (tracer) {
75
+ const span = state.operationSpans.get(info);
76
+ if (span) {
77
+ if (result.error) {
78
+ span.setStatus({ code: SpanStatusCode.ERROR, message: result.error.message });
79
+ span.recordException(result.error);
80
+ span.setAttribute("error", true);
81
+ span.setAttribute("error.message", result.error.message);
82
+ }
83
+ else {
84
+ span.setStatus({ code: SpanStatusCode.OK });
85
+ }
86
+ span.setAttribute("duration_ms", result.durationMs);
87
+ span.end();
88
+ state.operationSpans.delete(info);
89
+ }
90
+ }
91
+ const labels = {
92
+ service: info.service,
93
+ operation: info.operation,
94
+ is_mutation: info.isMutation,
95
+ success: !result.error,
96
+ };
97
+ state.operationDuration?.record(result.durationMs, labels);
98
+ if (result.error) {
99
+ state.errorCounter?.add(1, {
100
+ service: info.service,
101
+ operation: info.operation,
102
+ error_type: result.error.name,
103
+ });
104
+ }
105
+ },
106
+ onRequestStart(info) {
107
+ if (!tracer || !recordRequestSpans)
108
+ return;
109
+ const spanName = `${spanPrefix}.http.${info.method}`;
110
+ const span = tracer.startSpan(spanName, {
111
+ attributes: {
112
+ "http.method": info.method,
113
+ "http.url": info.url,
114
+ "http.attempt": info.attempt,
115
+ },
116
+ });
117
+ const key = requestKey();
118
+ state.requestSpans.set(key, span);
119
+ const prefix = requestPrefix(info);
120
+ let stack = state.requestKeyStack.get(prefix);
121
+ if (!stack) {
122
+ stack = [];
123
+ state.requestKeyStack.set(prefix, stack);
124
+ }
125
+ stack.push(key);
126
+ },
127
+ onRequestEnd(info, result) {
128
+ if (tracer && recordRequestSpans) {
129
+ const prefix = requestPrefix(info);
130
+ const stack = state.requestKeyStack.get(prefix);
131
+ const key = stack?.pop();
132
+ if (key) {
133
+ if (stack.length === 0) {
134
+ state.requestKeyStack.delete(prefix);
135
+ }
136
+ const span = state.requestSpans.get(key);
137
+ if (span) {
138
+ span.setAttribute("http.status_code", result.statusCode);
139
+ span.setAttribute("http.from_cache", result.fromCache);
140
+ span.setAttribute("duration_ms", result.durationMs);
141
+ if (result.error) {
142
+ span.setStatus({ code: SpanStatusCode.ERROR, message: result.error.message });
143
+ span.recordException(result.error);
144
+ }
145
+ else if (result.statusCode >= 400) {
146
+ span.setStatus({ code: SpanStatusCode.ERROR, message: `HTTP ${result.statusCode}` });
147
+ }
148
+ else {
149
+ span.setStatus({ code: SpanStatusCode.OK });
150
+ }
151
+ span.end();
152
+ state.requestSpans.delete(key);
153
+ }
154
+ }
155
+ }
156
+ state.requestDuration?.record(result.durationMs, {
157
+ method: info.method,
158
+ status_code: result.statusCode,
159
+ from_cache: result.fromCache,
160
+ });
161
+ },
162
+ onRetry(info, attempt, error, _delayMs) {
163
+ state.retryCounter?.add(1, {
164
+ method: info.method,
165
+ attempt,
166
+ error_type: error.name,
167
+ });
168
+ },
169
+ };
170
+ }
171
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/hooks/otel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
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
+ * Information about a high-level service operation.
9
+ */
10
+ export interface OperationInfo {
11
+ /** Service name (e.g., "Cards", "Boards") */
12
+ service: string;
13
+ /** Operation name (e.g., "List", "Get", "Create") */
14
+ operation: string;
15
+ /** Type of resource being accessed */
16
+ resourceType: string;
17
+ /** Whether this operation modifies data */
18
+ isMutation: boolean;
19
+ /** Board ID if the operation is scoped to a board */
20
+ boardId?: number;
21
+ /** Resource ID if the operation targets a specific resource */
22
+ resourceId?: number;
23
+ }
24
+ /**
25
+ * Information about an HTTP request.
26
+ */
27
+ export interface RequestInfo {
28
+ /** HTTP method */
29
+ method: string;
30
+ /** Full request URL */
31
+ url: string;
32
+ /** Current attempt number (1-based) */
33
+ attempt: number;
34
+ }
35
+ /**
36
+ * Result of an HTTP request.
37
+ */
38
+ export interface RequestResult {
39
+ /** HTTP status code */
40
+ statusCode: number;
41
+ /** Request duration in milliseconds */
42
+ durationMs: number;
43
+ /** Whether the response was served from cache */
44
+ fromCache: boolean;
45
+ /** Error if the request failed */
46
+ error?: Error;
47
+ }
48
+ /**
49
+ * Result of an operation.
50
+ */
51
+ export interface OperationResult {
52
+ /** Error if the operation failed */
53
+ error?: Error;
54
+ /** Operation duration in milliseconds */
55
+ durationMs: number;
56
+ }
57
+ /**
58
+ * Hooks interface for observing SDK operations.
59
+ * All hooks are optional — implement only what you need.
60
+ */
61
+ export interface FizzyHooks {
62
+ /** Called when a service operation starts. */
63
+ onOperationStart?(info: OperationInfo): void;
64
+ /** Called when a service operation completes (success or failure). */
65
+ onOperationEnd?(info: OperationInfo, result: OperationResult): void;
66
+ /** Called when an HTTP request starts (including retries). */
67
+ onRequestStart?(info: RequestInfo): void;
68
+ /** Called when an HTTP request completes (including retries). */
69
+ onRequestEnd?(info: RequestInfo, result: RequestResult): void;
70
+ /** Called before a retry attempt. */
71
+ onRetry?(info: RequestInfo, attempt: number, error: Error, delayMs: number): void;
72
+ }
73
+ /**
74
+ * Combines multiple hooks into a single hooks object.
75
+ */
76
+ export declare function chainHooks(...hooks: FizzyHooks[]): FizzyHooks;
77
+ /**
78
+ * Options for console logging hooks.
79
+ */
80
+ export interface ConsoleHooksOptions {
81
+ logOperations?: boolean;
82
+ logRequests?: boolean;
83
+ logRetries?: boolean;
84
+ minDurationMs?: number;
85
+ logger?: Pick<Console, "log" | "warn" | "error">;
86
+ }
87
+ /**
88
+ * Creates hooks that log to the console.
89
+ */
90
+ export declare function consoleHooks(options?: ConsoleHooksOptions): FizzyHooks;
91
+ /**
92
+ * Creates a no-op hooks object.
93
+ */
94
+ export declare function noopHooks(): FizzyHooks;
95
+ /**
96
+ * Internal helper to safely invoke a hook.
97
+ */
98
+ export declare function safeInvoke<K extends keyof FizzyHooks>(hooks: FizzyHooks | undefined, hookName: K, ...args: Parameters<NonNullable<FizzyHooks[K]>>): void;
99
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7C,sEAAsE;IACtE,cAAc,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACpE,8DAA8D;IAC9D,cAAc,CAAC,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC,iEAAiE;IACjE,YAAY,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,qCAAqC;IACrC,OAAO,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAqC7D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CA0D1E;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,UAAU,CAEtC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,UAAU,EACnD,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,QAAQ,EAAE,CAAC,EACX,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAC9C,IAAI,CASN"}