@ensnode/ponder-metadata 0.18.0 → 0.19.2

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.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { EnsRainbow } from '@ensnode/ensrainbow-sdk';
2
2
  import { MiddlewareHandler } from 'hono';
3
3
  import { ReadonlyDrizzle } from 'ponder';
4
4
  import { PublicClient } from 'viem';
5
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
5
6
 
6
7
  /**
7
8
  * Basic information about a block.
@@ -102,4 +103,402 @@ interface PonderMetadataModule {
102
103
  type MetadataMiddlewareResponse = PonderMetadataMiddlewareResponse<PonderMetadataModule["AppInfo"], PonderMetadataModule["EnvVars"], PonderMetadataModule["RuntimeInfo"]>;
103
104
  declare function ponderMetadata<AppInfo extends PonderMetadataModule["AppInfo"], EnvVars extends PonderMetadataModule["EnvVars"]>({ app, db, env, query, publicClients, }: PonderMetadataMiddlewareOptions<AppInfo, EnvVars>): MiddlewareHandler;
104
105
 
105
- export { type BlockInfo, type MetadataMiddlewareResponse, type NetworkIndexingStatus, type PonderMetadataMiddlewareResponse, ponderMetadata };
106
+ /**
107
+ * Internal ponder metadata type.
108
+ * Copied from https://github.com/ponder-sh/ponder/blob/32634897bf65e92a85dc4cccdaba70c9425d90f3/packages/core/src/database/index.ts#L94-L102
109
+ */
110
+ type PonderAppMeta = {
111
+ is_locked: 0 | 1;
112
+ is_dev: 0 | 1;
113
+ heartbeat_at: number;
114
+ build_id: string;
115
+ checkpoint: string;
116
+ table_names: Array<string>;
117
+ version: string;
118
+ };
119
+ /**
120
+ * Get DB schema for _ponder_meta table.
121
+ * Akin to https://github.com/ponder-sh/ponder/blob/32634897bf65e92a85dc4cccdaba70c9425d90f3/packages/core/src/database/index.ts#L129-L141
122
+ *
123
+ * @param databaseNamespace A namespace for the database.
124
+ * @returns A table schema for _ponder_meta table.
125
+ * */
126
+ declare const getPonderMetaTableSchema: (databaseNamespace: string) => drizzle_orm_pg_core.PgTableWithColumns<{
127
+ name: "_ponder_meta";
128
+ schema: undefined;
129
+ columns: {
130
+ key: drizzle_orm_pg_core.PgColumn<{
131
+ name: "key";
132
+ tableName: "_ponder_meta";
133
+ dataType: "string";
134
+ columnType: "PgText";
135
+ data: "app";
136
+ driverParam: string;
137
+ notNull: true;
138
+ hasDefault: false;
139
+ isPrimaryKey: true;
140
+ isAutoincrement: false;
141
+ hasRuntimeDefault: false;
142
+ enumValues: [string, ...string[]];
143
+ baseColumn: never;
144
+ identity: undefined;
145
+ generated: undefined;
146
+ }, {}, {
147
+ $type: "app";
148
+ }>;
149
+ value: drizzle_orm_pg_core.PgColumn<{
150
+ name: "value";
151
+ tableName: "_ponder_meta";
152
+ dataType: "json";
153
+ columnType: "PgJsonb";
154
+ data: PonderAppMeta;
155
+ driverParam: unknown;
156
+ notNull: true;
157
+ hasDefault: false;
158
+ isPrimaryKey: false;
159
+ isAutoincrement: false;
160
+ hasRuntimeDefault: false;
161
+ enumValues: undefined;
162
+ baseColumn: never;
163
+ identity: undefined;
164
+ generated: undefined;
165
+ }, {}, {
166
+ $type: PonderAppMeta;
167
+ }>;
168
+ };
169
+ dialect: "pg";
170
+ }> | drizzle_orm_pg_core.PgTableWithColumns<{
171
+ name: "_ponder_meta";
172
+ schema: string;
173
+ columns: {
174
+ key: drizzle_orm_pg_core.PgColumn<{
175
+ name: "key";
176
+ tableName: "_ponder_meta";
177
+ dataType: "string";
178
+ columnType: "PgText";
179
+ data: "app";
180
+ driverParam: string;
181
+ notNull: true;
182
+ hasDefault: false;
183
+ isPrimaryKey: true;
184
+ isAutoincrement: false;
185
+ hasRuntimeDefault: false;
186
+ enumValues: [string, ...string[]];
187
+ baseColumn: never;
188
+ identity: undefined;
189
+ generated: undefined;
190
+ }, {}, {
191
+ $type: "app";
192
+ }>;
193
+ value: drizzle_orm_pg_core.PgColumn<{
194
+ name: "value";
195
+ tableName: "_ponder_meta";
196
+ dataType: "json";
197
+ columnType: "PgJsonb";
198
+ data: PonderAppMeta;
199
+ driverParam: unknown;
200
+ notNull: true;
201
+ hasDefault: false;
202
+ isPrimaryKey: false;
203
+ isAutoincrement: false;
204
+ hasRuntimeDefault: false;
205
+ enumValues: undefined;
206
+ baseColumn: never;
207
+ identity: undefined;
208
+ generated: undefined;
209
+ }, {}, {
210
+ $type: PonderAppMeta;
211
+ }>;
212
+ };
213
+ dialect: "pg";
214
+ }>;
215
+ /**
216
+ * Get DB schema for _ponder_status table.
217
+ * Akin to https://github.com/ponder-sh/ponder/blob/32634897bf65e92a85dc4cccdaba70c9425d90f3/packages/core/src/database/index.ts#L143-L159
218
+ *
219
+ * @param databaseNamespace A namespace for the database.
220
+ * @returns A table schema for _ponder_status table.
221
+ */
222
+ declare const getPonderStatusTableSchema: (databaseNamespace: string) => drizzle_orm_pg_core.PgTableWithColumns<{
223
+ name: "_ponder_status";
224
+ schema: undefined;
225
+ columns: {
226
+ network_name: drizzle_orm_pg_core.PgColumn<{
227
+ name: "network_name";
228
+ tableName: "_ponder_status";
229
+ dataType: "string";
230
+ columnType: "PgText";
231
+ data: string;
232
+ driverParam: string;
233
+ notNull: true;
234
+ hasDefault: false;
235
+ isPrimaryKey: true;
236
+ isAutoincrement: false;
237
+ hasRuntimeDefault: false;
238
+ enumValues: [string, ...string[]];
239
+ baseColumn: never;
240
+ identity: undefined;
241
+ generated: undefined;
242
+ }, {}, {}>;
243
+ block_number: drizzle_orm_pg_core.PgColumn<{
244
+ name: "block_number";
245
+ tableName: "_ponder_status";
246
+ dataType: "number";
247
+ columnType: "PgBigInt53";
248
+ data: number;
249
+ driverParam: string | number;
250
+ notNull: false;
251
+ hasDefault: false;
252
+ isPrimaryKey: false;
253
+ isAutoincrement: false;
254
+ hasRuntimeDefault: false;
255
+ enumValues: undefined;
256
+ baseColumn: never;
257
+ identity: undefined;
258
+ generated: undefined;
259
+ }, {}, {}>;
260
+ block_timestamp: drizzle_orm_pg_core.PgColumn<{
261
+ name: "block_timestamp";
262
+ tableName: "_ponder_status";
263
+ dataType: "number";
264
+ columnType: "PgBigInt53";
265
+ data: number;
266
+ driverParam: string | number;
267
+ notNull: false;
268
+ hasDefault: false;
269
+ isPrimaryKey: false;
270
+ isAutoincrement: false;
271
+ hasRuntimeDefault: false;
272
+ enumValues: undefined;
273
+ baseColumn: never;
274
+ identity: undefined;
275
+ generated: undefined;
276
+ }, {}, {}>;
277
+ ready: drizzle_orm_pg_core.PgColumn<{
278
+ name: "ready";
279
+ tableName: "_ponder_status";
280
+ dataType: "boolean";
281
+ columnType: "PgBoolean";
282
+ data: boolean;
283
+ driverParam: boolean;
284
+ notNull: true;
285
+ hasDefault: false;
286
+ isPrimaryKey: false;
287
+ isAutoincrement: false;
288
+ hasRuntimeDefault: false;
289
+ enumValues: undefined;
290
+ baseColumn: never;
291
+ identity: undefined;
292
+ generated: undefined;
293
+ }, {}, {}>;
294
+ };
295
+ dialect: "pg";
296
+ }> | drizzle_orm_pg_core.PgTableWithColumns<{
297
+ name: "_ponder_status";
298
+ schema: string;
299
+ columns: {
300
+ network_name: drizzle_orm_pg_core.PgColumn<{
301
+ name: "network_name";
302
+ tableName: "_ponder_status";
303
+ dataType: "string";
304
+ columnType: "PgText";
305
+ data: string;
306
+ driverParam: string;
307
+ notNull: true;
308
+ hasDefault: false;
309
+ isPrimaryKey: true;
310
+ isAutoincrement: false;
311
+ hasRuntimeDefault: false;
312
+ enumValues: [string, ...string[]];
313
+ baseColumn: never;
314
+ identity: undefined;
315
+ generated: undefined;
316
+ }, {}, {}>;
317
+ block_number: drizzle_orm_pg_core.PgColumn<{
318
+ name: "block_number";
319
+ tableName: "_ponder_status";
320
+ dataType: "number";
321
+ columnType: "PgBigInt53";
322
+ data: number;
323
+ driverParam: string | number;
324
+ notNull: false;
325
+ hasDefault: false;
326
+ isPrimaryKey: false;
327
+ isAutoincrement: false;
328
+ hasRuntimeDefault: false;
329
+ enumValues: undefined;
330
+ baseColumn: never;
331
+ identity: undefined;
332
+ generated: undefined;
333
+ }, {}, {}>;
334
+ block_timestamp: drizzle_orm_pg_core.PgColumn<{
335
+ name: "block_timestamp";
336
+ tableName: "_ponder_status";
337
+ dataType: "number";
338
+ columnType: "PgBigInt53";
339
+ data: number;
340
+ driverParam: string | number;
341
+ notNull: false;
342
+ hasDefault: false;
343
+ isPrimaryKey: false;
344
+ isAutoincrement: false;
345
+ hasRuntimeDefault: false;
346
+ enumValues: undefined;
347
+ baseColumn: never;
348
+ identity: undefined;
349
+ generated: undefined;
350
+ }, {}, {}>;
351
+ ready: drizzle_orm_pg_core.PgColumn<{
352
+ name: "ready";
353
+ tableName: "_ponder_status";
354
+ dataType: "boolean";
355
+ columnType: "PgBoolean";
356
+ data: boolean;
357
+ driverParam: boolean;
358
+ notNull: true;
359
+ hasDefault: false;
360
+ isPrimaryKey: false;
361
+ isAutoincrement: false;
362
+ hasRuntimeDefault: false;
363
+ enumValues: undefined;
364
+ baseColumn: never;
365
+ identity: undefined;
366
+ generated: undefined;
367
+ }, {}, {}>;
368
+ };
369
+ dialect: "pg";
370
+ }>;
371
+ type PonderStatusTableSchema = ReturnType<typeof getPonderStatusTableSchema>;
372
+ /**
373
+ * Get a list of ponder status entries for each network.
374
+ *
375
+ * @param namespace A namespace for the database (e.g. "public").
376
+ * @param db Drizzle DB Client instance.
377
+ * @returns a list of ponder status entries for each network.
378
+ */
379
+ declare function queryPonderStatus(namespace: string, db: ReadonlyDrizzle<Record<string, unknown>>): Promise<Array<PonderStatusTableSchema["$inferSelect"]>>;
380
+ type PonderMetaTableSchema = ReturnType<typeof getPonderMetaTableSchema>;
381
+ /**
382
+ * Get ponder metadata for the app.
383
+ *
384
+ * @param namespace A namespace for the database (e.g. "public").
385
+ * @param db Drizzle DB Client instance.
386
+ * @returns ponder metadata for the app.
387
+ * @throws Error if ponder metadata not found.
388
+ */
389
+ declare function queryPonderMeta(namespace: string, db: ReadonlyDrizzle<Record<string, unknown>>): Promise<PonderMetaTableSchema["$inferSelect"]["value"]>;
390
+
391
+ declare module "parse-prometheus-text-format" {
392
+ interface PrometheusMetric {
393
+ name: string;
394
+ help: string;
395
+ type: string;
396
+ metrics: Array<{
397
+ value: string;
398
+ labels?: Record<string, string>;
399
+ }>;
400
+ }
401
+ export default function parsePrometheusTextFormat(text: string): Array<PrometheusMetric>;
402
+ }
403
+
404
+ declare class PrometheusMetrics {
405
+ private readonly metrics;
406
+ private constructor();
407
+ static parse(maybePrometheusMetricsText: string): PrometheusMetrics;
408
+ /**
409
+ * Gets all metrics of a specific name
410
+ * @param name Metric name
411
+ * @returns Array of metrics or undefined if not found
412
+ * @example
413
+ * ```ts
414
+ * const metrics = parser.get('ponder_historical_total_indexing_seconds');
415
+ * // Returns: [
416
+ * // { value: 251224935, labels: { network: "1" } },
417
+ * // { value: 251224935, labels: { network: "8453" } }
418
+ * // ]
419
+ * ```
420
+ */
421
+ get(name: string): Array<{
422
+ value: number;
423
+ labels?: Record<string, string>;
424
+ }> | undefined;
425
+ /**
426
+ * Gets a single metric value, optionally filtered by labels
427
+ * @param name Metric name
428
+ * @param labelFilter Optional label key-value pairs to match
429
+ * @returns Metric value or undefined if not found
430
+ * @example
431
+ * ```ts
432
+ * // Get simple value
433
+ * parser.getValue('ponder_historical_start_timestamp_seconds') // Returns: 1740391265
434
+ *
435
+ * // Get value with label filter
436
+ * parser.getValue('ponder_historical_total_indexing_seconds', { network: '1' }) // Returns: 251224935
437
+ * ```
438
+ */
439
+ getValue(name: string, labelFilter?: Record<string, string>): number | undefined;
440
+ /**
441
+ * Gets a label value from a metric
442
+ * @param name Metric name
443
+ * @param label Label name to retrieve
444
+ * @returns Label value or undefined if not found
445
+ * @example
446
+ * ```ts
447
+ * parser.getLabel('ponder_version_info', 'version') // Returns: "0.9.18"
448
+ * parser.getLabel('ponder_settings_info', 'ordering') // Returns: "omnichain"
449
+ * ```
450
+ */
451
+ getLabel(name: string, label: string): string | undefined;
452
+ /**
453
+ * Gets all unique label values for a metric
454
+ * @param name Metric name
455
+ * @param label Label name to retrieve
456
+ * @returns Array of unique label values
457
+ * @example
458
+ * ```ts
459
+ * // Get all network IDs
460
+ * parser.getLabels('ponder_historical_total_indexing_seconds', 'network')
461
+ * // Returns: ['1', '8453']
462
+ * ```
463
+ */
464
+ getLabels(name: string, label: string): string[];
465
+ /**
466
+ * Gets help text for a metric
467
+ * @param name Metric name
468
+ * @returns Help text or undefined if not found
469
+ * @example
470
+ * ```ts
471
+ * parser.getHelp('ponder_historical_start_timestamp_seconds')
472
+ * // Returns: "Timestamp at which historical indexing started"
473
+ * ```
474
+ */
475
+ getHelp(name: string): string | undefined;
476
+ /**
477
+ * Gets metric type
478
+ * @param name Metric name
479
+ * @returns Metric type or undefined if not found
480
+ * @example
481
+ * ```ts
482
+ * parser.getType('ponder_version_info') // Returns: "gauge"
483
+ * parser.getType('ponder_postgres_query_total') // Returns: "counter"
484
+ * ```
485
+ */
486
+ getType(name: string): string | undefined;
487
+ /**
488
+ * Gets all metric names
489
+ * @returns Array of metric names
490
+ * @example
491
+ * ```ts
492
+ * parser.getMetricNames()
493
+ * // Returns: [
494
+ * // 'ponder_version_info',
495
+ * // 'ponder_settings_info',
496
+ * // 'ponder_historical_start_timestamp_seconds',
497
+ * // 'ponder_historical_total_indexing_seconds'
498
+ * // ]
499
+ * ```
500
+ */
501
+ getMetricNames(): string[];
502
+ }
503
+
504
+ export { type BlockInfo, type MetadataMiddlewareResponse, type NetworkIndexingStatus, type PonderMetadataMiddlewareResponse, PrometheusMetrics, ponderMetadata, queryPonderMeta, queryPonderStatus };
package/dist/index.js CHANGED
@@ -326,6 +326,9 @@ function ponderBlockInfoToBlockMetadata(block) {
326
326
  };
327
327
  }
328
328
  export {
329
- ponderMetadata
329
+ PrometheusMetrics,
330
+ ponderMetadata,
331
+ queryPonderMeta,
332
+ queryPonderStatus
330
333
  };
331
334
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ensnode/ponder-metadata",
3
- "version": "0.18.0",
3
+ "version": "0.19.2",
4
4
  "type": "module",
5
5
  "description": "A Hono middleware for making Ponder app metadata available to clients.",
6
6
  "license": "MIT",
@@ -29,7 +29,7 @@
29
29
  "drizzle-orm": "^0.39.3",
30
30
  "parse-prometheus-text-format": "^1.1.1",
31
31
  "viem": "^2.22.13",
32
- "@ensnode/ensrainbow-sdk": "0.18.0"
32
+ "@ensnode/ensrainbow-sdk": "0.19.2"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@biomejs/biome": "^1.9.4",
@@ -39,7 +39,7 @@
39
39
  "tsup": "^8.3.6",
40
40
  "typescript": "^5.7.3",
41
41
  "vitest": "^3.1.1",
42
- "@ensnode/shared-configs": "0.18.0"
42
+ "@ensnode/shared-configs": "0.19.2"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "hono": "^4.6.14",