From d17ca9c0fe20593fb6b7facb86b1448885a10325 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Mon, 25 Sep 2023 23:19:53 -0400 Subject: [PATCH 01/10] replace `bcrypt` with bun's password hashing --- api/package.json | 5 +- api/src/auth/resolver.ts | 8 +-- api/src/users/resolver.ts | 4 +- api/tsconfig.json | 5 +- pnpm-lock.yaml | 136 ++------------------------------------ 5 files changed, 19 insertions(+), 139 deletions(-) diff --git a/api/package.json b/api/package.json index 78e7a921..52a2a109 100644 --- a/api/package.json +++ b/api/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "tsc", "start": "node build/index.js", - "dev": "concurrently --raw \"tsc -w --preserveWatchOutput\" \"node --watch build/index.js\"", + "dev": "concurrently --raw \"tsc -w --preserveWatchOutput\" \"bun --watch build/index.js\"", "db:create": "mikro-orm schema:create --run", "db:update": "mikro-orm schema:update --run", "db:drop": "mikro-orm schema:drop --run", @@ -30,7 +30,6 @@ "@sentry/integrations": "^7.68.0", "@sentry/node": "^7.68.0", "aws-sdk": "^2.1454.0", - "bcrypt": "^5.1.1", "body-parser": "^1.20.2", "car-info": "^0.1.5", "class-validator": "^0.14.0", @@ -54,7 +53,6 @@ "devDependencies": { "@mikro-orm/cli": "5.8.0", "@mikro-orm/migrations": "5.8.0", - "@types/bcrypt": "^5.0.0", "@types/body-parser": "^1.19.2", "@types/cors": "^2.8.14", "@types/express": "^4.17.17", @@ -62,6 +60,7 @@ "@types/nodemailer": "^6.4.10", "@types/uuid": "^9.0.3", "@types/ws": "^8.5.5", + "bun-types": "^1.0.3", "concurrently": "^8.2.1", "ts-node": "^10.9.1", "typescript": "^5.1.6" diff --git a/api/src/auth/resolver.ts b/api/src/auth/resolver.ts index 3c85b639..c079e8d1 100644 --- a/api/src/auth/resolver.ts +++ b/api/src/auth/resolver.ts @@ -9,7 +9,7 @@ import { TokenEntry } from '../entities/TokenEntry'; import { Context } from '../utils/context'; import { s3 } from '../utils/s3'; import { FileUpload } from 'graphql-upload-minimal'; -import { compare, hash } from 'bcrypt'; +import { password as bunPassword } from 'bun'; import { isDevelopment } from '../utils/constants'; @ObjectType() @@ -35,7 +35,7 @@ export class AuthResolver { isPasswordCorrect = sha256(password) === user.password; break; case (PasswordType.BCRYPT): - isPasswordCorrect = await compare(password, user.password); + isPasswordCorrect = await bunPassword.verify(password, user.password, "bcrypt"); break; default: throw new Error(`Unknown password type ${user.passwordType}`); @@ -77,7 +77,7 @@ export class AuthResolver { throw new Error("No result from AWS"); } - const password = await hash(input.password, 10); + const password = await bunPassword.hash(input.password, "bcrypt"); wrap(user).assign({ ...input, @@ -178,7 +178,7 @@ export class AuthResolver { throw new Error("Your reset token has expired. You must re-request to reset your password."); } - entry.user.password = await hash(input.password, 10); + entry.user.password = await bunPassword.hash(input.password, "bcrypt"); entry.user.passwordType = PasswordType.BCRYPT; await ctx.em.nativeDelete(TokenEntry, { user: entry.user }); diff --git a/api/src/users/resolver.ts b/api/src/users/resolver.ts index 8b8a8363..894866fa 100644 --- a/api/src/users/resolver.ts +++ b/api/src/users/resolver.ts @@ -11,7 +11,7 @@ import { S3 } from 'aws-sdk'; import { getOlderObjectsToDelete, getAllObjects, getUserFromObjectKey, deleteObject, s3 } from '../utils/s3'; import { ChangePasswordInput, EditUserInput, NotificationArgs } from './args'; import { createVerifyEmailEntryAndSendEmail } from '../auth/helpers'; -import { hash } from 'bcrypt'; +import { password as bunPassword } from 'bun'; import { VerifyEmail } from '../entities/VerifyEmail'; import { GraphQLUpload } from 'graphql-upload-minimal'; import { setContext } from "@sentry/node"; @@ -116,7 +116,7 @@ export class UserResolver { @Mutation(() => Boolean) @Authorized('No Verification') public async changePassword(@Ctx() ctx: Context, @Arg('input') input: ChangePasswordInput): Promise { - ctx.user.password = await hash(input.password, 10); + ctx.user.password = await bunPassword.hash(input.password, "bcrypt"); ctx.user.passwordType = PasswordType.BCRYPT; await ctx.em.flush(); diff --git a/api/tsconfig.json b/api/tsconfig.json index 4738067e..9d1b738a 100644 --- a/api/tsconfig.json +++ b/api/tsconfig.json @@ -20,7 +20,10 @@ "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "types": [ + "bun-types" // add Bun global + ] }, "compileOnSave": true, "include": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ac89ffe..a5684e15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,9 +39,6 @@ importers: aws-sdk: specifier: ^2.1454.0 version: 2.1464.0 - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 body-parser: specifier: ^1.20.2 version: 1.20.2 @@ -106,9 +103,6 @@ importers: '@mikro-orm/migrations': specifier: 5.8.0 version: 5.8.0(@mikro-orm/core@5.8.0)(pg@8.11.3) - '@types/bcrypt': - specifier: ^5.0.0 - version: 5.0.0 '@types/body-parser': specifier: ^1.19.2 version: 1.19.3 @@ -130,6 +124,9 @@ importers: '@types/ws': specifier: ^8.5.5 version: 8.5.6 + bun-types: + specifier: ^1.0.3 + version: 1.0.3 concurrently: specifier: ^8.2.1 version: 8.2.1 @@ -4764,24 +4761,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - dependencies: - detect-libc: 2.0.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /@mikro-orm/cli@5.8.0(@mikro-orm/migrations@5.8.0)(@mikro-orm/postgresql@5.8.0)(pg@8.11.3): resolution: {integrity: sha512-4KLaesc+1Nm4nS8mQATcKmfDXP6yAIwBeB+EvtQLSZbjF2jQliPLwJ878yUJbQdXUTeEeKU4SoJBGOwvCgReow==} engines: {node: '>= 14.0.0'} @@ -6877,12 +6856,6 @@ packages: '@babel/types': 7.23.0 dev: true - /@types/bcrypt@5.0.0: - resolution: {integrity: sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==} - dependencies: - '@types/node': 20.7.0 - dev: true - /@types/body-parser@1.19.3: resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} dependencies: @@ -7227,10 +7200,6 @@ packages: '@zag-js/dom-query': 0.16.0 dev: false - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -7362,18 +7331,6 @@ packages: resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} dev: false - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: false - /arg@4.1.0: resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} dev: false @@ -7625,18 +7582,6 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /bcrypt@5.1.1: - resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} - engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - node-addon-api: 5.1.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -7804,6 +7749,10 @@ packages: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: false + /bun-types@1.0.3: + resolution: {integrity: sha512-XlyKVdYCHa7K5PHYGcwOVOrGE/bMnLS51y7zFA3ZAAXyiQ6dTaNXNCWTTufgII/6ruN770uhAXphQmzvU/r2fQ==} + dev: true + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -8121,11 +8070,6 @@ packages: simple-swizzle: 0.2.2 dev: false - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false - /color2k@2.0.2: resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} dev: false @@ -8265,10 +8209,6 @@ packages: - supports-color dev: false - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false - /constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: @@ -8591,10 +8531,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false - /denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} dev: false @@ -8646,11 +8582,6 @@ packages: hasBin: true dev: false - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -9552,21 +9483,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: false - /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -9840,10 +9756,6 @@ packages: has-symbols: 1.0.3 dev: false - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false - /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -10955,13 +10867,6 @@ packages: semver: 5.7.2 dev: false - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: false - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -11730,10 +11635,6 @@ packages: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false - /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -11773,14 +11674,6 @@ packages: engines: {node: '>=6.0.0'} dev: false - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -11817,15 +11710,6 @@ packages: path-key: 3.1.1 dev: false - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: false - /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -14436,12 +14320,6 @@ packages: isexe: 2.0.0 dev: false - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: false - /wkx@0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: From 5bd2bdf5158f65e557e4f2d5d30c18bff678617d Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Mon, 25 Sep 2023 23:29:23 -0400 Subject: [PATCH 02/10] fix ws import --- api/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/index.ts b/api/src/index.ts index 188fa7b9..e9d7c73f 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -3,7 +3,7 @@ import "dotenv/config"; import Redis from 'ioredis'; import express from "express"; import config from './mikro-orm.config'; -import ws from 'ws'; +import { WebSocketServer } from 'ws'; import cors from 'cors'; import * as Sentry from "./utils/sentry"; import * as RealSentry from "@sentry/node"; @@ -90,7 +90,7 @@ async function start() { plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); - const wsServer = new ws.Server({ + const wsServer = new WebSocketServer({ server: httpServer, path: '/subscriptions', }); From 44552bb6e712616e14a84d5fb9770d3cb159d5e1 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Tue, 3 Oct 2023 21:45:18 -0400 Subject: [PATCH 03/10] fix deps --- api/package.json | 3 ++- api/src/users/resolver.ts | 9 ++++----- pnpm-lock.yaml | 7 +++++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/api/package.json b/api/package.json index f788be6a..b75bcead 100644 --- a/api/package.json +++ b/api/package.json @@ -62,7 +62,8 @@ "@types/ws": "^8.5.6", "concurrently": "^8.2.1", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.1.6", + "bun-types": "latest" }, "volta": { "node": "18.10.0" diff --git a/api/src/users/resolver.ts b/api/src/users/resolver.ts index 894866fa..483978de 100644 --- a/api/src/users/resolver.ts +++ b/api/src/users/resolver.ts @@ -171,15 +171,14 @@ export class UserResolver { @Mutation(() => User) @Authorized('No Verification') - public async addProfilePicture(@Ctx() ctx: Context, @Arg("picture", () => GraphQLUpload) { createReadStream, filename }: Upload, @PubSub() pubSub: PubSubEngine): Promise { - + public async addProfilePicture(@Ctx() ctx: Context, @Arg("picture", () => GraphQLUpload) picture: Upload, @PubSub() pubSub: PubSubEngine): Promise { + const { createReadStream, filename } = await picture; + const extention = filename.substring(filename.lastIndexOf("."), filename.length); - filename = ctx.user.id + "-" + Date.now() + extention; - const uploadParams = { Body: createReadStream(), - Key: "images/" + filename, + Key: "images/" + ctx.user.id + "-" + Date.now() + extention, Bucket: "beep", ACL: "public-read" }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e420989b..e8c72490 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,6 +124,9 @@ importers: '@types/ws': specifier: ^8.5.6 version: 8.5.6 + bun-types: + specifier: latest + version: 1.0.4-canary.20231003T140149 concurrently: specifier: ^8.2.1 version: 8.2.1 @@ -9343,6 +9346,10 @@ packages: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: false + /bun-types@1.0.4-canary.20231003T140149: + resolution: {integrity: sha512-eEoFyj4wBCnqQGgK3pJ3LEq8Cps8nr3bU0nFYDp4vW1fSiQISwge1Y7YFOW9ffVJWZvaxHzJfzL13ZT6JcHGTg==} + dev: true + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} From 415ddd29d50567c85893cacf22e07d23554d1ad1 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Mon, 16 Oct 2023 20:29:22 -0400 Subject: [PATCH 04/10] try to fix CI --- api/src/directions/resolver.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/directions/resolver.ts b/api/src/directions/resolver.ts index 0230b6e2..6e80195f 100644 --- a/api/src/directions/resolver.ts +++ b/api/src/directions/resolver.ts @@ -20,6 +20,7 @@ export class DirectionsResolver { @Query(() => String) public async getETA(@Arg('start') start: string, @Arg('end') end: string): Promise { return "ETAs will be back soon!"; + /* const result = await fetch(`https://maps.googleapis.com/maps/api/directions/json?origin=${start}&destination=${end}&key=${getRandom(keys)}`); const data = await result.json(); @@ -32,11 +33,13 @@ export class DirectionsResolver { } return eta; + */ } @Query(() => [Suggestion]) public async getLocationSuggestions(@Arg('location') location: string, @Arg('sessiontoken') sessiontoken: string): Promise { return []; + /* const result = await fetch(encodeURI(`https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${location}&key=${getRandom(keys)}&sessiontoken=${sessiontoken}`)); const data = await result.json(); @@ -48,5 +51,6 @@ export class DirectionsResolver { } return output; + */ } } From 1f755fb283435c8041ba0a1ba28e42cab3008bbe Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Tue, 31 Oct 2023 16:18:21 -0400 Subject: [PATCH 05/10] use bun in api dockerfile --- Dockerfile | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2b4beebd..fc3b6987 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,15 @@ -FROM node:current-alpine -# FROM mcr.microsoft.com/playwright:focal +FROM oven/bun:canary WORKDIR /usr/api COPY api/package.json ./ -RUN npm install -g pnpm - -RUN pnpm install +RUN bun install COPY api/ . -RUN npx tsc +RUN bun tsc EXPOSE 3000 -CMD [ "node", "build/index.js" ] +CMD [ "bun", "run", "build/index.js" ] From 5921d671f3b3257dc1b4c5629428615d0cef73e9 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Tue, 31 Oct 2023 16:27:16 -0400 Subject: [PATCH 06/10] add bun to github actions e2e --- .github/workflows/e2e.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 4cf30f72..114162e8 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -16,6 +16,9 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 16 + - uses: oven-sh/setup-bun@v1 + with: + bun-version: canary - uses: pnpm/action-setup@v2.2.4 name: Install pnpm id: pnpm-install From 5138c80f7a0a7a56ae85efb44309dec72879149f Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Tue, 14 Nov 2023 20:48:06 -0500 Subject: [PATCH 07/10] fix tsc error --- api/src/payments/resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/payments/resolver.ts b/api/src/payments/resolver.ts index d8ecce10..505be289 100644 --- a/api/src/payments/resolver.ts +++ b/api/src/payments/resolver.ts @@ -36,7 +36,7 @@ export class PaymentsResolver { const options = { method: 'GET', headers: { accept: 'application/json', Authorization: `Bearer ${REVENUE_CAT_SECRET}` } }; const request = await fetch(`https://api.revenuecat.com/v1/subscribers/${id ?? ctx.user.id}`, options); - const response: SubscriberResponse = await request.json(); + const response = await request.json() as SubscriberResponse; const user = await ctx.em.findOneOrFail(User, id ?? ctx.user.id); const products = Object.keys(response.subscriber.non_subscriptions) as Product[]; From d468957c4182da317b30050c91f18ddd043588da Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Sat, 18 Nov 2023 18:41:49 -0500 Subject: [PATCH 08/10] fix api type --- api/src/payments/resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/payments/resolver.ts b/api/src/payments/resolver.ts index d8ecce10..505be289 100644 --- a/api/src/payments/resolver.ts +++ b/api/src/payments/resolver.ts @@ -36,7 +36,7 @@ export class PaymentsResolver { const options = { method: 'GET', headers: { accept: 'application/json', Authorization: `Bearer ${REVENUE_CAT_SECRET}` } }; const request = await fetch(`https://api.revenuecat.com/v1/subscribers/${id ?? ctx.user.id}`, options); - const response: SubscriberResponse = await request.json(); + const response = await request.json() as SubscriberResponse; const user = await ctx.em.findOneOrFail(User, id ?? ctx.user.id); const products = Object.keys(response.subscriber.non_subscriptions) as Product[]; From 037f3621428dae551a3465f3cf1e1079bb952144 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Thu, 18 Jan 2024 21:54:20 -0500 Subject: [PATCH 09/10] fix fetch type issue --- api/src/payments/resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/payments/resolver.ts b/api/src/payments/resolver.ts index 975bfccf..9106e4c8 100644 --- a/api/src/payments/resolver.ts +++ b/api/src/payments/resolver.ts @@ -71,7 +71,7 @@ export async function syncUserPayments(em: EntityManager, userId: string): Promi const request = await fetch(`https://api.revenuecat.com/v1/subscribers/${userId}`, options); - const response: SubscriberResponse = await request.json(); + const response = await request.json() as SubscriberResponse; const user = await em.findOneOrFail(User, userId, { populate: ['payments.id'] }); From b83de8f6daad73fff9fb1cef4ca6fe94d1c30dc6 Mon Sep 17 00:00:00 2001 From: Banks Nussman Date: Sun, 4 Feb 2024 12:30:19 -0500 Subject: [PATCH 10/10] use `@types/bun` package --- api/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/tsconfig.json b/api/tsconfig.json index 9d1b738a..aad6b234 100644 --- a/api/tsconfig.json +++ b/api/tsconfig.json @@ -22,7 +22,7 @@ "emitDecoratorMetadata": true, "forceConsistentCasingInFileNames": true, "types": [ - "bun-types" // add Bun global + "@types/bun" // add Bun global ] }, "compileOnSave": true,