ponder 0.9.3 → 0.9.4-debug.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -36,6 +36,7 @@ declare global {
36
36
  var PONDER_NAMESPACE_BUILD: NamespaceBuild;
37
37
  var PONDER_INDEXING_BUILD: IndexingBuild;
38
38
  var PONDER_DATABASE: Database;
39
+ var COMMON: Common;
39
40
  }
40
41
 
41
42
  const BUILD_ID_VERSION = "1";
@@ -273,6 +274,7 @@ export const createBuild = async ({
273
274
  async executeApi({ indexingBuild, database }): Promise<ApiResult> {
274
275
  globalThis.PONDER_INDEXING_BUILD = indexingBuild;
275
276
  globalThis.PONDER_DATABASE = database;
277
+ globalThis.COMMON = common;
276
278
 
277
279
  if (!fs.existsSync(common.options.apiFile)) {
278
280
  const error = new BuildError(
@@ -65,9 +65,9 @@ type DatabaseConfig =
65
65
 
66
66
  type BlockConfig = {
67
67
  /** Block number at which to start indexing events (inclusive). If `undefined`, events will be processed from block 0. Default: `undefined`. */
68
- startBlock?: number;
68
+ startBlock?: number | "latest";
69
69
  /** Block number at which to stop indexing events (inclusive). If `undefined`, events will be processed in real-time. Default: `undefined`. */
70
- endBlock?: number;
70
+ endBlock?: number | "latest";
71
71
  };
72
72
 
73
73
  type TransactionReceiptConfig = {
@@ -215,9 +215,9 @@ type AccountsConfig<networks, accounts> = {} extends accounts
215
215
 
216
216
  type BlockFilterConfig = {
217
217
  /** Block number at which to start indexing events (inclusive). If `undefined`, events will be processed from block 0. Default: `undefined`. */
218
- startBlock?: number;
218
+ startBlock?: number | "latest";
219
219
  /** Block number at which to stop indexing events (inclusive). If `undefined`, events will be processed in real-time. Default: `undefined`. */
220
- endBlock?: number;
220
+ endBlock?: number | "latest";
221
221
  interval?: number;
222
222
  };
223
223
 
@@ -0,0 +1,4 @@
1
+ import { createHistoricalIndexingStore } from "./indexing-store/historical.js";
2
+ import { createRealtimeIndexingStore } from "./indexing-store/realtime.js";
3
+
4
+ export { createRealtimeIndexingStore, createHistoricalIndexingStore };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../common/src/promiseWithResolvers.ts","../../common/src/queue.ts","../../common/src/dedupe.ts","../src/indexing-store/metadata.ts","../src/utils/never.ts","../src/utils/serialize.ts"],"sourcesContent":["export type PromiseWithResolvers<TPromise> = {\n resolve: (arg: TPromise) => void;\n reject: (error: Error) => void;\n promise: Promise<TPromise>;\n};\n\n/**\n * @description Application level polyfill.\n */\nexport const promiseWithResolvers = <\n TPromise,\n>(): PromiseWithResolvers<TPromise> => {\n let resolve: (arg: TPromise) => void;\n let reject: (error: Error) => void;\n const promise = new Promise<TPromise>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve: resolve!, reject: reject!, promise };\n};\n","import {\n type PromiseWithResolvers,\n promiseWithResolvers,\n} from \"./promiseWithResolvers.js\";\n\nexport type InnerQueue<returnType, taskType> = {\n task: taskType;\n resolve: (arg: returnType) => void;\n reject: (error: Error) => void;\n}[];\n\nexport type Queue<returnType, taskType> = {\n size: () => number;\n pending: () => Promise<number>;\n add: (task: taskType) => Promise<returnType>;\n clear: () => void;\n isStarted: () => boolean;\n start: () => Promise<void>;\n pause: () => void;\n onIdle: () => Promise<void>;\n onEmpty: () => Promise<void>;\n setParameters: (\n parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n >,\n ) => void;\n};\n\nexport type CreateQueueParameters<returnType, taskType> = {\n worker: (task: taskType) => Promise<returnType>;\n initialStart?: boolean;\n browser?: boolean;\n} & (\n | {\n concurrency: number;\n frequency: number;\n }\n | { concurrency: number; frequency?: undefined }\n | { concurrency?: undefined; frequency: number }\n);\n\nconst validateParameters = ({\n concurrency,\n frequency,\n}: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n>) => {\n if (concurrency === undefined && frequency === undefined) {\n throw new Error(\n \"Invalid queue configuration, must specify either 'concurrency' or 'frequency'.\",\n );\n }\n\n if (concurrency !== undefined && concurrency <= 0) {\n throw new Error(\n `Invalid value for queue 'concurrency' option. Got ${concurrency}, expected a number greater than zero.`,\n );\n }\n\n if (frequency !== undefined && frequency <= 0) {\n throw new Error(\n `Invalid value for queue 'frequency' option. Got ${frequency}, expected a number greater than zero.`,\n );\n }\n};\n\nexport const createQueue = <returnType, taskType = void>({\n worker,\n initialStart = false,\n browser = true,\n ..._parameters\n}: CreateQueueParameters<returnType, taskType>): Queue<\n returnType,\n taskType\n> => {\n validateParameters(_parameters);\n\n const parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n > = _parameters;\n let queue = new Array<InnerQueue<returnType, taskType>[number]>();\n let pending = 0;\n let timestamp = 0;\n let requests = 0;\n let isStarted = initialStart;\n\n let timer: NodeJS.Timeout | undefined;\n\n let emptyPromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n let idlePromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n\n const next = () => {\n if (!isStarted) return;\n\n const _timestamp = Date.now();\n\n if (Math.floor(_timestamp / 1_000) !== timestamp) {\n requests = 0;\n timestamp = Math.floor(_timestamp / 1_000);\n }\n\n if (timer) return;\n\n while (\n (parameters.frequency !== undefined\n ? requests < parameters.frequency\n : true) &&\n (parameters.concurrency !== undefined\n ? pending < parameters.concurrency\n : true) &&\n queue.length > 0\n ) {\n const { task, resolve, reject } = queue.shift()!;\n\n requests++;\n pending++;\n\n worker(task)\n .then(resolve)\n .catch(reject)\n .finally(() => {\n pending--;\n\n if (\n idlePromiseWithResolvers !== undefined &&\n queue.length === 0 &&\n pending === 0\n ) {\n idlePromiseWithResolvers.resolve();\n idlePromiseWithResolvers.completed = true;\n }\n\n browser ? next() : process.nextTick(next);\n });\n\n if (emptyPromiseWithResolvers !== undefined && queue.length === 0) {\n emptyPromiseWithResolvers.resolve();\n emptyPromiseWithResolvers.completed = true;\n }\n }\n\n if (\n parameters.frequency !== undefined &&\n requests >= parameters.frequency\n ) {\n timer = setTimeout(\n () => {\n timer = undefined;\n next();\n },\n 1_000 - (_timestamp % 1_000),\n );\n return;\n }\n };\n\n return {\n size: () => queue.length,\n pending: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n );\n } else {\n return new Promise<number>((resolve) =>\n setImmediate(() => resolve(pending)),\n );\n }\n },\n add: (task: taskType) => {\n const { promise, resolve, reject } = promiseWithResolvers<returnType>();\n queue.push({ task, resolve, reject });\n\n next();\n\n return promise;\n },\n clear: () => {\n queue = new Array<InnerQueue<returnType, taskType>[number]>();\n clearTimeout(timer);\n timer = undefined;\n },\n isStarted: () => isStarted,\n start: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n } else {\n return new Promise<number>((resolve) =>\n process.nextTick(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n }\n },\n pause: () => {\n isStarted = false;\n },\n onIdle: () => {\n if (\n idlePromiseWithResolvers === undefined ||\n idlePromiseWithResolvers.completed\n ) {\n if (queue.length === 0 && pending === 0) return Promise.resolve();\n\n idlePromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return idlePromiseWithResolvers.promise;\n },\n onEmpty: () => {\n if (\n emptyPromiseWithResolvers === undefined ||\n emptyPromiseWithResolvers.completed\n ) {\n if (queue.length === 0) return Promise.resolve();\n\n emptyPromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return emptyPromiseWithResolvers.promise;\n },\n setParameters: (_parameters) => {\n validateParameters(_parameters);\n\n if (\"frequency\" in _parameters) {\n parameters.frequency = _parameters.frequency;\n }\n if (\"concurrency\" in _parameters) {\n parameters.concurrency = _parameters.concurrency;\n }\n },\n } as Queue<returnType, taskType>;\n};\n","/**\n * Remove duplicate values from an array.\n *\n * @param getId callback used to calculate a unique value for an element of the array.\n *\n * @example\n * dedupe([1,1,2,3]) // [1,2,3]\n *\n * dedupe(\n * [\n * { a: 1, b: 2 },\n * { a: 1, b: 2 },\n * { a: 2, b: 2 },\n * ],\n * (e) => `${e.a}_${e.b}`,\n * ) // [{a: 1, b: 2}, {a: 2, b: 2}]\n *\n */\nexport function dedupe<item, id>(\n arr: item[] | readonly item[],\n getId?: (x: item) => id,\n): item[] {\n const seen = new Set<id | item>();\n\n return arr.filter((x) => {\n if (seen.has(getId ? getId(x) : x)) return false;\n\n seen.add(x);\n return true;\n });\n}\n\ndedupe(\n [\n { a: 1, b: 2 },\n { a: 1, b: 2 },\n { a: 2, b: 2 },\n ],\n (e) => `${e.a}_${e.b}`,\n);\n","import type { Database } from \"@/database/index.js\";\nimport type { Status } from \"@/internal/types.js\";\nimport { sql } from \"kysely\";\n\nexport type MetadataStore = {\n setStatus: (status: Status) => Promise<void>;\n getStatus: () => Promise<Status | null>;\n};\n\nexport const getMetadataStore = ({\n database,\n}: {\n database: Database;\n}): MetadataStore => ({\n getStatus: async () => {\n return database.wrap({ method: \"_ponder_status.get()\" }, async () => {\n const result = await database.qb.user\n .selectFrom(\"_ponder_status\")\n .selectAll()\n .execute();\n\n if (result.length === 0) {\n return null;\n }\n\n const status: Status = {};\n\n for (const row of result) {\n status[row.network_name] = {\n block:\n row.block_number && row.block_timestamp\n ? {\n number: Number(row.block_number),\n timestamp: Number(row.block_timestamp),\n }\n : null,\n ready: row.ready,\n };\n }\n\n return status;\n });\n },\n setStatus: (status: Status) => {\n return database.wrap({ method: \"_ponder_status.set()\" }, async () => {\n await database.qb.user\n .insertInto(\"_ponder_status\")\n .values(\n Object.entries(status).map(([networkName, value]) => ({\n network_name: networkName,\n block_number: value.block?.number,\n block_timestamp: value.block?.timestamp,\n ready: value.ready,\n })),\n )\n .onConflict((oc) =>\n oc.column(\"network_name\").doUpdateSet({\n block_number: sql`excluded.block_number`,\n block_timestamp: sql`excluded.block_timestamp`,\n ready: sql`excluded.ready`,\n }),\n )\n .execute();\n });\n },\n});\n","export const never = (_x: never) => {\n throw \"unreachable\";\n};\n","/**\n * Serialize function that handles BigInt.\n *\n * Forked from https://github.com/wevm/wagmi\n *\n * @param value to stringify\n * @returns the stringified output\n */\nexport function serialize(value: any) {\n return JSON.stringify(value, (_, v) =>\n typeof v === \"bigint\" ? { __type: \"bigint\", value: v.toString() } : v,\n );\n}\n\n/**\n * Deserialize function that handles BigInt.\n *\n * Forked from https://github.com/wevm/wagmi\n *\n * @param value to parse\n * @returns the output object\n */\nexport function deserialize<type>(value: string): type {\n return JSON.parse(value, (_, value_) =>\n value_?.__type === \"bigint\" ? BigInt(value_.value) : value_,\n );\n}\n"],"mappings":"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","names":["_parameters"]}