diff --git a/package.json b/package.json index 6d84090..2191822 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sprintpadawan", - "version": "2.0.4", + "version": "2.1.0", "description": "Plan. Sprint. Repeat.", "private": true, "scripts": { @@ -16,21 +16,20 @@ "@ably-labs/react-hooks": "^2.1.1", "@clerk/nextjs": "^4.23.2", "@neondatabase/serverless": "^0.6.0", - "@opentelemetry/api": "^1.4.1", "@paralleldrive/cuid2": "^2.2.2", "@react-email/components": "^0.0.7", "@tanstack/react-query": "^4.33.0", - "@trpc/client": "10.37.1", - "@trpc/next": "10.37.1", - "@trpc/react-query": "10.37.1", - "@trpc/server": "10.37.1", + "@trpc/client": "10.38.0", + "@trpc/next": "10.38.0", + "@trpc/react-query": "10.38.0", + "@trpc/server": "10.38.0", "@unkey/api": "^0.6.16", "@upstash/ratelimit": "^0.4.3", "@upstash/redis": "^1.22.0", "ably": "^1.2.43", "autoprefixer": "^10.4.15", "dotenv": "^16.3.1", - "drizzle-orm": "^0.28.4", + "drizzle-orm": "^0.28.5", "json2csv": "6.0.0-alpha.2", "next": "^13.4.19", "nextjs-cors": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9937c60..2a52d29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ dependencies: '@neondatabase/serverless': specifier: ^0.6.0 version: 0.6.0 - '@opentelemetry/api': - specifier: ^1.4.1 - version: 1.4.1 '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -27,17 +24,17 @@ dependencies: specifier: ^4.33.0 version: 4.33.0(react-dom@18.2.0)(react@18.2.0) '@trpc/client': - specifier: 10.37.1 - version: 10.37.1(@trpc/server@10.37.1) + specifier: 10.38.0 + version: 10.38.0(@trpc/server@10.38.0) '@trpc/next': - specifier: 10.37.1 - version: 10.37.1(@tanstack/react-query@4.33.0)(@trpc/client@10.37.1)(@trpc/react-query@10.37.1)(@trpc/server@10.37.1)(next@13.4.19)(react-dom@18.2.0)(react@18.2.0) + specifier: 10.38.0 + version: 10.38.0(@tanstack/react-query@4.33.0)(@trpc/client@10.38.0)(@trpc/react-query@10.38.0)(@trpc/server@10.38.0)(next@13.4.19)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': - specifier: 10.37.1 - version: 10.37.1(@tanstack/react-query@4.33.0)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0) + specifier: 10.38.0 + version: 10.38.0(@tanstack/react-query@4.33.0)(@trpc/client@10.38.0)(@trpc/server@10.38.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': - specifier: 10.37.1 - version: 10.37.1 + specifier: 10.38.0 + version: 10.38.0 '@unkey/api': specifier: ^0.6.16 version: 0.6.16 @@ -57,14 +54,14 @@ dependencies: specifier: ^16.3.1 version: 16.3.1 drizzle-orm: - specifier: ^0.28.4 - version: 0.28.4(@neondatabase/serverless@0.6.0)(@opentelemetry/api@1.4.1)(pg@8.11.3) + specifier: ^0.28.5 + version: 0.28.5(@neondatabase/serverless@0.6.0)(pg@8.11.3) json2csv: specifier: 6.0.0-alpha.2 version: 6.0.0-alpha.2 next: specifier: ^13.4.19 - version: 13.4.19(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.19(react-dom@18.2.0)(react@18.2.0) nextjs-cors: specifier: ^2.1.2 version: 2.1.2(next@13.4.19) @@ -191,8 +188,8 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/runtime@7.22.10: - resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + /@babel/runtime@7.22.11: + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -249,7 +246,7 @@ packages: '@clerk/clerk-react': 4.23.2(react@18.2.0) '@clerk/clerk-sdk-node': 4.12.2 '@clerk/types': 3.49.0 - next: 13.4.19(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) path-to-regexp: 6.2.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1249,11 +1246,6 @@ packages: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: false - /@opentelemetry/api@1.4.1: - resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} - engines: {node: '>=8.0.0'} - dev: false - /@paralleldrive/cuid2@2.2.2: resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} dependencies: @@ -1291,7 +1283,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -1300,7 +1292,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -1518,53 +1510,53 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@trpc/client@10.37.1(@trpc/server@10.37.1): - resolution: {integrity: sha512-OSblNfeI0Z9ERn3usgLV2x63CwwPoNOHf1FQK85cOT7F8MNaWyEHoEv7tHUwNGJwyzKXmpU+ockZ0movzX3D0g==} + /@trpc/client@10.38.0(@trpc/server@10.38.0): + resolution: {integrity: sha512-+uFQeyzVBoWDYt0Oyj+hLUJeBJjMyj/yxfm9s23EU+Y50YZVRSnB9dmAfI6jAAcehJubNLu2NH+jyEJrOen+aA==} peerDependencies: - '@trpc/server': 10.37.1 + '@trpc/server': 10.38.0 dependencies: - '@trpc/server': 10.37.1 + '@trpc/server': 10.38.0 dev: false - /@trpc/next@10.37.1(@tanstack/react-query@4.33.0)(@trpc/client@10.37.1)(@trpc/react-query@10.37.1)(@trpc/server@10.37.1)(next@13.4.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0KEgr09mBfao56lkj7ZBfVOY86d3+bDH1o0zJkDHSH60Dp/hIJ7wLCnZJIhePlZxEwknCQjVeLsTy4Pqlu8NyQ==} + /@trpc/next@10.38.0(@tanstack/react-query@4.33.0)(@trpc/client@10.38.0)(@trpc/react-query@10.38.0)(@trpc/server@10.38.0)(next@13.4.19)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cCoYMAOj6qY0jUwc5W/+IvgpMhLKBhyG7lx85ohvRyETdqZvwRQHjH/DWaOn1+WEFKT1c/gsIzHsD0lBQhyFow==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.37.1 - '@trpc/react-query': 10.37.1 - '@trpc/server': 10.37.1 + '@trpc/client': 10.38.0 + '@trpc/react-query': 10.38.0 + '@trpc/server': 10.38.0 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@tanstack/react-query': 4.33.0(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.37.1(@trpc/server@10.37.1) - '@trpc/react-query': 10.37.1(@tanstack/react-query@4.33.0)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0) - '@trpc/server': 10.37.1 - next: 13.4.19(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) + '@trpc/client': 10.38.0(@trpc/server@10.38.0) + '@trpc/react-query': 10.38.0(@tanstack/react-query@4.33.0)(@trpc/client@10.38.0)(@trpc/server@10.38.0)(react-dom@18.2.0)(react@18.2.0) + '@trpc/server': 10.38.0 + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-ssr-prepass: 1.5.0(react@18.2.0) dev: false - /@trpc/react-query@10.37.1(@tanstack/react-query@4.33.0)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TbOOPp0fZVaKfaeEyDoV8QeTHW1vgPTbfOs0uSQ4AzBXqXPu+9v1B44z8GGRJSdUxuOX9pG/6Ap5Kx8PQ3eF+Q==} + /@trpc/react-query@10.38.0(@tanstack/react-query@4.33.0)(@trpc/client@10.38.0)(@trpc/server@10.38.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2YRfsDlXQvuhGOoZDz6iZ+vo6mWOBdkRPMA177WVII1Hds9r29zJMJ+14U9reOMGC0Sfec9QSPh9nUHE7Hvkzw==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.37.1 - '@trpc/server': 10.37.1 + '@trpc/client': 10.38.0 + '@trpc/server': 10.38.0 react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@tanstack/react-query': 4.33.0(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.37.1(@trpc/server@10.37.1) - '@trpc/server': 10.37.1 + '@trpc/client': 10.38.0(@trpc/server@10.38.0) + '@trpc/server': 10.38.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@trpc/server@10.37.1: - resolution: {integrity: sha512-r3VeA319/braYMBIzj+XLgLKQ9lJSVglvPvP9HUv4kr5w6Y5grQMxMcExhTiZWltE9bnSJHKtBBzHafOo7KC8A==} + /@trpc/server@10.38.0: + resolution: {integrity: sha512-uMjWTMhqOPVmdiqPFOYwsdQ6Vzy8FtRcgM+ld3OrHsD88NiwZ1BWNIC6KwffjgrgLG/uKBFzNNKntLryv0NamQ==} dev: false /@types/body-parser@1.19.2: @@ -2776,8 +2768,8 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.4(@neondatabase/serverless@0.6.0)(@opentelemetry/api@1.4.1)(pg@8.11.3): - resolution: {integrity: sha512-BEATAB0g0Y8PKbJHkHLLENlX2DXktO5XyeNyrXB6ktcNkg3dlMfePwB3LodBJkPY6d7GixFF+jvtdZsWjakJBQ==} + /drizzle-orm@0.28.5(@neondatabase/serverless@0.6.0)(pg@8.11.3): + resolution: {integrity: sha512-6r6Iw4c38NAmW6TiKH3TUpGUQ1YdlEoLJOQptn8XPx3Z63+vFNKfAiANqrIiYZiMjKR9+NYAL219nFrmo1duXA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -2839,7 +2831,6 @@ packages: optional: true dependencies: '@neondatabase/serverless': 0.6.0 - '@opentelemetry/api': 1.4.1 pg: 8.11.3 dev: false @@ -3260,7 +3251,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.22.11 aria-query: 5.3.0 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -4541,7 +4532,7 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: true - /next@13.4.19(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.19(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} engines: {node: '>=16.8.0'} hasBin: true @@ -4557,7 +4548,6 @@ packages: optional: true dependencies: '@next/env': 13.4.19 - '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.1 busboy: 1.6.0 caniuse-lite: 1.0.30001522 @@ -4588,7 +4578,7 @@ packages: next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 dependencies: cors: 2.8.5 - next: 13.4.19(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) dev: false /no-case@3.0.4: diff --git a/src/pages/api/[...trpc].ts b/src/pages/api/[...trpc].ts index ffeb038..331d609 100644 --- a/src/pages/api/[...trpc].ts +++ b/src/pages/api/[...trpc].ts @@ -1,8 +1,19 @@ import { appRouter } from "~/server/api/root"; import { createTRPCContext } from "~/server/api/trpc"; -import { createNextApiHandler } from "@trpc/server/adapters/next"; +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; +import type { NextRequest } from "next/server"; -export default createNextApiHandler({ - router: appRouter, - createContext: createTRPCContext, -}); +export const config = { + runtime: "edge", + regions: ["pdx1"], + unstable_allowDynamic: ["/node_modules/ably/**"], +}; + +export default async function handler(req: NextRequest) { + return fetchRequestHandler({ + endpoint: "/api/trpc", + router: appRouter, + req, + createContext: createTRPCContext, + }); +} diff --git a/src/pages/api/trpc/[...trpc].ts b/src/pages/api/trpc/[...trpc].ts index 6c53746..331d609 100644 --- a/src/pages/api/trpc/[...trpc].ts +++ b/src/pages/api/trpc/[...trpc].ts @@ -1,18 +1,19 @@ -import { createNextApiHandler } from "@trpc/server/adapters/next"; -import { env } from "~/env.mjs"; import { appRouter } from "~/server/api/root"; import { createTRPCContext } from "~/server/api/trpc"; +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; +import type { NextRequest } from "next/server"; -// export API handler -export default createNextApiHandler({ - router: appRouter, - createContext: createTRPCContext, - onError: - env.NODE_ENV === "development" - ? ({ path, error }) => { - console.error( - `❌ tRPC failed on ${path ?? ""}: ${error.message}` - ); - } - : undefined, -}); +export const config = { + runtime: "edge", + regions: ["pdx1"], + unstable_allowDynamic: ["/node_modules/ably/**"], +}; + +export default async function handler(req: NextRequest) { + return fetchRequestHandler({ + endpoint: "/api/trpc", + router: appRouter, + req, + createContext: createTRPCContext, + }); +} diff --git a/src/server/ably.ts b/src/server/ably.ts index 3016f88..a715197 100644 --- a/src/server/ably.ts +++ b/src/server/ably.ts @@ -1,4 +1,4 @@ -import Ably from "ably"; +// import Ably from "ably"; import { env } from "~/env.mjs"; import type { EventType } from "../utils/types"; @@ -7,7 +7,18 @@ export const publishToChannel = async ( event: EventType, message: string ) => { - const ably = new Ably.Rest.Promise(env.ABLY_PRIVATE_KEY); - const ablyChannel = ably.channels.get(`${env.APP_ENV}-${channel}`); - await ablyChannel.publish(event, message, { quickAck: true }); + await fetch( + `https://rest.ably.io/channels/${env.APP_ENV}-${channel}/messages`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Basic ${btoa(env.ABLY_PRIVATE_KEY)}`, + }, + body: JSON.stringify({ + name: event, + data: message, + }), + } + ); }; diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 32e3ae8..4fb0bfd 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -16,7 +16,7 @@ * processing a request * */ -import { type CreateNextContextOptions } from "@trpc/server/adapters/next"; +import { type FetchCreateContextFnOptions } from "@trpc/server/adapters/fetch"; import { getAuth } from "@clerk/nextjs/server"; import type { SignedInAuthObject, @@ -37,6 +37,7 @@ interface AuthContext { * - trpc's `createSSGHelpers` where we don't have req/res * @see https://create.t3.gg/en/usage/trpc#-servertrpccontextts */ + const createInnerTRPCContext = ({ auth }: AuthContext) => { return { auth, @@ -44,23 +45,21 @@ const createInnerTRPCContext = ({ auth }: AuthContext) => { }; }; -/** - * This is the actual context you'll use in your router. It will be used to - * process every request that goes through your tRPC endpoint - * @link https://trpc.io/docs/context - */ -export const createTRPCContext = (opts: CreateNextContextOptions) => { - return createInnerTRPCContext({ auth: getAuth(opts.req) }); +export const createTRPCContext = ({ req }: FetchCreateContextFnOptions) => { + return createInnerTRPCContext({ auth: getAuth(req as NextRequest) }); }; +export type Context = inferAsyncReturnType; + /** * 2. INITIALIZATION * * This is where the trpc api is initialized, connecting the context and * transformer */ -import { initTRPC, TRPCError } from "@trpc/server"; +import { type inferAsyncReturnType, initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; +import type { NextRequest } from "next/server"; const t = initTRPC.context().create({ transformer: superjson,