From 9c4be40adc136563c052734186aa481ea7174274 Mon Sep 17 00:00:00 2001 From: Hemachandar <132386067+hmacr@users.noreply.github.com> Date: Mon, 30 Oct 2023 21:54:03 +0530 Subject: [PATCH] fix: append nanoid for dynamic trigger reg event (#628) * fix: append nanoid for dynamic trigger reg event * use idempotency-key as event-id * add changeset --- .changeset/strange-schools-boil.md | 5 +++++ ...pointSlug.triggers.$id.registrations.$key.ts | 14 +++++++++++++- packages/trigger-sdk/src/apiClient.ts | 17 ++++++++++++----- packages/trigger-sdk/src/triggerClient.ts | 9 +++++++-- packages/trigger-sdk/src/triggers/dynamic.ts | 3 ++- 5 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 .changeset/strange-schools-boil.md diff --git a/.changeset/strange-schools-boil.md b/.changeset/strange-schools-boil.md new file mode 100644 index 000000000..4941bdec3 --- /dev/null +++ b/.changeset/strange-schools-boil.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +use idempotency-key as event-id for dynamic-trigger registrations diff --git a/apps/webapp/app/routes/api.v2.$endpointSlug.triggers.$id.registrations.$key.ts b/apps/webapp/app/routes/api.v2.$endpointSlug.triggers.$id.registrations.$key.ts index 2cb689e77..a59ae2fd5 100644 --- a/apps/webapp/app/routes/api.v2.$endpointSlug.triggers.$id.registrations.$key.ts +++ b/apps/webapp/app/routes/api.v2.$endpointSlug.triggers.$id.registrations.$key.ts @@ -10,6 +10,7 @@ import { authenticateApiRequest } from "~/services/apiAuth.server"; import { IngestSendEvent } from "~/services/events/ingestSendEvent.server"; import { logger } from "~/services/logger.server"; import { RegisterTriggerSourceServiceV2 } from "~/services/triggers/registerTriggerSourceV2.server"; +import { nanoid } from "nanoid"; const ParamsSchema = z.object({ endpointSlug: z.string(), @@ -17,6 +18,10 @@ const ParamsSchema = z.object({ key: z.string(), }); +const HeadersSchema = z.object({ + "idempotency-key": z.string().optional(), +}); + export async function action({ request, params }: ActionFunctionArgs) { logger.info("Registering trigger", { url: request.url }); @@ -77,11 +82,18 @@ export async function action({ request, params }: ActionFunctionArgs) { dynamicTriggerId: parsedParams.data.id, }; + const headers = HeadersSchema.safeParse(Object.fromEntries(request.headers)); + + const eventId = + headers.success && headers.data["idempotency-key"] + ? headers.data["idempotency-key"] + : `${registration.id}:${nanoid()}`; + const ingestEventService = new IngestSendEvent(); await ingestEventService.call( authenticatedEnv, { - id: registration.id, + id: eventId, name: REGISTER_SOURCE_EVENT_V2, source: "trigger.dev", payload, diff --git a/packages/trigger-sdk/src/apiClient.ts b/packages/trigger-sdk/src/apiClient.ts index f46f3384d..1b43842a2 100644 --- a/packages/trigger-sdk/src/apiClient.ts +++ b/packages/trigger-sdk/src/apiClient.ts @@ -289,7 +289,8 @@ export class ApiClient { client: string, id: string, key: string, - payload: RegisterTriggerBodyV2 + payload: RegisterTriggerBodyV2, + idempotencyKey?: string ): Promise { const apiKey = await this.#apiKey(); @@ -298,15 +299,21 @@ export class ApiClient { payload, }); + const headers: HeadersInit = { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }; + + if (idempotencyKey) { + headers["Idempotency-Key"] = idempotencyKey; + } + const response = await zodfetch( RegisterSourceEventSchemaV2, `${this.#apiUrl}/api/v2/${client}/triggers/${id}/registrations/${key}`, { method: "PUT", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${apiKey}`, - }, + headers: headers, body: JSON.stringify(payload), } ); diff --git a/packages/trigger-sdk/src/triggerClient.ts b/packages/trigger-sdk/src/triggerClient.ts index 9ed509d53..58023e8d8 100644 --- a/packages/trigger-sdk/src/triggerClient.ts +++ b/packages/trigger-sdk/src/triggerClient.ts @@ -623,8 +623,13 @@ export class TriggerClient { this.#registeredSchedules[key] = jobs; } - async registerTrigger(id: string, key: string, options: RegisterTriggerBodyV2) { - return this.#client.registerTrigger(this.id, id, key, options); + async registerTrigger( + id: string, + key: string, + options: RegisterTriggerBodyV2, + idempotencyKey?: string + ) { + return this.#client.registerTrigger(this.id, id, key, options, idempotencyKey); } async getAuth(id: string) { diff --git a/packages/trigger-sdk/src/triggers/dynamic.ts b/packages/trigger-sdk/src/triggers/dynamic.ts index 33c29bf75..36df964c7 100644 --- a/packages/trigger-sdk/src/triggers/dynamic.ts +++ b/packages/trigger-sdk/src/triggers/dynamic.ts @@ -140,7 +140,8 @@ export class DynamicTrigger< return this.#client.registerTrigger( this.id, key, - this.registeredTriggerForParams(params, options) + this.registeredTriggerForParams(params, options), + task.idempotencyKey ); }, {