From fae4a1732eaece1684173f4b50ec54b32f2a286c Mon Sep 17 00:00:00 2001 From: Wan Qi Chen <495709+wa0x6e@users.noreply.github.com> Date: Tue, 12 Sep 2023 01:33:32 +0900 Subject: [PATCH 1/4] fix: use graphql directly --- package.json | 2 + src/events.ts | 2 +- src/helpers/snapshot.ts | 190 +++++++++++++++++++++++++++++++++++++++ src/helpers/utils.ts | 91 +++---------------- src/providers/beams.ts | 6 +- src/providers/discord.ts | 2 +- src/providers/xmtp.ts | 6 +- src/replay.ts | 37 +------- yarn.lock | 135 +++++++++++++++++++++++++++- 9 files changed, 347 insertions(+), 124 deletions(-) create mode 100644 src/helpers/snapshot.ts diff --git a/package.json b/package.json index 4336156..0711269 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "prettier": "@snapshot-labs/prettier-config", "dependencies": { + "@apollo/client": "^3.8.3", "@pusher/push-notifications-server": "^1.2.5", "@snapshot-labs/snapshot-metrics": "^1.0.0", "@snapshot-labs/snapshot-sentry": "^1.1.0", @@ -28,6 +29,7 @@ "dotenv": "^10.0.0", "express": "^4.17.1", "express-prom-bundle": "^6.6.0", + "graphql": "^16.8.0", "lodash.chunk": "^4.2.0", "mysql": "^2.18.1", "nodemon": "^3.0.1", diff --git a/src/events.ts b/src/events.ts index 272a696..bacb5f6 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,7 +1,7 @@ import snapshot from '@snapshot-labs/snapshot.js'; import { capture } from '@snapshot-labs/snapshot-sentry'; import db from './helpers/mysql'; -import { getProposal, getSubscribers } from './helpers/utils'; +import { getProposal, getSubscribers } from './helpers/snapshot'; import { send as sendDiscord } from './providers/discord'; import { send as sendBeams } from './providers/beams'; import { send as sendWebhook } from './providers/webhook'; diff --git a/src/helpers/snapshot.ts b/src/helpers/snapshot.ts new file mode 100644 index 0000000..d9d9303 --- /dev/null +++ b/src/helpers/snapshot.ts @@ -0,0 +1,190 @@ +import { gql, ApolloClient, InMemoryCache, HttpLink } from '@apollo/client/core'; +import { capture } from '@snapshot-labs/snapshot-sentry'; +import { fetchWithKeepAlive } from './utils'; + +const HUB_URL = `${process.env.HUB_URL || 'https://hub.snapshot.org'}/graphql`; + +const client = new ApolloClient({ + link: new HttpLink({ uri: HUB_URL, fetch: fetchWithKeepAlive as any }), + cache: new InMemoryCache({ + addTypename: false + }), + defaultOptions: { + query: { + fetchPolicy: 'no-cache' + } + } +}); + +type Message = { + mci: number; + id: string; + ipfs: string; + type: string; + timestamp: number; + space: string; +}; + +type Space = { + id: string; + name: string; + avatar?: string; +}; + +type Proposal = { + space: Space; + id: string; + type: string; + author: string; + title: string; + body: string; + choices: string[]; + created: number; + start: number; + end: number; + link: string; + snapshot: string; +}; + +type Subscriber = { + address: string; +}; + +const MESSAGES_QUERY = gql` + query Messages( + $type_in: [String] + $first: Int + $mci: Int + $orderDirection: OrderDirection + $orderBy: String + ) { + messages( + where: { mci_gt: $mci, type_in: $type_in } + first: $first + orderBy: $orderBy + orderDirection: $orderDirection + ) { + mci + id + ipfs + type + timestamp + space + } + } +`; + +const SPACE_QUERY = gql` + query Space($id: String) { + space(id: $id) { + id + name + } + } +`; + +const PROPOSAL_QUERY = gql` + query Proposal($id: String) { + proposal(id: $id) { + space { + id + name + avatar + } + id + type + author + title + body + choices + created + start + end + link + snapshot + } + } +`; + +const SUBSCRIPTIONS_QUERY = gql` + query Subscriptions($space: String) { + subscriptions(where: { space: $space }) { + address + } + } +`; + +export async function getNextMessages(mci: number) { + try { + const { + data: { messages } + }: { data: { messages: Message[] } } = await client.query({ + query: MESSAGES_QUERY, + variables: { + mci, + type_in: ['proposal', 'delete-proposal'], + first: 10, + orderBy: 'mci', + orderDirection: 'asc' + } + }); + + return messages; + } catch (e: any) { + capture(e); + return []; + } +} + +export async function getSpace(id: string) { + try { + const { + data: { space } + }: { data: { space: Space | null } } = await client.query({ + query: SPACE_QUERY, + variables: { + id + } + }); + + return space; + } catch (e: any) { + capture(e); + return null; + } +} + +export async function getProposal(id: string) { + try { + const { + data: { proposal } + }: { data: { proposal: Proposal | null } } = await client.query({ + query: PROPOSAL_QUERY, + variables: { + id + } + }); + + return proposal; + } catch (e: any) { + capture(e); + return null; + } +} + +export async function getSubscribers(space: string) { + try { + const { + data: { subscribers } + }: { data: { subscribers: Subscriber[] | null } } = await client.query({ + query: SUBSCRIPTIONS_QUERY, + variables: { + space + } + }); + return (subscribers || []).map(subscriber => subscriber.address); + } catch (e: any) { + capture(e); + return []; + } +} diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index dd45ea0..fa947f5 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -1,8 +1,6 @@ import { createHash } from 'crypto'; -import snapshot from '@snapshot-labs/snapshot.js'; -import { capture } from '@snapshot-labs/snapshot-sentry'; - -const HUB_URL = process.env.HUB_URL || 'https://hub.snapshot.org'; +import http from 'node:http'; +import https from 'node:https'; export function shortenAddress(str = '') { return `${str.slice(0, 6)}...${str.slice(str.length - 4)}`; @@ -12,83 +10,14 @@ export function sha256(str) { return createHash('sha256').update(str).digest('hex'); } -export async function getSubscribers(space) { - let subscriptions: { [key: string]: any } = []; - const query = { - subscriptions: { - __args: { - where: { space } - }, - address: true - } - }; - try { - const result = await snapshot.utils.subgraphRequest(`${HUB_URL}/graphql`, query); - subscriptions = result.subscriptions || []; - } catch (e: any) { - capture(e, { contexts: { input: { query, space } } }); - } - return subscriptions.map(subscription => subscription.address); -} - -export async function getProposal(id) { - let proposal: { [key: string]: any } | null = null; - const query = { - proposal: { - __args: { - id - }, - space: { - id: true, - name: true, - avatar: true - }, - id: true, - type: true, - author: true, - title: true, - body: true, - choices: true, - start: true, - end: true, - link: true, - snapshot: true - } - }; +const agentOptions = { keepAlive: true }; +const httpAgent = new http.Agent(agentOptions); +const httpsAgent = new https.Agent(agentOptions); - try { - const result = await snapshot.utils.subgraphRequest(`${HUB_URL}/graphql`, query); - if (result.errors) { - console.error(`[events] Errors in subgraph request for proposal id: ${id}`); - } - proposal = result.proposal || null; - return proposal; - } catch (e: any) { - capture(e, { contexts: { input: { query, id } } }); - return null; - } +function agent(url: string) { + return new URL(url).protocol === 'http:' ? httpAgent : httpsAgent; } -export async function getSpace(id) { - let space: { [key: string]: any } | null = null; - const query = { - space: { - __args: { - id - }, - id: true, - name: true - } - }; - try { - const result = await snapshot.utils.subgraphRequest(`${HUB_URL}/graphql`, query); - if (result.errors) { - console.error(`[events] Errors in subgraph request for proposal id: ${id}`); - } - space = result.space || null; - return space; - } catch (e: any) { - capture(e, { contexts: { input: { query, id } } }); - return null; - } -} +export const fetchWithKeepAlive = (uri: any, options: any = {}) => { + return fetch(uri, { agent: agent(uri), ...options }); +}; diff --git a/src/providers/beams.ts b/src/providers/beams.ts index 1f25d9d..60729aa 100644 --- a/src/providers/beams.ts +++ b/src/providers/beams.ts @@ -10,8 +10,10 @@ const beams = new PushNotifications({ secretKey: process.env.SERVICE_PUSHER_BEAMS_SECRET_KEY ?? '' }); -export async function send(event, proposal, subscribers) { - if (!SERVICE_PUSH_NOTIFICATIONS || event.event !== 'proposal/start') return; +export async function send(event, proposal, subscribers: string[]) { + if (!SERVICE_PUSH_NOTIFICATIONS || event.event !== 'proposal/start' || subscribers.length === 0) { + return; + } const walletsChunks = chunk(subscribers, 100); const end = timeOutgoingRequest.startTimer({ provider: 'beams' }); diff --git a/src/providers/discord.ts b/src/providers/discord.ts index 3c0f502..897584d 100644 --- a/src/providers/discord.ts +++ b/src/providers/discord.ts @@ -16,7 +16,7 @@ import { import db from '../helpers/mysql'; import removeMd from 'remove-markdown'; import { shortenAddress } from '../helpers/utils'; -import { getSpace } from '../helpers/utils'; +import { getSpace } from '../helpers/snapshot'; import { capture } from '@snapshot-labs/snapshot-sentry'; import { timeOutgoingRequest } from '../helpers/metrics'; diff --git a/src/providers/xmtp.ts b/src/providers/xmtp.ts index 4cb8545..aa252ee 100644 --- a/src/providers/xmtp.ts +++ b/src/providers/xmtp.ts @@ -1,9 +1,9 @@ import { ApiUrls, Client } from '@xmtp/xmtp-js'; import { Wallet } from '@ethersproject/wallet'; -import { getSpace } from '../helpers/utils'; +import { capture } from '@snapshot-labs/snapshot-sentry'; +import { getSpace } from '../helpers/snapshot'; import db from '../helpers/mysql'; import { timeOutgoingRequest } from '../helpers/metrics'; -import { capture } from '@snapshot-labs/snapshot-sentry'; const XMTP_PK = process.env.XMTP_PK || Wallet.createRandom().privateKey; const XMTP_ENV = (process.env.XMTP_ENV || 'dev') as keyof typeof ApiUrls; @@ -94,7 +94,7 @@ export async function send(event, proposal, subscribers) { } async function sendMessages(addresses: string[], msg) { - if (!client) return; + if (!client || addresses.length === 0) return; const canMessage = await client.canMessage(addresses); diff --git a/src/replay.ts b/src/replay.ts index 5bc58f8..1fee508 100644 --- a/src/replay.ts +++ b/src/replay.ts @@ -1,10 +1,8 @@ import snapshot from '@snapshot-labs/snapshot.js'; -import { EnumType } from 'json-to-graphql-query'; -import db from './helpers/mysql'; import { capture } from '@snapshot-labs/snapshot-sentry'; +import db from './helpers/mysql'; import { handleCreatedEvent, handleDeletedEvent } from './events'; - -const hubURL = process.env.HUB_URL || 'https://hub.snapshot.org'; +import { getNextMessages } from './helpers/snapshot'; export let last_mci = 0; @@ -15,37 +13,6 @@ async function getLastMci() { return last_mci; } -async function getNextMessages(mci: number) { - const query = { - messages: { - __args: { - first: 10, - where: { - type_in: ['proposal', 'delete-proposal'], - mci_gt: mci - }, - orderBy: 'mci', - orderDirection: new EnumType('asc') - }, - mci: true, - id: true, - ipfs: true, - type: true, - timestamp: true, - space: true - } - }; - - try { - const results = await snapshot.utils.subgraphRequest(`${hubURL}/graphql`, query); - return results.messages; - } catch (e: any) { - capture(e, { contexts: { input: { query, mci } } }); - console.log('Failed to load messages', e); - return; - } -} - async function updateLastMci(mci: number) { const query = 'UPDATE _metadatas SET value = ? WHERE id = ? LIMIT 1'; await db.queryAsync(query, [mci.toString(), 'last_mci']); diff --git a/yarn.lock b/yarn.lock index 08a3fd8..a544d03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,25 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@apollo/client@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.8.3.tgz#7cd23307bbc788a0a9eda51e6a76f32db8282933" + integrity sha512-mK86JM6hCpMEBGDgdO9U8ZYS8r9lPjXE1tVGpJMdSFUsIcXpmEfHUAbbFpPtYmxn8Qa7XsYy0dwDaDhpf4UUPw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.7.3" + "@wry/equality" "^0.5.6" + "@wry/trie" "^0.4.3" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.17.5" + prop-types "^15.7.2" + response-iterator "^0.2.6" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -741,6 +760,11 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" +"@graphql-typed-document-node/core@^3.1.1": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" @@ -1201,6 +1225,27 @@ "@typescript-eslint/types" "5.59.0" eslint-visitor-keys "^3.3.0" +"@wry/context@^0.7.0", "@wry/context@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.3.tgz#240f6dfd4db5ef54f81f6597f6714e58d4f476a1" + integrity sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.6": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.6.tgz#cd4a533c72c3752993ab8cbf682d3d20e3cb601e" + integrity sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" + integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== + dependencies: + tslib "^2.3.0" + "@xmtp/proto@^3.24.0": version "3.26.0" resolved "https://registry.yarnpkg.com/@xmtp/proto/-/proto-3.26.0.tgz#bed211aa6e6719aebb66f666eb3d8fa94971a7f3" @@ -2081,6 +2126,18 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql@^16.8.0: + version "16.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" + integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2125,6 +2182,13 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -2246,6 +2310,11 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2386,6 +2455,13 @@ long@^5.0.0, long@^5.2.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -2538,7 +2614,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-assign@^4: +object-assign@^4, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -2562,6 +2638,15 @@ once@^1.3.0: dependencies: wrappy "1" +optimism@^0.17.5: + version "0.17.5" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.17.5.tgz#a4c78b3ad12c58623abedbebb4f2f2c19b8e8816" + integrity sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw== + dependencies: + "@wry/context" "^0.7.0" + "@wry/trie" "^0.4.3" + tslib "^2.3.0" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -2669,6 +2754,15 @@ prom-client@^14.2.0: dependencies: tdigest "^0.1.1" +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + protobufjs@^7.0.0: version "7.2.4" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" @@ -2742,6 +2836,11 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + readable-stream@2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -2793,6 +2892,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +response-iterator@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2981,6 +3085,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + tdigest@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" @@ -3020,6 +3129,13 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + ts-mixer@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.1.tgz#7c2627fb98047eb5f3c7f2fee39d1521d18fe87a" @@ -3054,6 +3170,11 @@ tslib@^2.1.0, "tslib@^2.4.1 || ^1.9.3": resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== +tslib@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tslib@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -3181,3 +3302,15 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From 900cf90749024c36c1e35ecb125c9e7d516a07b8 Mon Sep 17 00:00:00 2001 From: Wan Qi Chen <495709+wa0x6e@users.noreply.github.com> Date: Tue, 26 Sep 2023 22:35:53 +0900 Subject: [PATCH 2/4] chore: remove unused dependencies --- package.json | 1 - yarn.lock | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index d780598..c7a8810 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "express": "^4.17.1", "express-prom-bundle": "^6.6.0", "graphql": "^16.8.0", - "json-to-graphql-query": "^2.2.5", "lodash.chunk": "^4.2.0", "mysql": "^2.18.1", "node-fetch": "^1.7.0", diff --git a/yarn.lock b/yarn.lock index 7502920..6b707f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2418,7 +2418,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-to-graphql-query@^2.2.4, json-to-graphql-query@^2.2.5: +json-to-graphql-query@^2.2.4: version "2.2.5" resolved "https://registry.yarnpkg.com/json-to-graphql-query/-/json-to-graphql-query-2.2.5.tgz#56b072a693b50fd4dc981367b60d52e3dc78f426" integrity sha512-5Nom9inkIMrtY992LMBBG1Zaekrc10JaRhyZgprwHBVMDtRgllTvzl0oBbg13wJsVZoSoFNNMaeIVQs0P04vsA== From d5e76d5fa55f43aae2a7a174616ab54fe6bc28d0 Mon Sep 17 00:00:00 2001 From: Wan Qi Chen <495709+wa0x6e@users.noreply.github.com> Date: Tue, 26 Sep 2023 22:37:09 +0900 Subject: [PATCH 3/4] chore: remove unused dependencies --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index c7a8810..8e3fb99 100644 --- a/package.json +++ b/package.json @@ -29,13 +29,11 @@ "discord.js": "^14.3.0", "dotenv": "^10.0.0", "express": "^4.17.1", - "express-prom-bundle": "^6.6.0", "graphql": "^16.8.0", "lodash.chunk": "^4.2.0", "mysql": "^2.18.1", "node-fetch": "^1.7.0", "nodemon": "^3.0.1", - "prom-client": "^14.2.0", "remove-markdown": "^0.3.0", "ts-node": "^10.9.1", "typescript": "^4.8.3" From b4c6b1bfaca155980041399fb871f66abced31d7 Mon Sep 17 00:00:00 2001 From: Wan Qi Chen <495709+wa0x6e@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:16:19 +0900 Subject: [PATCH 4/4] fix: fix wrong variable name --- src/helpers/snapshot.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/helpers/snapshot.ts b/src/helpers/snapshot.ts index d9d9303..6eac0b6 100644 --- a/src/helpers/snapshot.ts +++ b/src/helpers/snapshot.ts @@ -46,7 +46,7 @@ type Proposal = { snapshot: string; }; -type Subscriber = { +type Subscription = { address: string; }; @@ -175,14 +175,14 @@ export async function getProposal(id: string) { export async function getSubscribers(space: string) { try { const { - data: { subscribers } - }: { data: { subscribers: Subscriber[] | null } } = await client.query({ + data: { subscriptions } + }: { data: { subscriptions: Subscription[] | null } } = await client.query({ query: SUBSCRIPTIONS_QUERY, variables: { space } }); - return (subscribers || []).map(subscriber => subscriber.address); + return (subscriptions || []).map(subscription => subscription.address); } catch (e: any) { capture(e); return [];