ponder 0.11.21 → 0.11.22

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.
Files changed (123) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/esm/bin/commands/createViews.js +9 -20
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +1 -1
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/list.js +4 -7
  7. package/dist/esm/bin/commands/list.js.map +1 -1
  8. package/dist/esm/bin/commands/prune.js +9 -21
  9. package/dist/esm/bin/commands/prune.js.map +1 -1
  10. package/dist/esm/bin/commands/serve.js +1 -1
  11. package/dist/esm/bin/commands/serve.js.map +1 -1
  12. package/dist/esm/bin/commands/start.js +3 -3
  13. package/dist/esm/bin/commands/start.js.map +1 -1
  14. package/dist/esm/bin/utils/run.js +159 -180
  15. package/dist/esm/bin/utils/run.js.map +1 -1
  16. package/dist/esm/build/index.js +1 -48
  17. package/dist/esm/build/index.js.map +1 -1
  18. package/dist/esm/build/plugin.js +1 -1
  19. package/dist/esm/client/index.js +9 -13
  20. package/dist/esm/client/index.js.map +1 -1
  21. package/dist/esm/database/index.js +429 -141
  22. package/dist/esm/database/index.js.map +1 -1
  23. package/dist/esm/drizzle/index.js.map +1 -1
  24. package/dist/esm/drizzle/kit/index.js.map +1 -1
  25. package/dist/esm/drizzle/onchain.js +1 -8
  26. package/dist/esm/drizzle/onchain.js.map +1 -1
  27. package/dist/esm/graphql/index.js +16 -19
  28. package/dist/esm/graphql/index.js.map +1 -1
  29. package/dist/esm/graphql/middleware.js +7 -3
  30. package/dist/esm/graphql/middleware.js.map +1 -1
  31. package/dist/esm/indexing-store/cache.js +32 -26
  32. package/dist/esm/indexing-store/cache.js.map +1 -1
  33. package/dist/esm/indexing-store/historical.js +32 -23
  34. package/dist/esm/indexing-store/historical.js.map +1 -1
  35. package/dist/esm/indexing-store/index.js +18 -1
  36. package/dist/esm/indexing-store/index.js.map +1 -1
  37. package/dist/esm/indexing-store/realtime.js +140 -89
  38. package/dist/esm/indexing-store/realtime.js.map +1 -1
  39. package/dist/esm/internal/errors.js +0 -12
  40. package/dist/esm/internal/errors.js.map +1 -1
  41. package/dist/esm/server/index.js +2 -10
  42. package/dist/esm/server/index.js.map +1 -1
  43. package/dist/esm/sync-store/index.js +432 -403
  44. package/dist/esm/sync-store/index.js.map +1 -1
  45. package/dist/esm/utils/wait.js +0 -2
  46. package/dist/esm/utils/wait.js.map +1 -1
  47. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  48. package/dist/types/bin/commands/list.d.ts.map +1 -1
  49. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  50. package/dist/types/bin/commands/start.d.ts +0 -2
  51. package/dist/types/bin/commands/start.d.ts.map +1 -1
  52. package/dist/types/bin/utils/run.d.ts +1 -1
  53. package/dist/types/bin/utils/run.d.ts.map +1 -1
  54. package/dist/types/build/index.d.ts +1 -1
  55. package/dist/types/build/index.d.ts.map +1 -1
  56. package/dist/types/client/index.d.ts.map +1 -1
  57. package/dist/types/database/index.d.ts +73 -25
  58. package/dist/types/database/index.d.ts.map +1 -1
  59. package/dist/types/drizzle/index.d.ts +3 -2
  60. package/dist/types/drizzle/index.d.ts.map +1 -1
  61. package/dist/types/drizzle/kit/index.d.ts +4 -3
  62. package/dist/types/drizzle/kit/index.d.ts.map +1 -1
  63. package/dist/types/drizzle/onchain.d.ts +5 -12
  64. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  65. package/dist/types/graphql/index.d.ts +4 -2
  66. package/dist/types/graphql/index.d.ts.map +1 -1
  67. package/dist/types/graphql/middleware.d.ts +1 -1
  68. package/dist/types/graphql/middleware.d.ts.map +1 -1
  69. package/dist/types/indexing-store/cache.d.ts +12 -5
  70. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  71. package/dist/types/indexing-store/historical.d.ts +7 -2
  72. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  73. package/dist/types/indexing-store/index.d.ts +2 -4
  74. package/dist/types/indexing-store/index.d.ts.map +1 -1
  75. package/dist/types/indexing-store/realtime.d.ts +3 -1
  76. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  77. package/dist/types/internal/errors.d.ts +0 -4
  78. package/dist/types/internal/errors.d.ts.map +1 -1
  79. package/dist/types/server/index.d.ts +1 -1
  80. package/dist/types/server/index.d.ts.map +1 -1
  81. package/dist/types/sync/index.d.ts +1 -1
  82. package/dist/types/sync-store/index.d.ts.map +1 -1
  83. package/dist/types/utils/wait.d.ts.map +1 -1
  84. package/package.json +2 -2
  85. package/src/bin/commands/createViews.ts +26 -37
  86. package/src/bin/commands/dev.ts +1 -1
  87. package/src/bin/commands/list.ts +4 -7
  88. package/src/bin/commands/prune.ts +17 -31
  89. package/src/bin/commands/serve.ts +1 -1
  90. package/src/bin/commands/start.ts +3 -4
  91. package/src/bin/utils/run.ts +210 -256
  92. package/src/build/index.ts +2 -53
  93. package/src/build/plugin.ts +1 -1
  94. package/src/client/index.ts +10 -21
  95. package/src/database/index.ts +742 -331
  96. package/src/drizzle/index.ts +3 -2
  97. package/src/drizzle/kit/index.ts +5 -2
  98. package/src/drizzle/onchain.ts +2 -26
  99. package/src/graphql/index.ts +26 -31
  100. package/src/graphql/middleware.ts +7 -5
  101. package/src/indexing-store/cache.ts +52 -35
  102. package/src/indexing-store/historical.ts +40 -28
  103. package/src/indexing-store/index.ts +27 -2
  104. package/src/indexing-store/realtime.ts +220 -176
  105. package/src/internal/errors.ts +0 -9
  106. package/src/server/index.ts +3 -14
  107. package/src/sync-store/index.ts +997 -870
  108. package/src/utils/wait.ts +0 -1
  109. package/dist/esm/database/queryBuilder.js +0 -206
  110. package/dist/esm/database/queryBuilder.js.map +0 -1
  111. package/dist/esm/database/utils.js +0 -100
  112. package/dist/esm/database/utils.js.map +0 -1
  113. package/dist/esm/drizzle/json.js +0 -119
  114. package/dist/esm/drizzle/json.js.map +0 -1
  115. package/dist/types/database/queryBuilder.d.ts +0 -37
  116. package/dist/types/database/queryBuilder.d.ts.map +0 -1
  117. package/dist/types/database/utils.d.ts +0 -25
  118. package/dist/types/database/utils.d.ts.map +0 -1
  119. package/dist/types/drizzle/json.d.ts +0 -51
  120. package/dist/types/drizzle/json.d.ts.map +0 -1
  121. package/src/database/queryBuilder.ts +0 -319
  122. package/src/database/utils.ts +0 -140
  123. package/src/drizzle/json.ts +0 -154
