hookshot-sdk 0.1.2 → 0.1.4
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/index.d.mts +80 -7
- package/dist/index.d.ts +80 -7
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,13 +1,86 @@
|
|
|
1
|
-
import * as _repo_api from '@repo/api';
|
|
2
|
-
import { EndpointResponse, CreateEndpointInput, UpdateEndpointInput, IngestEventInput, IngestResponse, WebhookEventResponse, DeliveryAttemptResponse, DlqStats } from '@repo/api';
|
|
3
|
-
export { CreateEndpointInput, DeliveryAttemptResponse, DlqStats, EndpointResponse, EventStatus, IngestEventInput, IngestResponse, UpdateEndpointInput, WebhookEventResponse } from '@repo/api';
|
|
4
|
-
|
|
5
1
|
interface HookshotConfig {
|
|
6
2
|
apiKey: string;
|
|
7
3
|
baseUrl?: string;
|
|
8
4
|
}
|
|
5
|
+
type EventStatus = 'pending' | 'delivering' | 'delivered' | 'failed' | 'dlq';
|
|
6
|
+
type AttemptStatus = 'pending' | 'success' | 'failed';
|
|
7
|
+
interface CreateEndpointInput {
|
|
8
|
+
label: string;
|
|
9
|
+
url: string;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
maxRetries?: number;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface UpdateEndpointInput {
|
|
15
|
+
label?: string;
|
|
16
|
+
url?: string;
|
|
17
|
+
headers?: Record<string, string>;
|
|
18
|
+
maxRetries?: number;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface EndpointResponse {
|
|
22
|
+
id: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
label: string;
|
|
25
|
+
url: string;
|
|
26
|
+
headers: Record<string, string>;
|
|
27
|
+
maxRetries: number;
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
updatedAt: Date;
|
|
31
|
+
}
|
|
32
|
+
interface EndpointSummary {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
url: string;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}
|
|
38
|
+
interface IngestEventInput {
|
|
39
|
+
eventType: string;
|
|
40
|
+
payload: Record<string, unknown>;
|
|
41
|
+
idempotencyKey?: string;
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
endpointId?: string;
|
|
44
|
+
endpointIds?: string[];
|
|
45
|
+
}
|
|
46
|
+
interface IngestResponse {
|
|
47
|
+
accepted: boolean;
|
|
48
|
+
eventIds: string[];
|
|
49
|
+
endpointsCount: number;
|
|
50
|
+
}
|
|
51
|
+
interface WebhookEventResponse {
|
|
52
|
+
id: string;
|
|
53
|
+
projectId: string;
|
|
54
|
+
endpointId: string;
|
|
55
|
+
eventType: string;
|
|
56
|
+
payload: Record<string, unknown>;
|
|
57
|
+
idempotencyKey: string | null;
|
|
58
|
+
status: EventStatus;
|
|
59
|
+
attemptCount: number;
|
|
60
|
+
maxRetries: number;
|
|
61
|
+
nextRetryAt: Date | null;
|
|
62
|
+
createdAt: Date;
|
|
63
|
+
deliveredAt: Date | null;
|
|
64
|
+
endpoint?: EndpointSummary;
|
|
65
|
+
}
|
|
66
|
+
interface DeliveryAttemptResponse {
|
|
67
|
+
id: string;
|
|
68
|
+
eventId: string;
|
|
69
|
+
attemptNumber: number;
|
|
70
|
+
status: AttemptStatus;
|
|
71
|
+
responseStatus: number | null;
|
|
72
|
+
responseBody: string | null;
|
|
73
|
+
errorMessage: string | null;
|
|
74
|
+
executedAt: Date | null;
|
|
75
|
+
durationMs: number | null;
|
|
76
|
+
}
|
|
77
|
+
interface DlqStats {
|
|
78
|
+
totalCount: number;
|
|
79
|
+
oldestEventAt: Date | null;
|
|
80
|
+
newestEventAt: Date | null;
|
|
81
|
+
}
|
|
9
82
|
interface ListEventsParams {
|
|
10
|
-
status?:
|
|
83
|
+
status?: EventStatus;
|
|
11
84
|
limit?: number;
|
|
12
85
|
offset?: number;
|
|
13
86
|
}
|
|
@@ -19,7 +92,7 @@ interface ReplayOptions {
|
|
|
19
92
|
resetRetryCount?: boolean;
|
|
20
93
|
}
|
|
21
94
|
interface ListEventsResponse {
|
|
22
|
-
events:
|
|
95
|
+
events: WebhookEventResponse[];
|
|
23
96
|
total: number;
|
|
24
97
|
}
|
|
25
98
|
interface ReplayAllResponse {
|
|
@@ -93,4 +166,4 @@ declare class HookshotRateLimitError extends HookshotError {
|
|
|
93
166
|
constructor(message?: string, retryAfter?: number);
|
|
94
167
|
}
|
|
95
168
|
|
|
96
|
-
export { HookshotAuthenticationError, HookshotClient, type HookshotConfig, HookshotError, HookshotRateLimitError, HookshotValidationError, type ListEventsParams, type ListEventsResponse, type PaginationParams, type PurgeAllResponse, type ReplayAllResponse, type ReplayOptions };
|
|
169
|
+
export { type AttemptStatus, type CreateEndpointInput, type DeliveryAttemptResponse, type DlqStats, type EndpointResponse, type EndpointSummary, type EventStatus, HookshotAuthenticationError, HookshotClient, type HookshotConfig, HookshotError, HookshotRateLimitError, HookshotValidationError, type IngestEventInput, type IngestResponse, type ListEventsParams, type ListEventsResponse, type PaginationParams, type PurgeAllResponse, type ReplayAllResponse, type ReplayOptions, type UpdateEndpointInput, type WebhookEventResponse };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,86 @@
|
|
|
1
|
-
import * as _repo_api from '@repo/api';
|
|
2
|
-
import { EndpointResponse, CreateEndpointInput, UpdateEndpointInput, IngestEventInput, IngestResponse, WebhookEventResponse, DeliveryAttemptResponse, DlqStats } from '@repo/api';
|
|
3
|
-
export { CreateEndpointInput, DeliveryAttemptResponse, DlqStats, EndpointResponse, EventStatus, IngestEventInput, IngestResponse, UpdateEndpointInput, WebhookEventResponse } from '@repo/api';
|
|
4
|
-
|
|
5
1
|
interface HookshotConfig {
|
|
6
2
|
apiKey: string;
|
|
7
3
|
baseUrl?: string;
|
|
8
4
|
}
|
|
5
|
+
type EventStatus = 'pending' | 'delivering' | 'delivered' | 'failed' | 'dlq';
|
|
6
|
+
type AttemptStatus = 'pending' | 'success' | 'failed';
|
|
7
|
+
interface CreateEndpointInput {
|
|
8
|
+
label: string;
|
|
9
|
+
url: string;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
maxRetries?: number;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface UpdateEndpointInput {
|
|
15
|
+
label?: string;
|
|
16
|
+
url?: string;
|
|
17
|
+
headers?: Record<string, string>;
|
|
18
|
+
maxRetries?: number;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface EndpointResponse {
|
|
22
|
+
id: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
label: string;
|
|
25
|
+
url: string;
|
|
26
|
+
headers: Record<string, string>;
|
|
27
|
+
maxRetries: number;
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
updatedAt: Date;
|
|
31
|
+
}
|
|
32
|
+
interface EndpointSummary {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
url: string;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}
|
|
38
|
+
interface IngestEventInput {
|
|
39
|
+
eventType: string;
|
|
40
|
+
payload: Record<string, unknown>;
|
|
41
|
+
idempotencyKey?: string;
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
endpointId?: string;
|
|
44
|
+
endpointIds?: string[];
|
|
45
|
+
}
|
|
46
|
+
interface IngestResponse {
|
|
47
|
+
accepted: boolean;
|
|
48
|
+
eventIds: string[];
|
|
49
|
+
endpointsCount: number;
|
|
50
|
+
}
|
|
51
|
+
interface WebhookEventResponse {
|
|
52
|
+
id: string;
|
|
53
|
+
projectId: string;
|
|
54
|
+
endpointId: string;
|
|
55
|
+
eventType: string;
|
|
56
|
+
payload: Record<string, unknown>;
|
|
57
|
+
idempotencyKey: string | null;
|
|
58
|
+
status: EventStatus;
|
|
59
|
+
attemptCount: number;
|
|
60
|
+
maxRetries: number;
|
|
61
|
+
nextRetryAt: Date | null;
|
|
62
|
+
createdAt: Date;
|
|
63
|
+
deliveredAt: Date | null;
|
|
64
|
+
endpoint?: EndpointSummary;
|
|
65
|
+
}
|
|
66
|
+
interface DeliveryAttemptResponse {
|
|
67
|
+
id: string;
|
|
68
|
+
eventId: string;
|
|
69
|
+
attemptNumber: number;
|
|
70
|
+
status: AttemptStatus;
|
|
71
|
+
responseStatus: number | null;
|
|
72
|
+
responseBody: string | null;
|
|
73
|
+
errorMessage: string | null;
|
|
74
|
+
executedAt: Date | null;
|
|
75
|
+
durationMs: number | null;
|
|
76
|
+
}
|
|
77
|
+
interface DlqStats {
|
|
78
|
+
totalCount: number;
|
|
79
|
+
oldestEventAt: Date | null;
|
|
80
|
+
newestEventAt: Date | null;
|
|
81
|
+
}
|
|
9
82
|
interface ListEventsParams {
|
|
10
|
-
status?:
|
|
83
|
+
status?: EventStatus;
|
|
11
84
|
limit?: number;
|
|
12
85
|
offset?: number;
|
|
13
86
|
}
|
|
@@ -19,7 +92,7 @@ interface ReplayOptions {
|
|
|
19
92
|
resetRetryCount?: boolean;
|
|
20
93
|
}
|
|
21
94
|
interface ListEventsResponse {
|
|
22
|
-
events:
|
|
95
|
+
events: WebhookEventResponse[];
|
|
23
96
|
total: number;
|
|
24
97
|
}
|
|
25
98
|
interface ReplayAllResponse {
|
|
@@ -93,4 +166,4 @@ declare class HookshotRateLimitError extends HookshotError {
|
|
|
93
166
|
constructor(message?: string, retryAfter?: number);
|
|
94
167
|
}
|
|
95
168
|
|
|
96
|
-
export { HookshotAuthenticationError, HookshotClient, type HookshotConfig, HookshotError, HookshotRateLimitError, HookshotValidationError, type ListEventsParams, type ListEventsResponse, type PaginationParams, type PurgeAllResponse, type ReplayAllResponse, type ReplayOptions };
|
|
169
|
+
export { type AttemptStatus, type CreateEndpointInput, type DeliveryAttemptResponse, type DlqStats, type EndpointResponse, type EndpointSummary, type EventStatus, HookshotAuthenticationError, HookshotClient, type HookshotConfig, HookshotError, HookshotRateLimitError, HookshotValidationError, type IngestEventInput, type IngestResponse, type ListEventsParams, type ListEventsResponse, type PaginationParams, type PurgeAllResponse, type ReplayAllResponse, type ReplayOptions, type UpdateEndpointInput, type WebhookEventResponse };
|
package/dist/index.js
CHANGED
|
@@ -97,7 +97,7 @@ var HookshotRateLimitError = class _HookshotRateLimitError extends HookshotError
|
|
|
97
97
|
};
|
|
98
98
|
|
|
99
99
|
// src/client.ts
|
|
100
|
-
var DEFAULT_BASE_URL = "https://api
|
|
100
|
+
var DEFAULT_BASE_URL = "https://api.hookshot.tech";
|
|
101
101
|
var HookshotClient = class {
|
|
102
102
|
apiKey;
|
|
103
103
|
baseUrl;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["export { HookshotClient } from './client';\n\nexport {\n HookshotError,\n HookshotValidationError,\n HookshotAuthenticationError,\n HookshotRateLimitError,\n} from './errors';\n\nexport type {\n HookshotConfig,\n ListEventsParams,\n PaginationParams,\n ReplayOptions,\n ListEventsResponse,\n ReplayAllResponse,\n PurgeAllResponse,\n EndpointResponse,\n CreateEndpointInput,\n UpdateEndpointInput,\n WebhookEventResponse,\n IngestEventInput,\n IngestResponse,\n DeliveryAttemptResponse,\n DlqStats,\n EventStatus,\n} from './types';\n","export class HookshotError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(options: {\n message: string;\n code: string;\n status: number;\n details?: Record<string, unknown>;\n }) {\n super(options.message);\n this.name = 'HookshotError';\n this.code = options.code;\n this.status = options.status;\n this.details = options.details;\n\n Object.setPrototypeOf(this, HookshotError.prototype);\n }\n\n static fromResponse(status: number, body: unknown): HookshotError {\n const parsed = body as { message?: string; code?: string; error?: string } | null;\n \n return new HookshotError({\n message: parsed?.message || parsed?.error || `HTTP ${status}`,\n code: parsed?.code || 'UNKNOWN_ERROR',\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : undefined,\n });\n }\n\n static networkError(message: string): HookshotError {\n return new HookshotError({\n message,\n code: 'NETWORK_ERROR',\n status: 0,\n });\n }\n}\n\nexport class HookshotValidationError extends HookshotError {\n constructor(message: string, details?: Record<string, unknown>) {\n super({\n message,\n code: 'VALIDATION_ERROR',\n status: 400,\n details,\n });\n this.name = 'HookshotValidationError';\n Object.setPrototypeOf(this, HookshotValidationError.prototype);\n }\n}\n\nexport class HookshotAuthenticationError extends HookshotError {\n constructor(message: string = 'Invalid or missing API key') {\n super({\n message,\n code: 'AUTHENTICATION_ERROR',\n status: 401,\n });\n this.name = 'HookshotAuthenticationError';\n Object.setPrototypeOf(this, HookshotAuthenticationError.prototype);\n }\n}\n\nexport class HookshotRateLimitError extends HookshotError {\n public readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super({\n message,\n code: 'RATE_LIMIT_EXCEEDED',\n status: 429,\n details: retryAfter ? { retryAfter } : undefined,\n });\n this.name = 'HookshotRateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, HookshotRateLimitError.prototype);\n }\n}\n","import type {\n EndpointResponse,\n CreateEndpointInput,\n UpdateEndpointInput,\n WebhookEventResponse,\n IngestEventInput,\n IngestResponse,\n DeliveryAttemptResponse,\n DlqStats,\n} from '@repo/api';\n\nimport {\n HookshotError,\n HookshotAuthenticationError,\n HookshotRateLimitError,\n} from './errors';\n\nimport type {\n HookshotConfig,\n ListEventsParams,\n PaginationParams,\n ReplayOptions,\n ListEventsResponse,\n ReplayAllResponse,\n PurgeAllResponse,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api-production-ed6e6.up.railway.app';\n\nexport class HookshotClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n public readonly endpoints: EndpointsAPI;\n public readonly events: EventsAPI;\n public readonly dlq: DlqAPI;\n\n constructor(config: HookshotConfig) {\n if (!config.apiKey) {\n throw new HookshotError({\n message: 'API key is required',\n code: 'MISSING_API_KEY',\n status: 400,\n });\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '');\n\n this.endpoints = new EndpointsAPI(this);\n this.events = new EventsAPI(this);\n this.dlq = new DlqAPI(this);\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: { body?: unknown; query?: Record<string, string | number | undefined> }\n ): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (error) {\n throw HookshotError.networkError(\n error instanceof Error ? error.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n\n if (response.status === 401) {\n throw new HookshotAuthenticationError();\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new HookshotRateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n }\n\n throw HookshotError.fromResponse(response.status, body);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n\nclass EndpointsAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async list(): Promise<EndpointResponse[]> {\n return this.client.request<EndpointResponse[]>('GET', '/endpoints');\n }\n\n async create(data: CreateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('POST', '/endpoints', { body: data });\n }\n\n async get(id: string): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('GET', `/endpoints/${id}`);\n }\n\n async update(id: string, data: UpdateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('PATCH', `/endpoints/${id}`, { body: data });\n }\n\n async delete(id: string): Promise<void> {\n return this.client.request<void>('DELETE', `/endpoints/${id}`);\n }\n}\n\nclass EventsAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async send(data: IngestEventInput): Promise<IngestResponse> {\n return this.client.request<IngestResponse>('POST', '/ingest', { body: data });\n }\n\n async list(params?: ListEventsParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/events', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async get(id: string): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('GET', `/events/${id}`);\n }\n\n async getAttempts(eventId: string): Promise<DeliveryAttemptResponse[]> {\n return this.client.request<DeliveryAttemptResponse[]>('GET', `/events/${eventId}/attempts`);\n }\n}\n\nclass DlqAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async list(params?: PaginationParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/dlq', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async stats(): Promise<DlqStats> {\n return this.client.request<DlqStats>('GET', '/dlq/stats');\n }\n\n async replay(eventId: string, options?: ReplayOptions): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('POST', `/dlq/${eventId}/replay`, {\n body: options || {},\n });\n }\n\n async replayAll(): Promise<ReplayAllResponse> {\n return this.client.request<ReplayAllResponse>('POST', '/dlq/replay-all');\n }\n\n async purge(eventId: string): Promise<void> {\n return this.client.request<void>('DELETE', `/dlq/${eventId}`);\n }\n\n async purgeAll(): Promise<PurgeAllResponse> {\n return this.client.request<PurgeAllResponse>('DELETE', '/dlq');\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["export { HookshotClient } from './client';\n\nexport {\n HookshotError,\n HookshotValidationError,\n HookshotAuthenticationError,\n HookshotRateLimitError,\n} from './errors';\n\nexport type {\n HookshotConfig,\n EventStatus,\n AttemptStatus,\n CreateEndpointInput,\n UpdateEndpointInput,\n EndpointResponse,\n EndpointSummary,\n IngestEventInput,\n IngestResponse,\n WebhookEventResponse,\n DeliveryAttemptResponse,\n DlqStats,\n ListEventsParams,\n PaginationParams,\n ReplayOptions,\n ListEventsResponse,\n ReplayAllResponse,\n PurgeAllResponse,\n} from './types';\n","export class HookshotError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(options: {\n message: string;\n code: string;\n status: number;\n details?: Record<string, unknown>;\n }) {\n super(options.message);\n this.name = 'HookshotError';\n this.code = options.code;\n this.status = options.status;\n this.details = options.details;\n\n Object.setPrototypeOf(this, HookshotError.prototype);\n }\n\n static fromResponse(status: number, body: unknown): HookshotError {\n const parsed = body as { message?: string; code?: string; error?: string } | null;\n \n return new HookshotError({\n message: parsed?.message || parsed?.error || `HTTP ${status}`,\n code: parsed?.code || 'UNKNOWN_ERROR',\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : undefined,\n });\n }\n\n static networkError(message: string): HookshotError {\n return new HookshotError({\n message,\n code: 'NETWORK_ERROR',\n status: 0,\n });\n }\n}\n\nexport class HookshotValidationError extends HookshotError {\n constructor(message: string, details?: Record<string, unknown>) {\n super({\n message,\n code: 'VALIDATION_ERROR',\n status: 400,\n details,\n });\n this.name = 'HookshotValidationError';\n Object.setPrototypeOf(this, HookshotValidationError.prototype);\n }\n}\n\nexport class HookshotAuthenticationError extends HookshotError {\n constructor(message: string = 'Invalid or missing API key') {\n super({\n message,\n code: 'AUTHENTICATION_ERROR',\n status: 401,\n });\n this.name = 'HookshotAuthenticationError';\n Object.setPrototypeOf(this, HookshotAuthenticationError.prototype);\n }\n}\n\nexport class HookshotRateLimitError extends HookshotError {\n public readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super({\n message,\n code: 'RATE_LIMIT_EXCEEDED',\n status: 429,\n details: retryAfter ? { retryAfter } : undefined,\n });\n this.name = 'HookshotRateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, HookshotRateLimitError.prototype);\n }\n}\n","import {\n HookshotAuthenticationError,\n HookshotError,\n HookshotRateLimitError,\n} from './errors';\n\nimport type {\n CreateEndpointInput,\n DeliveryAttemptResponse,\n DlqStats,\n EndpointResponse,\n HookshotConfig,\n IngestEventInput,\n IngestResponse,\n ListEventsParams,\n ListEventsResponse,\n PaginationParams,\n PurgeAllResponse,\n ReplayAllResponse,\n ReplayOptions,\n UpdateEndpointInput,\n WebhookEventResponse,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.hookshot.tech';\n\nexport class HookshotClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n public readonly endpoints: EndpointsAPI;\n public readonly events: EventsAPI;\n public readonly dlq: DlqAPI;\n\n constructor(config: HookshotConfig) {\n if (!config.apiKey) {\n throw new HookshotError({\n message: 'API key is required',\n code: 'MISSING_API_KEY',\n status: 400,\n });\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '');\n\n this.endpoints = new EndpointsAPI(this);\n this.events = new EventsAPI(this);\n this.dlq = new DlqAPI(this);\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: { body?: unknown; query?: Record<string, string | number | undefined> }\n ): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (error) {\n throw HookshotError.networkError(\n error instanceof Error ? error.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n\n if (response.status === 401) {\n throw new HookshotAuthenticationError();\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new HookshotRateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n }\n\n throw HookshotError.fromResponse(response.status, body);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n\nclass EndpointsAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async list(): Promise<EndpointResponse[]> {\n return this.client.request<EndpointResponse[]>('GET', '/endpoints');\n }\n\n async create(data: CreateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('POST', '/endpoints', { body: data });\n }\n\n async get(id: string): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('GET', `/endpoints/${id}`);\n }\n\n async update(id: string, data: UpdateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('PATCH', `/endpoints/${id}`, { body: data });\n }\n\n async delete(id: string): Promise<void> {\n return this.client.request<void>('DELETE', `/endpoints/${id}`);\n }\n}\n\nclass EventsAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async send(data: IngestEventInput): Promise<IngestResponse> {\n return this.client.request<IngestResponse>('POST', '/ingest', { body: data });\n }\n\n async list(params?: ListEventsParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/events', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async get(id: string): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('GET', `/events/${id}`);\n }\n\n async getAttempts(eventId: string): Promise<DeliveryAttemptResponse[]> {\n return this.client.request<DeliveryAttemptResponse[]>('GET', `/events/${eventId}/attempts`);\n }\n}\n\nclass DlqAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async list(params?: PaginationParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/dlq', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async stats(): Promise<DlqStats> {\n return this.client.request<DlqStats>('GET', '/dlq/stats');\n }\n\n async replay(eventId: string, options?: ReplayOptions): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('POST', `/dlq/${eventId}/replay`, {\n body: options || {},\n });\n }\n\n async replayAll(): Promise<ReplayAllResponse> {\n return this.client.request<ReplayAllResponse>('POST', '/dlq/replay-all');\n }\n\n async purge(eventId: string): Promise<void> {\n return this.client.request<void>('DELETE', `/dlq/${eventId}`);\n }\n\n async purgeAll(): Promise<PurgeAllResponse> {\n return this.client.request<PurgeAllResponse>('DELETE', '/dlq');\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,gBAAN,MAAM,uBAAsB,MAAM;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAKT;AACD,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AAEvB,WAAO,eAAe,MAAM,eAAc,SAAS;AAAA,EACrD;AAAA,EAEA,OAAO,aAAa,QAAgB,MAA8B;AAChE,UAAM,SAAS;AAEf,WAAO,IAAI,eAAc;AAAA,MACvB,SAAS,QAAQ,WAAW,QAAQ,SAAS,QAAQ,MAAM;AAAA,MAC3D,MAAM,QAAQ,QAAQ;AAAA,MACtB;AAAA,MACA,SAAS,OAAO,WAAW,YAAY,WAAW,OAAO,SAAS;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,SAAgC;AAClD,WAAO,IAAI,eAAc;AAAA,MACvB;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEO,IAAM,0BAAN,MAAM,iCAAgC,cAAc;AAAA,EACzD,YAAY,SAAiB,SAAmC;AAC9D,UAAM;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,yBAAwB,SAAS;AAAA,EAC/D;AACF;AAEO,IAAM,8BAAN,MAAM,qCAAoC,cAAc;AAAA,EAC7D,YAAY,UAAkB,8BAA8B;AAC1D,UAAM;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,6BAA4B,SAAS;AAAA,EACnE;AACF;AAEO,IAAM,yBAAN,MAAM,gCAA+B,cAAc;AAAA,EACxC;AAAA,EAEhB,YAAY,UAAkB,uBAAuB,YAAqB;AACxE,UAAM;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aAAa,EAAE,WAAW,IAAI;AAAA,IACzC,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO,eAAe,MAAM,wBAAuB,SAAS;AAAA,EAC9D;AACF;;;ACvDA,IAAM,mBAAmB;AAElB,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EAED;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,QAAwB;AAClC,QAAI,CAAC,OAAO,QAAQ;AAClB,YAAM,IAAI,cAAc;AAAA,QACtB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,OAAO,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AAErE,SAAK,YAAY,IAAI,aAAa,IAAI;AACtC,SAAK,SAAS,IAAI,UAAU,IAAI;AAChC,SAAK,MAAM,IAAI,OAAO,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,QACJ,QACA,MACA,SACY;AACZ,QAAI,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAEhC,QAAI,SAAS,OAAO;AAClB,YAAM,SAAS,IAAI,gBAAgB;AACnC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,QAAW;AACvB,iBAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,KAAK,OAAO,SAAS;AAC3B,UAAI,IAAI;AACN,eAAO,IAAI,EAAE;AAAA,MACf;AAAA,IACF;AAEA,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,IACpB;AAEA,UAAM,eAA4B;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,QAAW;AAC/B,mBAAa,OAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,IACjD;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK,YAAY;AAAA,IAC1C,SAAS,OAAO;AACd,YAAM,cAAc;AAAA,QAClB,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B,QAAQ;AACN,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,4BAA4B;AAAA,MACxC;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,cAAM,IAAI;AAAA,UACR;AAAA,UACA,aAAa,SAAS,YAAY,EAAE,IAAI;AAAA,QAC1C;AAAA,MACF;AAEA,YAAM,cAAc,aAAa,SAAS,QAAQ,IAAI;AAAA,IACxD;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,QAAwB;AAAxB;AAAA,EAA0B;AAAA,EAEvD,MAAM,OAAoC;AACxC,WAAO,KAAK,OAAO,QAA4B,OAAO,YAAY;AAAA,EACpE;AAAA,EAEA,MAAM,OAAO,MAAsD;AACjE,WAAO,KAAK,OAAO,QAA0B,QAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,IAAI,IAAuC;AAC/C,WAAO,KAAK,OAAO,QAA0B,OAAO,cAAc,EAAE,EAAE;AAAA,EACxE;AAAA,EAEA,MAAM,OAAO,IAAY,MAAsD;AAC7E,WAAO,KAAK,OAAO,QAA0B,SAAS,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1F;AAAA,EAEA,MAAM,OAAO,IAA2B;AACtC,WAAO,KAAK,OAAO,QAAc,UAAU,cAAc,EAAE,EAAE;AAAA,EAC/D;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAA6B,QAAwB;AAAxB;AAAA,EAA0B;AAAA,EAEvD,MAAM,KAAK,MAAiD;AAC1D,WAAO,KAAK,OAAO,QAAwB,QAAQ,WAAW,EAAE,MAAM,KAAK,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,OAAO,QAA4B,OAAO,WAAW;AAAA,MAC/D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAA2C;AACnD,WAAO,KAAK,OAAO,QAA8B,OAAO,WAAW,EAAE,EAAE;AAAA,EACzE;AAAA,EAEA,MAAM,YAAY,SAAqD;AACrE,WAAO,KAAK,OAAO,QAAmC,OAAO,WAAW,OAAO,WAAW;AAAA,EAC5F;AACF;AAEA,IAAM,SAAN,MAAa;AAAA,EACX,YAA6B,QAAwB;AAAxB;AAAA,EAA0B;AAAA,EAEvD,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,OAAO,QAA4B,OAAO,QAAQ;AAAA,MAC5D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAA2B;AAC/B,WAAO,KAAK,OAAO,QAAkB,OAAO,YAAY;AAAA,EAC1D;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAwD;AACpF,WAAO,KAAK,OAAO,QAA8B,QAAQ,QAAQ,OAAO,WAAW;AAAA,MACjF,MAAM,WAAW,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAwC;AAC5C,WAAO,KAAK,OAAO,QAA2B,QAAQ,iBAAiB;AAAA,EACzE;AAAA,EAEA,MAAM,MAAM,SAAgC;AAC1C,WAAO,KAAK,OAAO,QAAc,UAAU,QAAQ,OAAO,EAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,WAAsC;AAC1C,WAAO,KAAK,OAAO,QAA0B,UAAU,MAAM;AAAA,EAC/D;AACF;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -67,7 +67,7 @@ var HookshotRateLimitError = class _HookshotRateLimitError extends HookshotError
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
// src/client.ts
|
|
70
|
-
var DEFAULT_BASE_URL = "https://api
|
|
70
|
+
var DEFAULT_BASE_URL = "https://api.hookshot.tech";
|
|
71
71
|
var HookshotClient = class {
|
|
72
72
|
apiKey;
|
|
73
73
|
baseUrl;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["export class HookshotError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(options: {\n message: string;\n code: string;\n status: number;\n details?: Record<string, unknown>;\n }) {\n super(options.message);\n this.name = 'HookshotError';\n this.code = options.code;\n this.status = options.status;\n this.details = options.details;\n\n Object.setPrototypeOf(this, HookshotError.prototype);\n }\n\n static fromResponse(status: number, body: unknown): HookshotError {\n const parsed = body as { message?: string; code?: string; error?: string } | null;\n \n return new HookshotError({\n message: parsed?.message || parsed?.error || `HTTP ${status}`,\n code: parsed?.code || 'UNKNOWN_ERROR',\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : undefined,\n });\n }\n\n static networkError(message: string): HookshotError {\n return new HookshotError({\n message,\n code: 'NETWORK_ERROR',\n status: 0,\n });\n }\n}\n\nexport class HookshotValidationError extends HookshotError {\n constructor(message: string, details?: Record<string, unknown>) {\n super({\n message,\n code: 'VALIDATION_ERROR',\n status: 400,\n details,\n });\n this.name = 'HookshotValidationError';\n Object.setPrototypeOf(this, HookshotValidationError.prototype);\n }\n}\n\nexport class HookshotAuthenticationError extends HookshotError {\n constructor(message: string = 'Invalid or missing API key') {\n super({\n message,\n code: 'AUTHENTICATION_ERROR',\n status: 401,\n });\n this.name = 'HookshotAuthenticationError';\n Object.setPrototypeOf(this, HookshotAuthenticationError.prototype);\n }\n}\n\nexport class HookshotRateLimitError extends HookshotError {\n public readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super({\n message,\n code: 'RATE_LIMIT_EXCEEDED',\n status: 429,\n details: retryAfter ? { retryAfter } : undefined,\n });\n this.name = 'HookshotRateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, HookshotRateLimitError.prototype);\n }\n}\n","import type {\n EndpointResponse,\n CreateEndpointInput,\n UpdateEndpointInput,\n WebhookEventResponse,\n IngestEventInput,\n IngestResponse,\n DeliveryAttemptResponse,\n DlqStats,\n} from '@repo/api';\n\nimport {\n HookshotError,\n HookshotAuthenticationError,\n HookshotRateLimitError,\n} from './errors';\n\nimport type {\n HookshotConfig,\n ListEventsParams,\n PaginationParams,\n ReplayOptions,\n ListEventsResponse,\n ReplayAllResponse,\n PurgeAllResponse,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api-production-ed6e6.up.railway.app';\n\nexport class HookshotClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n public readonly endpoints: EndpointsAPI;\n public readonly events: EventsAPI;\n public readonly dlq: DlqAPI;\n\n constructor(config: HookshotConfig) {\n if (!config.apiKey) {\n throw new HookshotError({\n message: 'API key is required',\n code: 'MISSING_API_KEY',\n status: 400,\n });\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '');\n\n this.endpoints = new EndpointsAPI(this);\n this.events = new EventsAPI(this);\n this.dlq = new DlqAPI(this);\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: { body?: unknown; query?: Record<string, string | number | undefined> }\n ): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (error) {\n throw HookshotError.networkError(\n error instanceof Error ? error.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n\n if (response.status === 401) {\n throw new HookshotAuthenticationError();\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new HookshotRateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n }\n\n throw HookshotError.fromResponse(response.status, body);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n\nclass EndpointsAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async list(): Promise<EndpointResponse[]> {\n return this.client.request<EndpointResponse[]>('GET', '/endpoints');\n }\n\n async create(data: CreateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('POST', '/endpoints', { body: data });\n }\n\n async get(id: string): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('GET', `/endpoints/${id}`);\n }\n\n async update(id: string, data: UpdateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('PATCH', `/endpoints/${id}`, { body: data });\n }\n\n async delete(id: string): Promise<void> {\n return this.client.request<void>('DELETE', `/endpoints/${id}`);\n }\n}\n\nclass EventsAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async send(data: IngestEventInput): Promise<IngestResponse> {\n return this.client.request<IngestResponse>('POST', '/ingest', { body: data });\n }\n\n async list(params?: ListEventsParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/events', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async get(id: string): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('GET', `/events/${id}`);\n }\n\n async getAttempts(eventId: string): Promise<DeliveryAttemptResponse[]> {\n return this.client.request<DeliveryAttemptResponse[]>('GET', `/events/${eventId}/attempts`);\n }\n}\n\nclass DlqAPI {\n constructor(private readonly client: HookshotClient) {}\n\n async list(params?: PaginationParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/dlq', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async stats(): Promise<DlqStats> {\n return this.client.request<DlqStats>('GET', '/dlq/stats');\n }\n\n async replay(eventId: string, options?: ReplayOptions): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('POST', `/dlq/${eventId}/replay`, {\n body: options || {},\n });\n }\n\n async replayAll(): Promise<ReplayAllResponse> {\n return this.client.request<ReplayAllResponse>('POST', '/dlq/replay-all');\n }\n\n async purge(eventId: string): Promise<void> {\n return this.client.request<void>('DELETE', `/dlq/${eventId}`);\n }\n\n async purgeAll(): Promise<PurgeAllResponse> {\n return this.client.request<PurgeAllResponse>('DELETE', '/dlq');\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["export class HookshotError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(options: {\n message: string;\n code: string;\n status: number;\n details?: Record<string, unknown>;\n }) {\n super(options.message);\n this.name = 'HookshotError';\n this.code = options.code;\n this.status = options.status;\n this.details = options.details;\n\n Object.setPrototypeOf(this, HookshotError.prototype);\n }\n\n static fromResponse(status: number, body: unknown): HookshotError {\n const parsed = body as { message?: string; code?: string; error?: string } | null;\n \n return new HookshotError({\n message: parsed?.message || parsed?.error || `HTTP ${status}`,\n code: parsed?.code || 'UNKNOWN_ERROR',\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : undefined,\n });\n }\n\n static networkError(message: string): HookshotError {\n return new HookshotError({\n message,\n code: 'NETWORK_ERROR',\n status: 0,\n });\n }\n}\n\nexport class HookshotValidationError extends HookshotError {\n constructor(message: string, details?: Record<string, unknown>) {\n super({\n message,\n code: 'VALIDATION_ERROR',\n status: 400,\n details,\n });\n this.name = 'HookshotValidationError';\n Object.setPrototypeOf(this, HookshotValidationError.prototype);\n }\n}\n\nexport class HookshotAuthenticationError extends HookshotError {\n constructor(message: string = 'Invalid or missing API key') {\n super({\n message,\n code: 'AUTHENTICATION_ERROR',\n status: 401,\n });\n this.name = 'HookshotAuthenticationError';\n Object.setPrototypeOf(this, HookshotAuthenticationError.prototype);\n }\n}\n\nexport class HookshotRateLimitError extends HookshotError {\n public readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super({\n message,\n code: 'RATE_LIMIT_EXCEEDED',\n status: 429,\n details: retryAfter ? { retryAfter } : undefined,\n });\n this.name = 'HookshotRateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, HookshotRateLimitError.prototype);\n }\n}\n","import {\n HookshotAuthenticationError,\n HookshotError,\n HookshotRateLimitError,\n} from './errors';\n\nimport type {\n CreateEndpointInput,\n DeliveryAttemptResponse,\n DlqStats,\n EndpointResponse,\n HookshotConfig,\n IngestEventInput,\n IngestResponse,\n ListEventsParams,\n ListEventsResponse,\n PaginationParams,\n PurgeAllResponse,\n ReplayAllResponse,\n ReplayOptions,\n UpdateEndpointInput,\n WebhookEventResponse,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.hookshot.tech';\n\nexport class HookshotClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n public readonly endpoints: EndpointsAPI;\n public readonly events: EventsAPI;\n public readonly dlq: DlqAPI;\n\n constructor(config: HookshotConfig) {\n if (!config.apiKey) {\n throw new HookshotError({\n message: 'API key is required',\n code: 'MISSING_API_KEY',\n status: 400,\n });\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '');\n\n this.endpoints = new EndpointsAPI(this);\n this.events = new EventsAPI(this);\n this.dlq = new DlqAPI(this);\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: { body?: unknown; query?: Record<string, string | number | undefined> }\n ): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (error) {\n throw HookshotError.networkError(\n error instanceof Error ? error.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n\n if (response.status === 401) {\n throw new HookshotAuthenticationError();\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new HookshotRateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n }\n\n throw HookshotError.fromResponse(response.status, body);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n\nclass EndpointsAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async list(): Promise<EndpointResponse[]> {\n return this.client.request<EndpointResponse[]>('GET', '/endpoints');\n }\n\n async create(data: CreateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('POST', '/endpoints', { body: data });\n }\n\n async get(id: string): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('GET', `/endpoints/${id}`);\n }\n\n async update(id: string, data: UpdateEndpointInput): Promise<EndpointResponse> {\n return this.client.request<EndpointResponse>('PATCH', `/endpoints/${id}`, { body: data });\n }\n\n async delete(id: string): Promise<void> {\n return this.client.request<void>('DELETE', `/endpoints/${id}`);\n }\n}\n\nclass EventsAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async send(data: IngestEventInput): Promise<IngestResponse> {\n return this.client.request<IngestResponse>('POST', '/ingest', { body: data });\n }\n\n async list(params?: ListEventsParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/events', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async get(id: string): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('GET', `/events/${id}`);\n }\n\n async getAttempts(eventId: string): Promise<DeliveryAttemptResponse[]> {\n return this.client.request<DeliveryAttemptResponse[]>('GET', `/events/${eventId}/attempts`);\n }\n}\n\nclass DlqAPI {\n constructor(private readonly client: HookshotClient) { }\n\n async list(params?: PaginationParams): Promise<ListEventsResponse> {\n return this.client.request<ListEventsResponse>('GET', '/dlq', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async stats(): Promise<DlqStats> {\n return this.client.request<DlqStats>('GET', '/dlq/stats');\n }\n\n async replay(eventId: string, options?: ReplayOptions): Promise<WebhookEventResponse> {\n return this.client.request<WebhookEventResponse>('POST', `/dlq/${eventId}/replay`, {\n body: options || {},\n });\n }\n\n async replayAll(): Promise<ReplayAllResponse> {\n return this.client.request<ReplayAllResponse>('POST', '/dlq/replay-all');\n }\n\n async purge(eventId: string): Promise<void> {\n return this.client.request<void>('DELETE', `/dlq/${eventId}`);\n }\n\n async purgeAll(): Promise<PurgeAllResponse> {\n return this.client.request<PurgeAllResponse>('DELETE', '/dlq');\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hookshot-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Official SDK for the Hookshot webhook delivery service",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -47,7 +47,6 @@
|
|
|
47
47
|
"license": "MIT",
|
|
48
48
|
"dependencies": {},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@repo/api": "workspace:*",
|
|
51
50
|
"@repo/typescript-config": "workspace:*",
|
|
52
51
|
"tsup": "^8.0.0",
|
|
53
52
|
"typescript": "^5.0.0"
|