@geekapps/post-fastify 0.1.1 → 0.1.3

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 (82) hide show
  1. package/dist/index.d.ts +541 -21
  2. package/dist/index.js +453 -16
  3. package/dist/index.js.map +1 -1
  4. package/package.json +4 -3
  5. package/src/http.ts +88 -88
  6. package/src/index.ts +0 -5
  7. package/src/plugin.ts +87 -9
  8. package/tsup.config.ts +10 -0
  9. package/dist/client.d.ts +0 -31
  10. package/dist/client.d.ts.map +0 -1
  11. package/dist/client.js +0 -29
  12. package/dist/client.js.map +0 -1
  13. package/dist/errors.d.ts +0 -11
  14. package/dist/errors.d.ts.map +0 -1
  15. package/dist/errors.js +0 -24
  16. package/dist/errors.js.map +0 -1
  17. package/dist/http.d.ts +0 -21
  18. package/dist/http.d.ts.map +0 -1
  19. package/dist/http.js +0 -56
  20. package/dist/http.js.map +0 -1
  21. package/dist/index.d.ts.map +0 -1
  22. package/dist/nextjs.d.ts +0 -22
  23. package/dist/nextjs.d.ts.map +0 -1
  24. package/dist/nextjs.js +0 -15
  25. package/dist/nextjs.js.map +0 -1
  26. package/dist/plugin.d.ts +0 -17
  27. package/dist/plugin.d.ts.map +0 -1
  28. package/dist/plugin.js +0 -17
  29. package/dist/plugin.js.map +0 -1
  30. package/dist/resources/domains.d.ts +0 -14
  31. package/dist/resources/domains.d.ts.map +0 -1
  32. package/dist/resources/domains.js +0 -21
  33. package/dist/resources/domains.js.map +0 -1
  34. package/dist/resources/history.d.ts +0 -9
  35. package/dist/resources/history.d.ts.map +0 -1
  36. package/dist/resources/history.js +0 -26
  37. package/dist/resources/history.js.map +0 -1
  38. package/dist/resources/managed-numbers.d.ts +0 -28
  39. package/dist/resources/managed-numbers.d.ts.map +0 -1
  40. package/dist/resources/managed-numbers.js +0 -24
  41. package/dist/resources/managed-numbers.js.map +0 -1
  42. package/dist/resources/messages.d.ts +0 -8
  43. package/dist/resources/messages.d.ts.map +0 -1
  44. package/dist/resources/messages.js +0 -9
  45. package/dist/resources/messages.js.map +0 -1
  46. package/dist/resources/plans.d.ts +0 -10
  47. package/dist/resources/plans.d.ts.map +0 -1
  48. package/dist/resources/plans.js +0 -15
  49. package/dist/resources/plans.js.map +0 -1
  50. package/dist/resources/smtp.d.ts +0 -14
  51. package/dist/resources/smtp.d.ts.map +0 -1
  52. package/dist/resources/smtp.js +0 -18
  53. package/dist/resources/smtp.js.map +0 -1
  54. package/dist/resources/statistics.d.ts +0 -8
  55. package/dist/resources/statistics.d.ts.map +0 -1
  56. package/dist/resources/statistics.js +0 -17
  57. package/dist/resources/statistics.js.map +0 -1
  58. package/dist/resources/templates.d.ts +0 -17
  59. package/dist/resources/templates.d.ts.map +0 -1
  60. package/dist/resources/templates.js +0 -33
  61. package/dist/resources/templates.js.map +0 -1
  62. package/dist/resources/webhooks.d.ts +0 -13
  63. package/dist/resources/webhooks.d.ts.map +0 -1
  64. package/dist/resources/webhooks.js +0 -24
  65. package/dist/resources/webhooks.js.map +0 -1
  66. package/dist/resources/whatsapp-numbers.d.ts +0 -23
  67. package/dist/resources/whatsapp-numbers.d.ts.map +0 -1
  68. package/dist/resources/whatsapp-numbers.js +0 -56
  69. package/dist/resources/whatsapp-numbers.js.map +0 -1
  70. package/dist/resources/whatsapp-templates.d.ts +0 -12
  71. package/dist/resources/whatsapp-templates.d.ts.map +0 -1
  72. package/dist/resources/whatsapp-templates.js +0 -21
  73. package/dist/resources/whatsapp-templates.js.map +0 -1
  74. package/dist/service-account.d.ts +0 -38
  75. package/dist/service-account.d.ts.map +0 -1
  76. package/dist/service-account.js +0 -87
  77. package/dist/service-account.js.map +0 -1
  78. package/dist/types.d.ts +0 -346
  79. package/dist/types.d.ts.map +0 -1
  80. package/dist/types.js +0 -3
  81. package/dist/types.js.map +0 -1
  82. package/src/service-account.ts +0 -127
