From f5b49d49ee51ded180e7871b7b5a5aec13dbe993 Mon Sep 17 00:00:00 2001 From: yohlo Date: Wed, 26 Aug 2026 20:33:13 -0700 Subject: [PATCH] code fix --- src/lib/telemetry/auth-events.server.test.ts | 47 ++++++++++++++++++++ src/lib/telemetry/auth-events.server.ts | 7 ++- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/lib/telemetry/auth-events.server.test.ts diff --git a/src/lib/telemetry/auth-events.server.test.ts b/src/lib/telemetry/auth-events.server.test.ts new file mode 100644 index 0000000..7860061 --- /dev/null +++ b/src/lib/telemetry/auth-events.server.test.ts @@ -0,0 +1,47 @@ +import { describe, it, expect, vi } from "vitest"; +import OverrideableBuilder from "supertokens-js-override"; +import { withPasswordlessTelemetry } from "./auth-events.server"; + +vi.mock("@/lib/pocketbase/client", () => ({ + pbAdmin: { + authPromise: Promise.resolve(), + getPlayerByAuthId: async () => undefined, + createActivity: async () => undefined, + }, +})); + +const makeOriginalImpl = () => ({ + createCode: async (input: any) => ({ status: "OK", input }), + consumeCode: async (input: any) => ({ status: "OK", user: { id: "u1" }, input }), + listCodes: async () => [], +}); + +describe("withPasswordlessTelemetry", () => { + it("composes with an inner override that spreads the proxy (twilio recipe shape)", async () => { + const inner = (originalImplementation: any) => ({ + ...originalImplementation, + consumeCode: async (input: any) => originalImplementation.consumeCode(input), + }); + + const builder = new OverrideableBuilder(makeOriginalImpl() as any); + builder.override(withPasswordlessTelemetry(inner) as any); + const impl = builder.build() as any; + + await expect(impl.createCode({ phoneNumber: "+15555550100" })).resolves.toMatchObject({ + status: "OK", + }); + await expect(impl.consumeCode({ preAuthSessionId: "x" })).resolves.toMatchObject({ + status: "OK", + }); + }); + + it("works without an inner override", async () => { + const builder = new OverrideableBuilder(makeOriginalImpl() as any); + builder.override(withPasswordlessTelemetry() as any); + const impl = builder.build() as any; + + await expect(impl.createCode({ phoneNumber: "+15555550100" })).resolves.toMatchObject({ + status: "OK", + }); + }); +}); diff --git a/src/lib/telemetry/auth-events.server.ts b/src/lib/telemetry/auth-events.server.ts index a6610df..77daf78 100644 --- a/src/lib/telemetry/auth-events.server.ts +++ b/src/lib/telemetry/auth-events.server.ts @@ -60,11 +60,14 @@ export const withPasswordlessTelemetry = (originalImplementation: any) => { const base = existing ? existing(originalImplementation) : originalImplementation; + const callBase = (name: string, input: any) => + (base[name] ?? originalImplementation[name]).call(originalImplementation, input); + return { ...base, createCode: async (input: any) => { try { - const response = await base.createCode(input); + const response = await callBase("createCode", input); recordAuthEvent("auth.otp_sent", { phone: input.phoneNumber, success: response.status === "OK", @@ -82,7 +85,7 @@ export const withPasswordlessTelemetry = }, consumeCode: async (input: any) => { try { - const response = await base.consumeCode(input); + const response = await callBase("consumeCode", input); if (response.status === "OK") { recordAuthEvent("auth.otp_consumed", { authUserId: response.user?.id,