UNPKG

@psteinroe/fastify-supabase

Version:

A Fastify plugin to use authenticated Supabase clients in your API.

1 lines 4.79 kB
{"version":3,"sources":["../src/index.ts","../src/fastify-supabase.ts"],"sourcesContent":["import { default as fastifySupabase } from \"./fastify-supabase\";\n\nexport default fastifySupabase;\n","import createError from \"@fastify/error\";\nimport type { JWT } from \"@fastify/jwt\";\nimport {\n SupabaseClient,\n SupabaseClientOptions,\n User,\n createClient,\n} from \"@supabase/supabase-js\";\nimport type { FastifyPluginCallback, FastifyRequest } from \"fastify\";\nimport fp from \"fastify-plugin\";\n\nconst AuthorizationTokenInvalidError = createError(\n \"FST_SB_AUTHORIZATION_TOKEN_INVALID\",\n \"Authorization token is invalid\",\n 401,\n);\n\nconst NoUserDataFoundError = createError(\n \"FST_SB_NO_USER_DATA_FOUND\",\n \"No user data found in the request. Make sure to run request.jwtVerify() before trying to access the user.\",\n 401,\n);\n\ndeclare module \"fastify\" {\n export interface FastifyInstance {\n supabaseClient: SupabaseClient;\n jwt: JWT;\n }\n export interface FastifyRequest {\n _supabaseClient: SupabaseClient;\n supabaseUser: User;\n }\n}\n\nexport type FastifySupabasePluginOpts = {\n url: string;\n serviceKey: string;\n anonKey: string;\n options?: SupabaseClientOptions<\"public\">;\n};\n\nconst fastifySupabase: FastifyPluginCallback<FastifySupabasePluginOpts> = (\n fastify,\n opts,\n next,\n) => {\n const { url, serviceKey, anonKey, options } = opts;\n\n const supabase = createClient(url, serviceKey, options);\n\n if (fastify.supabaseClient) {\n return next(new Error(\"fastify-supabase has already been registered\"));\n }\n\n fastify.decorate(\"supabaseClient\", supabase);\n\n fastify.decorateRequest(\"_supabaseClient\", null);\n fastify.decorateRequest(\n \"supabaseClient\",\n {\n getter() {\n const req = this as unknown as FastifyRequest;\n\n if (req._supabaseClient) return req._supabaseClient;\n\n if ((req.user as { role?: string }).role === \"service_role\") {\n req._supabaseClient = fastify.supabaseClient;\n } else if (\n (req.user as { role?: string }).role &&\n (req.user as { role?: string }).role !== \"anon\"\n ) {\n const client = createClient(url, anonKey, {\n ...options,\n auth: {\n ...options?.auth,\n persistSession: false,\n },\n global: {\n ...options?.global,\n headers: {\n ...options?.global?.headers,\n Authorization: `Bearer ${fastify.jwt.lookupToken(req)}`,\n },\n },\n });\n req._supabaseClient = client as SupabaseClient;\n }\n\n if (!req._supabaseClient) {\n throw new AuthorizationTokenInvalidError();\n }\n\n return req._supabaseClient;\n },\n },\n [\"user\"],\n );\n\n fastify.decorateRequest(\n \"supabaseUser\",\n {\n getter() {\n const req = this as unknown as FastifyRequest;\n\n if (!req.user) {\n throw new NoUserDataFoundError();\n }\n\n return req.user as User;\n },\n },\n [\"user\"],\n );\n\n next();\n};\n\nexport default fp(fastifySupabase, {\n fastify: \"4.x\",\n name: \"fastify-supabase\",\n dependencies: [\"@fastify/jwt\"],\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAwB;AAExB,yBAKO;AAEP,4BAAe;AAEf,IAAM,qCAAiC,aAAAA;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,2BAAuB,aAAAA;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;AAoBA,IAAM,kBAAoE,CACxE,SACA,MACA,SACG;AACH,QAAM,EAAE,KAAK,YAAY,SAAS,QAAQ,IAAI;AAE9C,QAAM,eAAW,iCAAa,KAAK,YAAY,OAAO;AAEtD,MAAI,QAAQ,gBAAgB;AAC1B,WAAO,KAAK,IAAI,MAAM,8CAA8C,CAAC;AAAA,EACvE;AAEA,UAAQ,SAAS,kBAAkB,QAAQ;AAE3C,UAAQ,gBAAgB,mBAAmB,IAAI;AAC/C,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,MACE,SAAS;AACP,cAAM,MAAM;AAEZ,YAAI,IAAI;AAAiB,iBAAO,IAAI;AAEpC,YAAK,IAAI,KAA2B,SAAS,gBAAgB;AAC3D,cAAI,kBAAkB,QAAQ;AAAA,QAChC,WACG,IAAI,KAA2B,QAC/B,IAAI,KAA2B,SAAS,QACzC;AACA,gBAAM,aAAS,iCAAa,KAAK,SAAS;AAAA,YACxC,GAAG;AAAA,YACH,MAAM;AAAA,cACJ,GAAG,SAAS;AAAA,cACZ,gBAAgB;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,cACN,GAAG,SAAS;AAAA,cACZ,SAAS;AAAA,gBACP,GAAG,SAAS,QAAQ;AAAA,gBACpB,eAAe,UAAU,QAAQ,IAAI,YAAY,GAAG,CAAC;AAAA,cACvD;AAAA,YACF;AAAA,UACF,CAAC;AACD,cAAI,kBAAkB;AAAA,QACxB;AAEA,YAAI,CAAC,IAAI,iBAAiB;AACxB,gBAAM,IAAI,+BAA+B;AAAA,QAC3C;AAEA,eAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,MACE,SAAS;AACP,cAAM,MAAM;AAEZ,YAAI,CAAC,IAAI,MAAM;AACb,gBAAM,IAAI,qBAAqB;AAAA,QACjC;AAEA,eAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,OAAK;AACP;AAEA,IAAO,+BAAQ,sBAAAC,SAAG,iBAAiB;AAAA,EACjC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,cAAc,CAAC,cAAc;AAC/B,CAAC;;;ADvHD,IAAO,cAAQ;","names":["createError","fp"]}