@@ -1,4 +1,4 @@
1
- import type { QB } from "@/database/queryBuilder.js";
1
+ import type { Database } from "@/database/index.js";
2
2
  import { getPrimaryKeyColumns } from "@/drizzle/index.js";
3
3
  import type { Common } from "@/internal/common.js";
4
4
  import { RecordNotFoundError } from "@/internal/errors.js";
@@ -10,6 +10,7 @@ import { drizzle } from "drizzle-orm/pg-proxy";
10
10
  import {
11
11
  type IndexingStore,
12
12
  checkOnchainTable,
13
+ parseSqlError,
13
14
  validateUpdateSet,
14
15
  } from "./index.js";
15
16
  import { getCacheKey, getWhereCondition } from "./utils.js";
@@ -17,14 +18,14 @@ import { getCacheKey, getWhereCondition } from "./utils.js";
17
18
  export const createRealtimeIndexingStore = ({
18
19
  common,
19
20
  schemaBuild: { schema },
21
+ database,
20
22
  }: {
21
23
  common: Common;
22
24
  schemaBuild: Pick<SchemaBuild, "schema">;
25
+ database: Database;
23
26
  }): IndexingStore => {
24
- let qb: QB = undefined!;
25
-
26
27
  const find = (table: Table, key: object) => {
27
- return qb()
28
+ return database.qb.drizzle
28
29
  .select()
29
30
  .from(table)
30
31
  .where(getWhereCondition(table, key))
@@ -33,144 +34,177 @@ export const createRealtimeIndexingStore = ({
33
34
 
34
35
  return {
35
36
  // @ts-ignore
36
- find: async (table: Table, key) => {
37
- common.metrics.ponder_indexing_store_queries_total.inc({
38
- table: getTableName(table),
39
- method: "find",
40
- });
41
- checkOnchainTable(table, "find");
42
- return find(table, key);
43
- },
37
+ find: (table: Table, key) =>
38
+ database.retry(async () => {
39
+ common.metrics.ponder_indexing_store_queries_total.inc({
40
+ table: getTableName(table),
41
+ method: "find",
42
+ });
43
+ checkOnchainTable(table, "find");
44
+ return find(table, key);
45
+ }),
44
46
  // @ts-ignore
45
47
  insert(table: Table) {
46
48
  return {
47
49
  values: (values: any) => {
48
50
  // @ts-ignore
49
51
  const inner = {
50
- onConflictDoNothing: async () => {
51
- common.metrics.ponder_indexing_store_queries_total.inc({
52
- table: getTableName(table),
53
- method: "insert",
54
- });
55
- checkOnchainTable(table, "insert");
52
+ onConflictDoNothing: () =>
53
+ database.retry(async () => {
54
+ common.metrics.ponder_indexing_store_queries_total.inc({
55
+ table: getTableName(table),
56
+ method: "insert",
57
+ });
58
+ checkOnchainTable(table, "insert");
56
59
 
57
- const parseResult = (result: { [x: string]: any }[]) => {
58
- if (Array.isArray(values) === false) {
59
- return result.length === 1 ? result[0] : null;
60
- }
60
+ const parseResult = (result: { [x: string]: any }[]) => {
61
+ if (Array.isArray(values) === false) {
62
+ return result.length === 1 ? result[0] : null;
63
+ }
61
64
 
62
- if (result.length === 0) {
63
- return new Array(values.length).fill(null);
64
- }
65
+ if (result.length === 0) {
66
+ return new Array(values.length).fill(null);
67
+ }
65
68
 
66
- const rows = [];
67
- let resultIndex = 0;
69
+ const rows = [];
70
+ let resultIndex = 0;
68
71
 
69
- for (let i = 0; i < values.length; i++) {
70
- if (
71
- getCacheKey(table, values[i]) ===
72
- getCacheKey(table, result[resultIndex]!)
73
- ) {
74
- rows.push(result[resultIndex++]!);
75
- } else {
76
- rows.push(null);
72
+ for (let i = 0; i < values.length; i++) {
73
+ if (
74
+ getCacheKey(table, values[i]) ===
75
+ getCacheKey(table, result[resultIndex]!)
76
+ ) {
77
+ rows.push(result[resultIndex++]!);
78
+ } else {
79
+ rows.push(null);
80
+ }
77
81
  }
78
- }
79
82
 
80
- return rows;
81
- };
83
+ return rows;
84
+ };
82
85
 
83
- return qb()
84
- .insert(table)
85
- .values(values)
86
- .onConflictDoNothing()
87
- .returning()
88
- .then(parseResult);
89
- },
90
- onConflictDoUpdate: async (valuesU: any) => {
91
- common.metrics.ponder_indexing_store_queries_total.inc({
92
- table: getTableName(table),
93
- method: "insert",
94
- });
95
- checkOnchainTable(table, "insert");
86
+ try {
87
+ return await database.qb.drizzle
88
+ .insert(table)
89
+ .values(values)
90
+ .onConflictDoNothing()
91
+ .returning()
92
+ .then(parseResult);
93
+ } catch (e) {
94
+ throw parseSqlError(e);
95
+ }
96
+ }),
97
+ onConflictDoUpdate: (valuesU: any) =>
98
+ database.retry(async () => {
99
+ common.metrics.ponder_indexing_store_queries_total.inc({
100
+ table: getTableName(table),
101
+ method: "insert",
102
+ });
103
+ checkOnchainTable(table, "insert");
96
104
 
97
- if (typeof valuesU === "object") {
98
- const set = validateUpdateSet(table, valuesU);
99
- return qb()
100
- .insert(table)
101
- .values(values)
102
- .onConflictDoUpdate({
103
- target: getPrimaryKeyColumns(table).map(
104
- // @ts-ignore
105
- ({ js }) => table[js],
106
- ),
107
- set,
108
- })
109
- .returning()
110
- .then((res) => (Array.isArray(values) ? res : res[0]));
111
- }
105
+ if (typeof valuesU === "object") {
106
+ try {
107
+ const set = validateUpdateSet(table, valuesU);
108
+ return await database.qb.drizzle
109
+ .insert(table)
110
+ .values(values)
111
+ .onConflictDoUpdate({
112
+ target: getPrimaryKeyColumns(table).map(
113
+ // @ts-ignore
114
+ ({ js }) => table[js],
115
+ ),
116
+ set,
117
+ })
118
+ .returning()
119
+ .then((res) => (Array.isArray(values) ? res : res[0]));
120
+ } catch (e) {
121
+ throw parseSqlError(e);
122
+ }
123
+ }
112
124
 
113
- if (Array.isArray(values)) {
114
- const rows = [];
115
- for (const value of values) {
116
- const row = await find(table, value);
125
+ if (Array.isArray(values)) {
126
+ const rows = [];
127
+ for (const value of values) {
128
+ const row = await find(table, value);
129
+
130
+ if (row === null) {
131
+ try {
132
+ rows.push(
133
+ await database.qb.drizzle
134
+ .insert(table)
135
+ .values(value)
136
+ .returning()
137
+ .then((res) => res[0]),
138
+ );
139
+ } catch (e) {
140
+ throw parseSqlError(e);
141
+ }
142
+ } else {
143
+ try {
144
+ const set = validateUpdateSet(table, valuesU(row));
145
+ rows.push(
146
+ await database.qb.drizzle
147
+ .update(table)
148
+ .set(set)
149
+ .where(getWhereCondition(table, value))
150
+ .returning()
151
+ .then((res) => res[0]),
152
+ );
153
+ } catch (e) {
154
+ throw parseSqlError(e);
155
+ }
156
+ }
157
+ }
158
+ return rows;
159
+ } else {
160
+ const row = await find(table, values);
117
161
 
118
162
  if (row === null) {
119
- rows.push(
120
- await qb()
163
+ try {
164
+ return await database.qb.drizzle
121
165
  .insert(table)
122
- .values(value)
166
+ .values(values)
123
167
  .returning()
124
- .then((res) => res[0]),
125
- );
168
+ .then((res) => res[0]);
169
+ } catch (e) {
170
+ throw parseSqlError(e);
171
+ }
126
172
  } else {
127
- const set = validateUpdateSet(table, valuesU(row));
128
- rows.push(
129
- await qb()
173
+ try {
174
+ const set = validateUpdateSet(table, valuesU(row));
175
+ return await database.qb.drizzle
130
176
  .update(table)
131
177
  .set(set)
132
- .where(getWhereCondition(table, value))
178
+ .where(getWhereCondition(table, values))
133
179
  .returning()
134
- .then((res) => res[0]),
135
- );
180
+ .then((res) => res[0]);
181
+ } catch (e) {
182
+ throw parseSqlError(e);
183
+ }
136
184
  }
137
185
  }
138
- return rows;
139
- } else {
140
- const row = await find(table, values);
141
-
142
- if (row === null) {
143
- return qb()
144
- .insert(table)
145
- .values(values)
146
- .returning()
147
- .then((res) => res[0]);
148
- } else {
149
- const set = validateUpdateSet(table, valuesU(row));
150
- return qb()
151
- .update(table)
152
- .set(set)
153
- .where(getWhereCondition(table, values))
154
- .returning()
155
- .then((res) => res[0]);
156
- }
157
- }
158
- },
186
+ }),
159
187
  // biome-ignore lint/suspicious/noThenProperty: <explanation>
160
188
  then: (onFulfilled, onRejected) =>
161
- (async () => {
162
- common.metrics.ponder_indexing_store_queries_total.inc({
163
- table: getTableName(table),
164
- method: "insert",
165
- });
166
- checkOnchainTable(table, "insert");
189
+ database
190
+ .retry(async () => {
191
+ common.metrics.ponder_indexing_store_queries_total.inc({
192
+ table: getTableName(table),
193
+ method: "insert",
194
+ });
195
+ checkOnchainTable(table, "insert");
167
196
 
168
- return qb()
169
- .insert(table)
170
- .values(values)
171
- .returning()
172
- .then((res) => (Array.isArray(values) ? res : res[0]));
173
- })().then(onFulfilled, onRejected),
197
+ try {
198
+ return await database.qb.drizzle
199
+ .insert(table)
200
+ .values(values)
201
+ .returning()
202
+ .then((res) => (Array.isArray(values) ? res : res[0]));
203
+ } catch (e) {
204
+ throw parseSqlError(e);
205
+ }
206
+ })
207
+ .then(onFulfilled, onRejected),
174
208
  catch: (onRejected) => inner.then(undefined, onRejected),
175
209
  finally: (onFinally) =>
176
210
  inner.then(
@@ -193,86 +227,96 @@ export const createRealtimeIndexingStore = ({
193
227
  // @ts-ignore
194
228
  update(table: Table, key) {
195
229
  return {
196
- set: async (values: any) => {
197
- common.metrics.ponder_indexing_store_queries_total.inc({
198
- table: getTableName(table),
199
- method: "update",
200
- });
201
- checkOnchainTable(table, "update");
230
+ set: (values: any) =>
231
+ database.retry(async () => {
232
+ common.metrics.ponder_indexing_store_queries_total.inc({
233
+ table: getTableName(table),
234
+ method: "update",
235
+ });
236
+ checkOnchainTable(table, "update");
202
237
 
203
- if (typeof values === "function") {
204
- const row = await find(table, key);
238
+ if (typeof values === "function") {
239
+ const row = await find(table, key);
205
240
 
206
- if (row === null) {
207
- const error = new RecordNotFoundError(
208
- `No existing record found in table '${getTableName(table)}'`,
209
- );
210
- error.meta.push(`db.update arguments:\n${prettyPrint(key)}`);
211
- throw error;
212
- }
241
+ if (row === null) {
242
+ const error = new RecordNotFoundError(
243
+ `No existing record found in table '${getTableName(table)}'`,
244
+ );
245
+ error.meta.push(`db.update arguments:\n${prettyPrint(key)}`);
246
+ throw error;
247
+ }
213
248
 
214
- const set = validateUpdateSet(table, values(row));
215
- return qb()
216
- .update(table)
217
- .set(set)
218
- .where(getWhereCondition(table, key))
219
- .returning()
220
- .then((res) => res[0]);
221
- } else {
222
- const set = validateUpdateSet(table, values);
223
- return qb()
224
- .update(table)
225
- .set(set)
226
- .where(getWhereCondition(table, key))
227
- .returning()
228
- .then((res) => res[0]);
229
- }
230
- },
249
+ try {
250
+ const set = validateUpdateSet(table, values(row));
251
+ return await database.qb.drizzle
252
+ .update(table)
253
+ .set(set)
254
+ .where(getWhereCondition(table, key))
255
+ .returning()
256
+ .then((res) => res[0]);
257
+ } catch (e) {
258
+ throw parseSqlError(e);
259
+ }
260
+ } else {
261
+ try {
262
+ const set = validateUpdateSet(table, values);
263
+ return await database.qb.drizzle
264
+ .update(table)
265
+ .set(set)
266
+ .where(getWhereCondition(table, key))
267
+ .returning()
268
+ .then((res) => res[0]);
269
+ } catch (e) {
270
+ throw parseSqlError(e);
271
+ }
272
+ }
273
+ }),
231
274
  };
232
275
  },
233
276
  // @ts-ignore
234
- delete: async (table: Table, key) => {
235
- common.metrics.ponder_indexing_store_queries_total.inc({
236
- table: getTableName(table),
237
- method: "delete",
238
- });
239
- checkOnchainTable(table, "delete");
277
+ delete: (table: Table, key) =>
278
+ database.retry(async () => {
279
+ common.metrics.ponder_indexing_store_queries_total.inc({
280
+ table: getTableName(table),
281
+ method: "delete",
282
+ });
283
+ checkOnchainTable(table, "delete");
240
284
 
241
- const deleted = await qb()
242
- .delete(table)
243
- .where(getWhereCondition(table, key))
244
- .returning();
285
+ const deleted = await database.qb.drizzle
286
+ .delete(table)
287
+ .where(getWhereCondition(table, key))
288
+ .returning();
245
289
 
246
- return deleted.length > 0;
247
- },
290
+ return deleted.length > 0;
291
+ }),
248
292
  // @ts-ignore
249
293
  sql: drizzle(
250
294
  async (_sql, params, method, typings) => {
251
295
  const query: QueryWithTypings = { sql: _sql, params, typings };
252
- const endClock = startClock();
253
296
 
254
297
  try {
255
- const result = await qb()
256
- ._.session.prepareQuery(
257
- query,
258
- undefined,
259
- undefined,
260
- method === "all",
261
- )
262
- .execute();
298
+ return await database.retry(async () => {
299
+ const endClock = startClock();
263
300
 
264
- // @ts-ignore
265
- return { rows: result.rows.map((row) => Object.values(row)) };
266
- } finally {
267
- common.metrics.ponder_indexing_store_raw_sql_duration.observe(
268
- endClock(),
269
- );
301
+ const result = await database.qb.drizzle._.session
302
+ .prepareQuery(query, undefined, undefined, method === "all")
303
+ .execute()
304
+ .catch((error) => {
305
+ throw parseSqlError(error);
306
+ })
307
+ .finally(() => {
308
+ common.metrics.ponder_indexing_store_raw_sql_duration.observe(
309
+ endClock(),
310
+ );
311
+ });
312
+ // @ts-ignore
313
+ return { rows: result.rows.map((row) => Object.values(row)) };
314
+ });
315
+ } catch (error) {
316
+ throw parseSqlError(error);
270
317
  }
271
318
  },
272
319
  { schema, casing: "snake_case" },
273
320
  ),
274
- set qb(_qb: QB) {
275
- qb = _qb;
276
- },
277
321
  };
278
322
  };
@@ -126,12 +126,3 @@ export class ShutdownError extends NonRetryableError {
126
126
  Object.setPrototypeOf(this, ShutdownError.prototype);
127
127
  }
128
128
  }
129
-
130
- export class TransactionError extends NonRetryableError {
131
- override name = "TransactionError";
132
-
133
- constructor(message?: string | undefined) {
134
- super(message);
135
- Object.setPrototypeOf(this, TransactionError.prototype);
136
- }
137
- }
@@ -1,9 +1,5 @@
1
1
  import http from "node:http";
2
- import {
3
- type Database,
4
- getPonderCheckpointTable,
5
- getPonderMetaTable,
6
- } from "@/database/index.js";
2
+ import type { Database } from "@/database/index.js";
7
3
  import type { Common } from "@/internal/common.js";
8
4
  import type { ApiBuild, Status } from "@/internal/types.js";
9
5
  import { decodeCheckpoint } from "@/utils/checkpoint.js";
@@ -87,11 +83,7 @@ export async function createServer({
87
83
  return c.text("", 200);
88
84
  })
89
85
  .get("/ready", async (c) => {
90
- const isReady = await database
91
- .readonlyQB("select_ready")
92
- .select()
93
- .from(getPonderMetaTable())
94
- .then((result) => result[0]!.value.is_ready === 1);
86
+ const isReady = await database.getReady();
95
87
 
96
88
  if (isReady) {
97
89
  return c.text("", 200);
@@ -100,10 +92,7 @@ export async function createServer({
100
92
  return c.text("Historical indexing is not complete.", 503);
101
93
  })
102
94
  .get("/status", async (c) => {
103
- const checkpoints = await database
104
- .readonlyQB("select_checkpoints")
105
- .select()
106
- .from(getPonderCheckpointTable());
95
+ const checkpoints = await globalThis.PONDER_DATABASE.getCheckpoints();
107
96
  const status: Status = {};
108
97
  for (const { chainName, chainId, latestCheckpoint } of checkpoints) {
109
98
  status[chainName] = {