From 02d8d3ad5dae10d5db430dde47b1ca26b7f97bc8 Mon Sep 17 00:00:00 2001 From: Thibault Le Ouay Date: Fri, 20 Oct 2023 21:06:47 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20move=20to=20google=20task=20(#39?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🚀 move to google task * 🔥 --- .github/workflows/pull_request_template.md | 52 ++-- apps/server/README.md | 28 +++ apps/server/src/checker/checker.ts | 1 + apps/server/src/checker/index.ts | 28 ++- apps/server/src/env.ts | 1 + apps/web/package.json | 1 + .../src/app/api/checker/cron/test/route.ts | 67 ++++++ apps/web/src/env.ts | 10 + pnpm-lock.yaml | 224 +++++++++++++++++- 9 files changed, 382 insertions(+), 30 deletions(-) create mode 100644 apps/web/src/app/api/checker/cron/test/route.ts diff --git a/.github/workflows/pull_request_template.md b/.github/workflows/pull_request_template.md index e7fb48a8d..6a53d32a8 100644 --- a/.github/workflows/pull_request_template.md +++ b/.github/workflows/pull_request_template.md @@ -1,26 +1,26 @@ -## Type of change - - - -- [ ] 🐛 Bug fix -- [ ] 🌟 New feature -- [ ] 🔨 Breaking change -- [ ] 📖 Refactoring / dependency upgrade / documentation - -## Description - - - -### A picture tells a thousand words (if any) - -### Before this PR - -{Please add a screenshot here} - -### After this PR - -{Please add a screenshot here} - -### Related Issue (optional) - - \ No newline at end of file +## Type of change + + + +- [ ] 🐛 Bug fix +- [ ] 🌟 New feature +- [ ] 🔨 Breaking change +- [ ] 📖 Refactoring / dependency upgrade / documentation + +## Description + + + +### A picture tells a thousand words (if any) + +### Before this PR + +{Please add a screenshot here} + +### After this PR + +{Please add a screenshot here} + +### Related Issue (optional) + + diff --git a/apps/server/README.md b/apps/server/README.md index 178a82f43..2139079dd 100644 --- a/apps/server/README.md +++ b/apps/server/README.md @@ -12,3 +12,31 @@ From root ```bash flyctl deploy --config apps/server/fly.toml --dockerfile apps/server/Dockerfile ``` + +## Docker + +Build the docker image locally + +```bash +docker build . -t registry.fly.io/openstatus-docker:openstatus-docker-v0 --file ./apps/server/Dockerfile --platform linux/amd64 +``` + +if you want to run the docker image locally + +```bash +docker run -p 3000:3000 registry.fly.io/openstatus-docker:openstatus-docker-v0 +``` + +Push to Fly Registry + +```bash +docker push registry.fly.io/openstatus-docker:openstatus-docker-v0 + +``` + +Deploy to Fly + +```bash +flyctl deploy --app openstatus-docker \ + --image registry.fly.io/openstatus-docker:openstatus-docker-v0 +``` diff --git a/apps/server/src/checker/checker.ts b/apps/server/src/checker/checker.ts index 7ff81f5eb..980faf515 100644 --- a/apps/server/src/checker/checker.ts +++ b/apps/server/src/checker/checker.ts @@ -84,6 +84,7 @@ export const ping = async ( }, {}) || {}; const res = await fetch(data?.url, { + verbose: true, method: data?.method, cache: "no-store", headers: { diff --git a/apps/server/src/checker/index.ts b/apps/server/src/checker/index.ts index 23d32f150..fec5387e1 100644 --- a/apps/server/src/checker/index.ts +++ b/apps/server/src/checker/index.ts @@ -40,12 +40,36 @@ checkerRoute.post("/checker", async (c) => { } try { - console.log(`start checker for ${result.data.url}`); + console.log( + `start checker URL: ${result.data.url} monitorId ${result.data.monitorId}`, + ); checker(result.data); - console.log(`end checker for ${result.data.url}`); + console.log( + `end checker URL: ${result.data.url} monitorId ${result.data.monitorId}`, + ); return c.text("Ok", 200); } catch (e) { console.error(e); return c.text("Internal Server Error", 500); } }); + +checkerRoute.post("/googleTest", async (c) => { + const json = await c.req.json(); + + const auth = c.req.header("Authorization"); + if (auth !== `Basic ${env.CRON_SECRET}`) { + console.error("Unauthorized"); + return c.text("Unauthorized", 401); + } + console.log("Retry : ", c.req.header("X-CloudTasks-TaskRetryCount")); + const result = payloadSchema.safeParse(json); + + if (!result.success) { + console.error(result.error); + return c.text("Unprocessable Entity", 422); + } + + console.log(`Google Checker should try this: ${result.data.url}`); + return c.text("Ok", 200); +}); diff --git a/apps/server/src/env.ts b/apps/server/src/env.ts index dc3c5cb16..ec0f94e3a 100644 --- a/apps/server/src/env.ts +++ b/apps/server/src/env.ts @@ -11,6 +11,7 @@ export const env = createEnv({ QSTASH_CURRENT_SIGNING_KEY: z.string().min(1), QSTASH_NEXT_SIGNING_KEY: z.string().min(1), FLY_REGION: z.string(), + CRON_SECRET: z.string(), }, /** diff --git a/apps/web/package.json b/apps/web/package.json index 09b196df1..0a51e4ad6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@clerk/nextjs": "4.25.1", + "@google-cloud/tasks": "4.0.1", "@headlessui/react": "1.7.17", "@hookform/resolvers": "3.3.1", "@openstatus/analytics": "workspace:*", diff --git a/apps/web/src/app/api/checker/cron/test/route.ts b/apps/web/src/app/api/checker/cron/test/route.ts new file mode 100644 index 000000000..d07d5f7e7 --- /dev/null +++ b/apps/web/src/app/api/checker/cron/test/route.ts @@ -0,0 +1,67 @@ +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; +import { CloudTasksClient } from "@google-cloud/tasks"; +// import type { Payload } from "../../schema"; +import type { google } from "@google-cloud/tasks/build/protos/protos"; + +import { flyRegions } from "@openstatus/tinybird"; + +import { env } from "@/env"; +import { isAuthorizedDomain } from "../_cron"; + +export const dynamic = "force-dynamic"; +export const maxDuration = 300; +export const runtime = "nodejs"; // 'nodejs' is the default + +export async function GET(req: NextRequest) { + // if (isAuthorizedDomain(req.url)) { + const client = new CloudTasksClient({ + projectId: env.GCP_PROJECT_ID, + credentials: { + client_email: process.env.GCP_CLIENT_EMAIL, + private_key: env.GCP_PRIVATE_KEY.replaceAll("\\n", "\n"), + }, + }); + // Just send 10 random ping to the checker + for (let i = 0; i < 10; i++) { + const parent = client.queuePath( + env.GCP_PROJECT_ID, + env.GCP_LOCATION, + "10m", + ); + + const url = "https://api.openstatus.dev/googleTest"; + + const payload = { + status: "active", + url: "https://www.openstatus.dev", + method: "GET", + workspaceId: "1", + monitorId: "1", + cronTimestamp: 0, + pageIds: [], + }; + + for (const region of flyRegions) { + const task: google.cloud.tasks.v2beta3.ITask = { + httpRequest: { + headers: { + "Content-Type": "application/json", // Set content type to ensure compatibility your application's request parsing + "fly-prefer-region": region, + Authorization: `Basic ${env.CRON_SECRET}`, + }, + httpMethod: "POST", + url, + body: Buffer.from(JSON.stringify(payload)).toString("base64"), + }, + }; + console.log("Sending task:"); + console.log(task); + const request = { parent: parent, task: task }; + const [response] = await client.createTask(request); + console.log(`Created task ${response.name}`); + } + } + // } + return NextResponse.json({ success: true }); +} diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts index 8e73f60fd..28d639db7 100644 --- a/apps/web/src/env.ts +++ b/apps/web/src/env.ts @@ -17,6 +17,11 @@ export const env = createEnv({ STRIPE_WEBHOOK_SECRET_KEY: z.string(), UNKEY_TOKEN: z.string(), UNKEY_API_ID: z.string(), + GCP_PROJECT_ID: z.string(), + GCP_LOCATION: z.string(), + GCP_CLIENT_EMAIL: z.string(), + GCP_PRIVATE_KEY: z.string(), + CRON_SECRET: z.string(), }, client: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1), @@ -51,5 +56,10 @@ export const env = createEnv({ NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN, UNKEY_TOKEN: process.env.UNKEY_TOKEN, UNKEY_API_ID: process.env.UNKEY_API_ID, + GCP_PROJECT_ID: process.env.GCP_PROJECT_ID, + GCP_LOCATION: process.env.GCP_LOCATION, + GCP_CLIENT_EMAIL: process.env.GCP_CLIENT_EMAIL, + GCP_PRIVATE_KEY: process.env.GCP_PRIVATE_KEY, + CRON_SECRET: process.env.CRON_SECRET, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 411106771..8f25e6fc6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,6 +127,9 @@ importers: '@clerk/nextjs': specifier: 4.25.1 version: 4.25.1(next@13.5.3)(react-dom@18.2.0)(react@18.2.0) + '@google-cloud/tasks': + specifier: 4.0.1 + version: 4.0.1 '@headlessui/react': specifier: 1.7.17 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -2101,6 +2104,16 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false + /@google-cloud/tasks@4.0.1: + resolution: {integrity: sha512-cluHSN52WgaNoDPVguxCeXZq4rTBHqJntXFB9aI9zG8n8MJukf6V0H7yoAXpKXQxyeXv4LRy108kAgLPgXP3yA==} + engines: {node: '>=14.0.0'} + dependencies: + google-gax: 4.0.5 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@grpc/grpc-js@1.9.3: resolution: {integrity: sha512-b8iWtdrYIeT5fdZdS4Br/6h/kuk0PW5EVBUGk1amSbrpL8DlktJD43CdcCWwRdd6+jgwHhADSbL9CsNnm6EUPA==} engines: {node: ^8.13.0 || >=10.10.0} @@ -2109,6 +2122,14 @@ packages: '@types/node': 20.8.0 dev: false + /@grpc/grpc-js@1.9.7: + resolution: {integrity: sha512-yMaA/cIsRhGzW3ymCNpdlPcInXcovztlgu/rirThj2b87u3RzWUszliOqZ/pldy7yhmJPS8uwog+kZSTa4A0PQ==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.10 + '@types/node': 20.8.0 + dev: false + /@grpc/proto-loader@0.7.10: resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} engines: {node: '>=6'} @@ -5308,6 +5329,10 @@ packages: '@types/node': 20.8.0 dev: false + /@types/caseless@0.12.4: + resolution: {integrity: sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==} + dev: false + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -5509,6 +5534,10 @@ packages: resolution: {integrity: sha512-tfzBBb7OV2PbUfKbG6zRE5UbmtdLVCKT/XT364Z9ny6pXNbd9GnIB6aFYpq2A5lZ6mq9bhXgK6h5MFGNwhMmuQ==} dev: false + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + /@types/luxon@3.3.1: resolution: {integrity: sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==} dev: true @@ -5611,6 +5640,15 @@ packages: '@types/scheduler': 0.16.4 csstype: 3.1.2 + /@types/request@2.48.11: + resolution: {integrity: sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==} + dependencies: + '@types/caseless': 0.12.4 + '@types/node': 20.8.0 + '@types/tough-cookie': 4.0.3 + form-data: 2.5.1 + dev: false + /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: false @@ -5931,6 +5969,13 @@ packages: 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'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: @@ -5989,7 +6034,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -6311,6 +6355,10 @@ packages: engines: {node: '>=0.6'} dev: false + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -6377,6 +6425,10 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -7717,6 +7769,21 @@ packages: readable-stream: 2.3.8 dev: false + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.1 + dev: false + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} engines: {node: '>=14'} @@ -8395,6 +8462,11 @@ packages: es5-ext: 0.10.62 dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false @@ -8601,6 +8673,15 @@ packages: is-callable: 1.2.7 dev: false + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -8717,6 +8798,30 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: false + /gaxios@6.1.1: + resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} + engines: {node: '>=14'} + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.2 + is-stream: 2.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /gcp-metadata@6.0.0: + resolution: {integrity: sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==} + engines: {node: '>=14'} + dependencies: + gaxios: 6.1.1 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -8908,6 +9013,42 @@ packages: merge2: 1.4.1 slash: 3.0.0 + /google-auth-library@9.1.0: + resolution: {integrity: sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==} + engines: {node: '>=14'} + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.1.1 + gcp-metadata: 6.0.0 + gtoken: 7.0.1 + jws: 4.0.0 + lru-cache: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /google-gax@4.0.5: + resolution: {integrity: sha512-yLoYtp4zE+8OQA74oBEbNkbzI6c95W01JSL7RqC8XERKpRvj3ytZp1dgnbA6G9aRsc8pZB25xWYBcCmrbYOEhA==} + engines: {node: '>=14'} + dependencies: + '@grpc/grpc-js': 1.9.7 + '@grpc/proto-loader': 0.7.10 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.2 + google-auth-library: 9.1.0 + node-fetch: 2.7.0(encoding@0.1.13) + object-hash: 3.0.0 + proto3-json-serializer: 2.0.0 + protobufjs: 7.2.5 + retry-request: 7.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -8930,6 +9071,17 @@ packages: strip-bom-string: 1.0.0 dev: false + /gtoken@7.0.1: + resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} + engines: {node: '>=14.0.0'} + dependencies: + gaxios: 6.1.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -9431,7 +9583,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -10106,6 +10257,12 @@ packages: engines: {node: '>=4'} hasBin: true + /json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + dependencies: + bignumber.js: 9.1.2 + dev: false + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -10175,6 +10332,21 @@ packages: object.values: 1.1.7 dev: false + /jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + dev: false + /katex@0.16.8: resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} hasBin: true @@ -12532,6 +12704,13 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false + /proto3-json-serializer@2.0.0: + resolution: {integrity: sha512-FB/YaNrpiPkyQNSNPilpn8qn0KdEfkgmJ9JP93PQyF/U4bAiXY5BiUdDhiDO4S48uSQ6AesklgVlrKiqZPzegw==} + engines: {node: '>=14.0.0'} + dependencies: + protobufjs: 7.2.5 + dev: false + /protobufjs@7.2.5: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} @@ -13397,6 +13576,19 @@ packages: engines: {node: '>=4'} dev: false + /retry-request@7.0.1: + resolution: {integrity: sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==} + engines: {node: '>=14'} + dependencies: + '@types/request': 2.48.11 + debug: 4.3.4 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -13822,6 +14014,16 @@ packages: resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} dev: true + /stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + dependencies: + stubs: 3.0.0 + dev: false + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -13938,6 +14140,10 @@ packages: qs: 6.11.2 dev: false + /stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + dev: false + /style-to-js@1.1.3: resolution: {integrity: sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==} dependencies: @@ -14250,6 +14456,20 @@ packages: readable-stream: 3.6.2 dev: false + /teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} -- 2.51.2