@@ -1,87 +0,0 @@
1
- function decodeJwtPayload(token) {
2
- try {
3
- const [, payload] = token.split(".");
4
- if (!payload)
5
- return {};
6
- const json = Buffer.from(payload, "base64url").toString("utf-8");
7
- return JSON.parse(json);
8
- }
9
- catch {
10
- return {};
11
- }
12
- }
13
- /**
14
- * Fetches a short-lived token from the Geekapps Auth service using
15
- * client_credentials grant and caches it until near expiry.
16
- *
17
- * Tokens are valid for ~7 min. A new one is fetched 30 s before that.
18
- * The organizationId claim is extracted automatically from the JWT payload.
19
- */
20
- export class ServiceAccountTokenProvider {
21
- constructor(options) {
22
- this.cached = null;
23
- this.inflight = null;
24
- this.issuerUrl = options.issuerUrl.replace(/\/$/, "");
25
- this.clientId = options.clientId;
26
- this.clientSecret = options.clientSecret;
27
- this.refreshBeforeMs = (options.refreshBeforeExpirySeconds ?? 30) * 1000;
28
- }
29
- async ensureFresh() {
30
- const now = Date.now();
31
- if (this.cached && this.cached.expiresAt - now > this.refreshBeforeMs) {
32
- return this.cached;
33
- }
34
- if (this.inflight)
35
- return this.inflight;
36
- this.inflight = this.fetchToken().finally(() => {
37
- this.inflight = null;
38
- });
39
- return this.inflight;
40
- }
41
- /** Returns a valid access token. */
42
- getToken() {
43
- return this.ensureFresh().then((c) => c.value);
44
- }
45
- /** Returns the organizationId embedded in the service account JWT. */
46
- getOrganizationId() {
47
- return this.ensureFresh().then((c) => c.organizationId);
48
- }
49
- async fetchToken() {
50
- const body = new URLSearchParams();
51
- body.set("grant_type", "client_credentials");
52
- body.set("client_id", this.clientId);
53
- body.set("client_secret", this.clientSecret);
54
- const res = await fetch(`${this.issuerUrl}/auth/token`, {
55
- method: "POST",
56
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
57
- body,
58
- });
59
- if (!res.ok) {
60
- const err = await res.json().catch(() => ({}));
61
- throw new Error(`ServiceAccount token fetch failed (${res.status}): ${err.error ?? "unknown error"}`);
62
- }
63
- const data = await res.json();
64
- const claims = decodeJwtPayload(data.access_token);
65
- const organizationId = typeof claims.organizationId === "string" ? claims.organizationId :
66
- typeof claims.organization_id === "string" ? claims.organization_id :
67
- undefined;
68
- const expiresInMs = (data.expires_in ?? 420) * 1000;
69
- this.cached = {
70
- value: data.access_token,
71
- expiresAt: Date.now() + expiresInMs,
72
- organizationId,
73
- };
74
- return this.cached;
75
- }
76
- /** Returns this provider as a TokenResolver to pass directly to PostClient. */
77
- asTokenResolver() {
78
- return () => this.getToken();
79
- }
80
- }
81
- /**
82
- * Convenience factory. Returns a TokenResolver ready for use in PostClient.
83
- */
84
- export function createServiceAccountToken(options) {
85
- return new ServiceAccountTokenProvider(options).asTokenResolver();
86
- }
87
- //# sourceMappingURL=service-account.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-account.js","sourceRoot":"","sources":["../src/service-account.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts DELETED
@@ -1,346 +0,0 @@
1
- export type MessageType = "email" | "sms" | "whatsapp";
2
- export type MessageStatus = "queued" | "sent" | "delivered" | "failed" | "bounced" | "opened" | "clicked";
3
- export type DomainType = "sending" | "tracking";
4
- export type DomainStatus = "pending" | "verified" | "failed";
5
- export type PlanTier = "free" | "starter" | "pro" | "enterprise";
6
- export type WhatsappTemplateCategory = "MARKETING" | "UTILITY" | "AUTHENTICATION";
7
- export type WhatsappTemplateStatus = "APPROVED" | "PENDING" | "REJECTED" | "DISABLED" | "PAUSED";
8
- export type WebhookEvent = "message_sent" | "message_delivered" | "message_failed" | "message_bounced" | "message_opened" | "message_clicked";
9
- export type WabaStatus = "active" | "token_expired" | "disconnected";
10
- export type WhatsappNumberStatus = "pending_verification" | "active" | "inactive" | "failed";
11
- export type ManagedNumberStatus = "provisioning" | "active" | "waiting_whatsapp_verification" | "whatsapp_active" | "suspended" | "canceled" | "failed";
12
- export interface MessageTemplate {
13
- id: string;
14
- orgId: string;
15
- name: string;
16
- type: MessageType;
17
- subject: string | null;
18
- body: string;
19
- variables: string[];
20
- description: string | null;
21
- isActive: boolean;
22
- draftBody: string | null;
23
- draftSubject: string | null;
24
- draftName: string | null;
25
- draftBlocks: unknown[] | null;
26
- draftUpdatedAt: string | null;
27
- metaTemplateId: string | null;
28
- metaStatus: string | null;
29
- metaWabaId: string | null;
30
- createdAt: string;
31
- updatedAt: string;
32
- }
33
- export interface WhatsappTemplate {
34
- id: string;
35
- name: string;
36
- templateName: string;
37
- category: WhatsappTemplateCategory;
38
- language: string;
39
- header: string | null;
40
- footer: string | null;
41
- body: string;
42
- variables: string[];
43
- isActive: boolean;
44
- metaTemplateId: string | null;
45
- metaStatus: string | null;
46
- metaWabaId: string | null;
47
- createdAt: string;
48
- updatedAt: string;
49
- }
50
- export interface MessageLog {
51
- id: string;
52
- type: MessageType;
53
- status: MessageStatus;
54
- from: string | null;
55
- to: string;
56
- subject: string | null;
57
- templateId: string | null;
58
- provider: string | null;
59
- externalId: string | null;
60
- error: string | null;
61
- sentAt: string | null;
62
- deliveredAt: string | null;
63
- openedAt: string | null;
64
- clickedAt: string | null;
65
- createdAt: string;
66
- }
67
- export interface MessageLogDetail extends MessageLog {
68
- body: string;
69
- variables: Array<{
70
- name: string;
71
- value: string;
72
- }> | null;
73
- template: MessageTemplate | null;
74
- }
75
- export interface OrgDomain {
76
- id: string;
77
- domain: string;
78
- type: DomainType;
79
- status: DomainStatus;
80
- dkimSelector: string | null;
81
- dkimPublicKey: string | null;
82
- spfRecord: string | null;
83
- trackingCname: string | null;
84
- verifiedAt: string | null;
85
- createdAt: string;
86
- }
87
- export interface DnsRecord {
88
- type: "TXT" | "CNAME";
89
- name: string;
90
- value: string | null | undefined;
91
- }
92
- export interface OrgWebhook {
93
- id: string;
94
- url: string;
95
- events: WebhookEvent[];
96
- isActive: boolean;
97
- createdAt: string;
98
- updatedAt: string;
99
- }
100
- export interface OrgWebhookWithSecret extends OrgWebhook {
101
- secret: string;
102
- }
103
- export interface WebhookDelivery {
104
- id: string;
105
- webhookId: string;
106
- event: string;
107
- statusCode: number | null;
108
- response: string | null;
109
- success: boolean;
110
- createdAt: string;
111
- }
112
- export interface SmtpConfig {
113
- id: string;
114
- host: string;
115
- port: number;
116
- secure: boolean;
117
- user: string;
118
- createdAt: string;
119
- updatedAt: string;
120
- }
121
- export interface OrgPlan {
122
- tier: PlanTier;
123
- monthlyEmails: number;
124
- monthlySms: number;
125
- monthlyWhatsapp: number;
126
- }
127
- export interface OrgUsage {
128
- email: number;
129
- sms: number;
130
- whatsapp: number;
131
- period: string;
132
- }
133
- export interface OrgWaba {
134
- id: string;
135
- orgId: string;
136
- wabaId: string;
137
- tokenExpiresAt: string | null;
138
- businessName: string | null;
139
- status: WabaStatus;
140
- connectedAt: string;
141
- updatedAt: string;
142
- }
143
- export interface WhatsappNumberProfile {
144
- about: string | null;
145
- description: string | null;
146
- email: string | null;
147
- websites: string[];
148
- vertical: string | null;
149
- profilePictureUrl: string | null;
150
- }
151
- export interface WhatsappNumber {
152
- id: string;
153
- orgId: string;
154
- orgWabaId: string;
155
- displayName: string;
156
- phoneNumber: string;
157
- phoneNumberId: string;
158
- mode: string;
159
- status: WhatsappNumberStatus;
160
- qualityRating: string | null;
161
- nameStatus: string | null;
162
- profile: WhatsappNumberProfile;
163
- createdAt: string;
164
- updatedAt: string;
165
- }
166
- export interface ManagedNumber {
167
- id: string;
168
- orgId: string;
169
- phoneNumber: string;
170
- areaCode: string;
171
- status: ManagedNumberStatus;
172
- salvyId: string | null;
173
- metaPhoneNumberId: string | null;
174
- createdAt: string;
175
- updatedAt: string;
176
- }
177
- export interface AreaCode {
178
- areaCode: string;
179
- state: string;
180
- available: boolean;
181
- }
182
- export interface SendMessageInput {
183
- type: MessageType;
184
- to: string;
185
- from?: string;
186
- title?: string;
187
- preview?: string;
188
- template?: string;
189
- subject?: string;
190
- body?: string;
191
- variables?: Array<{
192
- name: string;
193
- value: string;
194
- }>;
195
- }
196
- export interface CreateTemplateInput {
197
- name: string;
198
- type: MessageType;
199
- subject?: string;
200
- body: string;
201
- description?: string;
202
- isActive?: boolean;
203
- }
204
- export interface UpdateTemplateInput extends Partial<CreateTemplateInput> {
205
- }
206
- export interface SaveDraftInput {
207
- draftBody: string;
208
- draftSubject?: string;
209
- draftName?: string;
210
- draftBlocks?: unknown[];
211
- }
212
- export interface CreateWhatsappTemplateInput {
213
- name: string;
214
- templateName: string;
215
- category: WhatsappTemplateCategory;
216
- language: string;
217
- body: string;
218
- header?: string;
219
- footer?: string;
220
- description?: string;
221
- }
222
- export interface UpdateWhatsappTemplateInput extends Partial<CreateWhatsappTemplateInput> {
223
- }
224
- export interface CreateDomainInput {
225
- domain: string;
226
- type: DomainType;
227
- }
228
- export interface CreateWebhookInput {
229
- url: string;
230
- events: WebhookEvent[];
231
- isActive?: boolean;
232
- }
233
- export interface UpdateWebhookInput extends Partial<CreateWebhookInput> {
234
- }
235
- export interface UpsertSmtpConfigInput {
236
- host: string;
237
- port: number;
238
- secure?: boolean;
239
- user: string;
240
- password: string;
241
- }
242
- export interface UpdatePlanInput {
243
- tier?: PlanTier;
244
- monthlyEmails?: number;
245
- monthlySms?: number;
246
- monthlyWhatsapp?: number;
247
- }
248
- export interface ListHistoryParams {
249
- type?: MessageType;
250
- status?: MessageStatus;
251
- from?: string;
252
- to?: string;
253
- page?: number;
254
- limit?: number;
255
- }
256
- export interface StatisticsParams {
257
- from?: string;
258
- to?: string;
259
- groupBy?: "day" | "month";
260
- }
261
- export interface ConnectWabaInput {
262
- code: string;
263
- }
264
- export interface ConnectWhatsappNumberInput {
265
- phoneNumberId: string;
266
- wabaId: string;
267
- }
268
- export interface RegisterWhatsappNumberInput {
269
- displayName: string;
270
- phoneNumber: string;
271
- method?: "SMS" | "VOICE";
272
- wabaId?: string;
273
- }
274
- export interface UpdateWhatsappProfileInput {
275
- about?: string;
276
- description?: string;
277
- email?: string;
278
- websites?: string[];
279
- vertical?: string;
280
- }
281
- export interface ProvisionManagedNumberInput {
282
- areaCode: string;
283
- }
284
- export interface SendMessageResult {
285
- id: string;
286
- status: MessageStatus;
287
- }
288
- export interface PaginatedResult<T> {
289
- data: T[];
290
- pagination: {
291
- total: number;
292
- page: number;
293
- limit: number;
294
- pages: number;
295
- };
296
- }
297
- export interface StatisticsResult {
298
- totals: Record<string, {
299
- sent: number;
300
- delivered: number;
301
- failed: number;
302
- opened: number;
303
- clicked: number;
304
- }>;
305
- currentPeriod: {
306
- period: string;
307
- usage: {
308
- email: number;
309
- sms: number;
310
- whatsapp: number;
311
- };
312
- limits: {
313
- email: number;
314
- sms: number;
315
- whatsapp: number;
316
- };
317
- };
318
- }
319
- export interface PlansResult {
320
- plan: OrgPlan;
321
- usage: OrgUsage;
322
- }
323
- export interface AvailablePlan extends OrgPlan {
324
- tier: PlanTier;
325
- }
326
- export interface CreateDomainResult {
327
- id: string;
328
- domain: string;
329
- type: DomainType;
330
- status: DomainStatus;
331
- dnsRecords: DnsRecord[];
332
- }
333
- export interface SyncWhatsappTemplatesResult {
334
- created: number;
335
- skipped: number;
336
- }
337
- export interface RotateSecretResult {
338
- secret: string;
339
- }
340
- export interface WabaHealthResult {
341
- health: unknown;
342
- }
343
- export interface PhoneNumberStatusResult {
344
- status: unknown;
345
- }
346
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js DELETED
@@ -1,3 +0,0 @@
1
- // ─── Enums ────────────────────────────────────────────────────────────────────
2
- export {};
3
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iFAAiF"}
@@ -1,127 +0,0 @@
1
- import type { TokenResolver } from "./http.js";
2
-
3
- export interface ServiceAccountOptions {
4
- /** Geekapps Auth issuer base URL (e.g. https://auth.geekapps.com.br) */
5
- issuerUrl: string;
6
- clientId: string;
7
- clientSecret: string;
8
- /** Seconds before expiry to proactively refresh. Defaults to 30. */
9
- refreshBeforeExpirySeconds?: number;
10
- }
11
-
12
- interface CachedToken {
13
- value: string;
14
- expiresAt: number; // ms epoch
15
- organizationId: string | undefined;
16
- }
17
-
18
- function decodeJwtPayload(token: string): Record<string, unknown> {
19
- try {
20
- const [, payload] = token.split(".");
21
- if (!payload) return {};
22
- const json = Buffer.from(payload, "base64url").toString("utf-8");
23
- return JSON.parse(json) as Record<string, unknown>;
24
- } catch {
25
- return {};
26
- }
27
- }
28
-
29
- /**
30
- * Fetches a short-lived token from the Geekapps Auth service using
31
- * client_credentials grant and caches it until near expiry.
32
- *
33
- * Tokens are valid for ~7 min. A new one is fetched 30 s before that.
34
- * The organizationId claim is extracted automatically from the JWT payload.
35
- */
36
- export class ServiceAccountTokenProvider {
37
- private readonly issuerUrl: string;
38
- private readonly clientId: string;
39
- private readonly clientSecret: string;
40
- private readonly refreshBeforeMs: number;
41
- private cached: CachedToken | null = null;
42
- private inflight: Promise<CachedToken> | null = null;
43
-
44
- constructor(options: ServiceAccountOptions) {
45
- this.issuerUrl = options.issuerUrl.replace(/\/$/, "");
46
- this.clientId = options.clientId;
47
- this.clientSecret = options.clientSecret;
48
- this.refreshBeforeMs = (options.refreshBeforeExpirySeconds ?? 30) * 1000;
49
- }
50
-
51
- private async ensureFresh(): Promise<CachedToken> {
52
- const now = Date.now();
53
-
54
- if (this.cached && this.cached.expiresAt - now > this.refreshBeforeMs) {
55
- return this.cached;
56
- }
57
-
58
- if (this.inflight) return this.inflight;
59
-
60
- this.inflight = this.fetchToken().finally(() => {
61
- this.inflight = null;
62
- });
63
-
64
- return this.inflight;
65
- }
66
-
67
- /** Returns a valid access token. */
68
- getToken(): Promise<string> {
69
- return this.ensureFresh().then((c) => c.value);
70
- }
71
-
72
- /** Returns the organizationId embedded in the service account JWT. */
73
- getOrganizationId(): Promise<string | undefined> {
74
- return this.ensureFresh().then((c) => c.organizationId);
75
- }
76
-
77
- private async fetchToken(): Promise<CachedToken> {
78
- const body = new URLSearchParams();
79
- body.set("grant_type", "client_credentials");
80
- body.set("client_id", this.clientId);
81
- body.set("client_secret", this.clientSecret);
82
-
83
- const res = await fetch(`${this.issuerUrl}/auth/token`, {
84
- method: "POST",
85
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
86
- body,
87
- });
88
-
89
- if (!res.ok) {
90
- const err = await res.json().catch(() => ({})) as { error?: string };
91
- throw new Error(
92
- `ServiceAccount token fetch failed (${res.status}): ${err.error ?? "unknown error"}`,
93
- );
94
- }
95
-
96
- const data = await res.json() as { access_token: string; expires_in?: number };
97
-
98
- const claims = decodeJwtPayload(data.access_token);
99
- const organizationId =
100
- typeof claims.organizationId === "string" ? claims.organizationId :
101
- typeof claims.organization_id === "string" ? claims.organization_id :
102
- undefined;
103
-
104
- const expiresInMs = (data.expires_in ?? 420) * 1000;
105
- this.cached = {
106
- value: data.access_token,
107
- expiresAt: Date.now() + expiresInMs,
108
- organizationId,
109
- };
110
-
111
- return this.cached;
112
- }
113
-
114
- /** Returns this provider as a TokenResolver to pass directly to PostClient. */
115
- asTokenResolver(): TokenResolver {
116
- return () => this.getToken();
117
- }
118
- }
119
-
120
- /**
121
- * Convenience factory. Returns a TokenResolver ready for use in PostClient.
122
- */
123
- export function createServiceAccountToken(
124
- options: ServiceAccountOptions,
125
- ): TokenResolver {
126
- return new ServiceAccountTokenProvider(options).asTokenResolver();
127
- }