ponder 0.14.13 → 0.15.0

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 (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -1,8 +1,27 @@
1
- import { promiseWithResolvers } from '../utils/promiseWithResolvers.js';
1
+ import { getLiveQueryChannelName } from '../drizzle/onchain.js';
2
+ import { promiseWithResolvers, } from '../utils/promiseWithResolvers.js';
3
+ import { getSQLQueryRelations, validateAllowableSQLQuery, } from '../utils/sql-parse.js';
4
+ import { getTableName, getViewName, isTable, isView, } from "drizzle-orm";
5
+ import { getViewConfig, pgSchema, pgTable, } from "drizzle-orm/pg-core";
2
6
  import { createMiddleware } from "hono/factory";
3
7
  import { streamSSE } from "hono/streaming";
4
8
  import superjson from "superjson";
5
- import { validateQuery } from "./parse.js";
9
+ const MAX_LIVE_QUERIES = 1000;
10
+ /**
11
+ * @dev This is copied to avoid bundling another dependency.
12
+ */
13
+ const getPonderMetaTable = (schema) => {
14
+ if (schema === undefined || schema === "public") {
15
+ return pgTable("_ponder_meta", (t) => ({
16
+ key: t.text().primaryKey().$type(),
17
+ value: t.jsonb().$type().notNull(),
18
+ }));
19
+ }
20
+ return pgSchema(schema).table("_ponder_meta", (t) => ({
21
+ key: t.text().primaryKey().$type(),
22
+ value: t.jsonb().$type().notNull(),
23
+ }));
24
+ };
6
25
  /**
7
26
  * Middleware for `@ponder/client`.
8
27
  *
@@ -23,26 +42,127 @@ import { validateQuery } from "./parse.js";
23
42
  * export default app;
24
43
  * ```
25
44
  */
26
- export const client = ({ db, }) => {
45
+ export const client = ({ db, schema, }) => {
27
46
  if (globalThis.PONDER_COMMON === undefined ||
28
47
  globalThis.PONDER_DATABASE === undefined ||
29
48
  globalThis.PONDER_NAMESPACE_BUILD === undefined) {
30
49
  throw new Error("client() middleware cannot be initialized outside of a Ponder project");
31
50
  }
51
+ const tables = Object.values(schema).filter(isTable);
52
+ const views = Object.values(schema).filter(isView);
53
+ const tableNames = new Set(tables.map(getTableName));
54
+ const viewNames = new Set(views.map(getViewName));
55
+ // Note: Add system tables to the live query registry.
56
+ tableNames.add("_ponder_checkpoint");
32
57
  // @ts-ignore
33
58
  const session = db._.session;
59
+ // @ts-ignore
60
+ const dialect = session.dialect;
34
61
  const driver = globalThis.PONDER_DATABASE.driver;
35
- let statusResolver = promiseWithResolvers();
36
- const channel = `${globalThis.PONDER_NAMESPACE_BUILD.schema}_status_channel`;
62
+ const perTableResolver = new Map();
63
+ const perViewTables = new Map();
64
+ /** `true` if the app is indexing live blocks. */
65
+ let liveQueryCount = 0;
66
+ let isReady = false;
67
+ (async () => {
68
+ while (globalThis.PONDER_COMMON.apiShutdown.isKilled === false) {
69
+ try {
70
+ isReady = await globalThis.PONDER_DATABASE.readonlyQB.wrap({ label: "select_ready" }, (db) => db
71
+ .select()
72
+ .from(getPonderMetaTable())
73
+ .then((result) => result[0].value.is_ready === 1));
74
+ }
75
+ catch { }
76
+ if (isReady)
77
+ return;
78
+ await new Promise((resolve) => setTimeout(resolve, 1000));
79
+ }
80
+ })();
37
81
  const cache = new Map();
82
+ const perQueryReferences = new Map();
83
+ const registry = new FinalizationRegistry((queryString) => {
84
+ // Note: When a cache entry is garbage collected, delete the key from `perQueryReferences`.
85
+ cache.delete(queryString);
86
+ perQueryReferences.delete(queryString);
87
+ });
88
+ for (const table of tableNames) {
89
+ perTableResolver.set(table, promiseWithResolvers());
90
+ }
91
+ const parseViewPromise = (async () => {
92
+ const unresolvedViewRelations = new Map();
93
+ for (const view of views) {
94
+ const query = dialect.sqlToQuery(getViewConfig(view).query);
95
+ const relations = await getSQLQueryRelations(query.sql);
96
+ unresolvedViewRelations.set(getViewName(view), relations);
97
+ }
98
+ /**
99
+ * Recursively resolve nested views (views that reference other views).
100
+ *
101
+ * @dev This assumes views cannot be infinitely cursive - an invariant enforced by Postgres.
102
+ */
103
+ const resolveRelation = (relation) => {
104
+ if (perViewTables.has(relation)) {
105
+ return perViewTables.get(relation);
106
+ }
107
+ if (tableNames.has(relation)) {
108
+ return new Set([relation]);
109
+ }
110
+ if (viewNames.has(relation)) {
111
+ const result = new Set();
112
+ for (const _relation of unresolvedViewRelations.get(relation)) {
113
+ for (const __relation of resolveRelation(_relation)) {
114
+ result.add(__relation);
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ return new Set();
120
+ };
121
+ for (const [viewName, relations] of unresolvedViewRelations) {
122
+ const resolvedRelations = new Set();
123
+ for (const relation of relations) {
124
+ for (const _relation of resolveRelation(relation)) {
125
+ resolvedRelations.add(_relation);
126
+ }
127
+ }
128
+ perViewTables.set(viewName, resolvedRelations);
129
+ }
130
+ })();
38
131
  if (driver.dialect === "pglite") {
39
- driver.instance.query(`LISTEN "${channel}"`).then(() => {
40
- driver.instance.onNotification(() => {
41
- // Clear cache on status change
42
- cache.clear();
43
- statusResolver.resolve();
44
- statusResolver = promiseWithResolvers();
45
- });
132
+ const channel = getLiveQueryChannelName(globalThis.PONDER_NAMESPACE_BUILD.schema);
133
+ driver.instance.query(`LISTEN "${channel}"`);
134
+ driver.instance.onNotification((_, payload) => {
135
+ const tables = JSON.parse(payload);
136
+ tables.push("_ponder_checkpoint");
137
+ let invalidQueryCount = 0;
138
+ for (const [queryString, referencedTables] of perQueryReferences) {
139
+ let isQueryInvalid = false;
140
+ for (const table of tables) {
141
+ if (referencedTables.has(table)) {
142
+ isQueryInvalid = true;
143
+ break;
144
+ }
145
+ }
146
+ if (isQueryInvalid) {
147
+ invalidQueryCount++;
148
+ const resultPromise = cache.get(queryString)?.deref();
149
+ if (resultPromise)
150
+ registry.unregister(resultPromise);
151
+ cache.delete(queryString);
152
+ perQueryReferences.delete(queryString);
153
+ }
154
+ }
155
+ for (const table of tables) {
156
+ perTableResolver.get(table).resolve();
157
+ perTableResolver.set(table, promiseWithResolvers());
158
+ }
159
+ if (invalidQueryCount > 0) {
160
+ globalThis.PONDER_COMMON.logger.debug({
161
+ msg: "Updated live queries",
162
+ tables: JSON.stringify(Array.from(tables)),
163
+ query_count: invalidQueryCount,
164
+ });
165
+ }
46
166
  });
47
167
  }
48
168
  else {
@@ -64,11 +184,38 @@ export const client = ({ db, }) => {
64
184
  globalThis.PONDER_COMMON.logger.info({
65
185
  msg: `Established listen connection for "@ponder/client" middleware`,
66
186
  });
67
- client.on("notification", () => {
68
- // Clear cache on status change
69
- cache.clear();
70
- statusResolver.resolve();
71
- statusResolver = promiseWithResolvers();
187
+ client.on("notification", (notification) => {
188
+ const tables = JSON.parse(notification.payload);
189
+ tables.push("_ponder_checkpoint");
190
+ let invalidQueryCount = 0;
191
+ for (const [queryString, referencedTables,] of perQueryReferences) {
192
+ let isQueryInvalid = false;
193
+ for (const table of tables) {
194
+ if (referencedTables.has(table)) {
195
+ isQueryInvalid = true;
196
+ break;
197
+ }
198
+ }
199
+ if (isQueryInvalid) {
200
+ invalidQueryCount++;
201
+ const resultPromise = cache.get(queryString)?.deref();
202
+ if (resultPromise)
203
+ registry.unregister(resultPromise);
204
+ cache.delete(queryString);
205
+ perQueryReferences.delete(queryString);
206
+ }
207
+ }
208
+ for (const table of tables) {
209
+ perTableResolver.get(table).resolve();
210
+ perTableResolver.set(table, promiseWithResolvers());
211
+ }
212
+ if (invalidQueryCount > 0) {
213
+ globalThis.PONDER_COMMON.logger.debug({
214
+ msg: "Updated live queries",
215
+ tables: JSON.stringify(tables),
216
+ query_count: invalidQueryCount,
217
+ });
218
+ }
72
219
  });
73
220
  client.on("error", async (error) => {
74
221
  globalThis.PONDER_COMMON.logger.warn({
@@ -81,6 +228,7 @@ export const client = ({ db, }) => {
81
228
  await new Promise((resolve) => setTimeout(resolve, 250));
82
229
  resolve();
83
230
  });
231
+ const channel = getLiveQueryChannelName(globalThis.PONDER_NAMESPACE_BUILD.schema);
84
232
  await client.query(`LISTEN "${channel}"`);
85
233
  }
86
234
  catch (error) {
@@ -98,7 +246,21 @@ export const client = ({ db, }) => {
98
246
  }
99
247
  })();
100
248
  }
249
+ const getQueryResult = (query) => {
250
+ if (driver.dialect === "pglite") {
251
+ return session.prepareQuery(query, undefined, undefined, false).execute();
252
+ }
253
+ else {
254
+ return globalThis.PONDER_DATABASE.readonlyQB.raw.transaction((tx) => {
255
+ return tx._.session
256
+ .prepareQuery(query, undefined, undefined, false)
257
+ .execute();
258
+ }, { accessMode: "read only" });
259
+ }
260
+ };
101
261
  return createMiddleware(async (c, next) => {
262
+ const crypto = await import(/* webpackIgnore: true */ "node:crypto");
263
+ await parseViewPromise;
102
264
  if (c.req.path === "/sql/db") {
103
265
  const queryString = c.req.query("sql");
104
266
  if (queryString === undefined) {
@@ -106,39 +268,46 @@ export const client = ({ db, }) => {
106
268
  }
107
269
  const query = superjson.parse(queryString);
108
270
  try {
109
- await validateQuery(query.sql);
271
+ await validateAllowableSQLQuery(query.sql);
110
272
  }
111
273
  catch (error) {
112
274
  error.stack = undefined;
113
275
  return c.text(error.message, 500);
114
276
  }
277
+ const relations = await getSQLQueryRelations(query.sql);
278
+ const referencedTables = new Set();
279
+ for (const relation of relations) {
280
+ if (tableNames.has(relation)) {
281
+ referencedTables.add(relation);
282
+ }
283
+ else if (viewNames.has(relation)) {
284
+ for (const tableName of perViewTables.get(relation)) {
285
+ referencedTables.add(tableName);
286
+ }
287
+ }
288
+ }
115
289
  let resultPromise;
116
- const _resultPromise = cache.get(queryString)?.deref() ?? undefined;
117
- if (_resultPromise === undefined) {
118
- cache.delete(queryString);
119
- const pwr = promiseWithResolvers();
120
- cache.set(queryString, new WeakRef(pwr.promise));
121
- resultPromise = pwr.promise;
122
- if (driver.dialect === "pglite") {
123
- session
124
- .prepareQuery(query, undefined, undefined, false)
125
- .execute()
126
- .then(pwr.resolve)
127
- .catch(pwr.reject);
290
+ if (isReady === false) {
291
+ resultPromise = getQueryResult(query);
292
+ }
293
+ else if (cache.has(queryString)) {
294
+ const resultRef = cache.get(queryString).deref();
295
+ if (resultRef === undefined) {
296
+ cache.delete(queryString);
297
+ resultPromise = getQueryResult(query);
298
+ cache.set(queryString, new WeakRef(resultPromise));
299
+ perQueryReferences.set(queryString, referencedTables);
300
+ registry.register(resultPromise, queryString);
128
301
  }
129
302
  else {
130
- globalThis.PONDER_DATABASE.readonlyQB.raw
131
- .transaction((tx) => {
132
- return tx._.session
133
- .prepareQuery(query, undefined, undefined, false)
134
- .execute();
135
- }, { accessMode: "read only" })
136
- .then(pwr.resolve)
137
- .catch(pwr.reject);
303
+ resultPromise = resultRef;
138
304
  }
139
305
  }
140
306
  else {
141
- resultPromise = _resultPromise;
307
+ resultPromise = getQueryResult(query);
308
+ cache.set(queryString, new WeakRef(resultPromise));
309
+ perQueryReferences.set(queryString, referencedTables);
310
+ registry.register(resultPromise, queryString);
142
311
  }
143
312
  try {
144
313
  return c.json((await resultPromise));
@@ -149,16 +318,111 @@ export const client = ({ db, }) => {
149
318
  }
150
319
  }
151
320
  if (c.req.path === "/sql/live") {
321
+ if (isReady === false) {
322
+ return c.text("Live queries are not available until the backfill is complete", 503);
323
+ }
324
+ if (liveQueryCount >= MAX_LIVE_QUERIES) {
325
+ return c.text("Maximum number of live queries reached", 503);
326
+ }
327
+ liveQueryCount++;
152
328
  c.header("Content-Type", "text/event-stream");
153
329
  c.header("Cache-Control", "no-cache");
154
330
  c.header("Connection", "keep-alive");
331
+ const queryString = c.req.query("sql");
332
+ if (queryString === undefined) {
333
+ return c.text('Missing "sql" query parameter', 400);
334
+ }
335
+ const query = superjson.parse(queryString);
336
+ try {
337
+ await validateAllowableSQLQuery(query.sql);
338
+ }
339
+ catch (error) {
340
+ error.stack = undefined;
341
+ return c.text(error.message, 500);
342
+ }
343
+ const relations = await getSQLQueryRelations(query.sql);
344
+ const referencedTables = new Set();
345
+ for (const relation of relations) {
346
+ if (tableNames.has(relation)) {
347
+ referencedTables.add(relation);
348
+ }
349
+ else if (viewNames.has(relation)) {
350
+ for (const tableName of perViewTables.get(relation)) {
351
+ referencedTables.add(tableName);
352
+ }
353
+ }
354
+ }
355
+ let result;
356
+ if (cache.has(queryString)) {
357
+ const resultRef = cache.get(queryString).deref();
358
+ if (resultRef === undefined) {
359
+ cache.delete(queryString);
360
+ const resultPromise = getQueryResult(query);
361
+ cache.set(queryString, new WeakRef(resultPromise));
362
+ perQueryReferences.set(queryString, referencedTables);
363
+ registry.register(resultPromise, queryString);
364
+ result = await resultPromise;
365
+ }
366
+ else {
367
+ result = await resultRef;
368
+ }
369
+ }
370
+ else {
371
+ const resultPromise = getQueryResult(query);
372
+ cache.set(queryString, new WeakRef(resultPromise));
373
+ perQueryReferences.set(queryString, referencedTables);
374
+ registry.register(resultPromise, queryString);
375
+ result = await resultPromise;
376
+ }
377
+ let resultHash = crypto
378
+ .createHash("MD5")
379
+ // @ts-ignore
380
+ .update(JSON.stringify(result.rows))
381
+ .digest("hex")
382
+ .slice(0, 10);
155
383
  return streamSSE(c, async (stream) => {
384
+ stream.onAbort(() => {
385
+ liveQueryCount--;
386
+ });
156
387
  while (stream.closed === false && stream.aborted === false) {
388
+ await Promise.race(Array.from(referencedTables).map((relation) => perTableResolver.get(relation).promise));
157
389
  try {
158
- await stream.writeSSE({ data: "" });
390
+ let resultPromise;
391
+ if (cache.has(queryString)) {
392
+ const resultRef = cache.get(queryString).deref();
393
+ if (resultRef === undefined) {
394
+ cache.delete(queryString);
395
+ resultPromise = getQueryResult(query);
396
+ cache.set(queryString, new WeakRef(resultPromise));
397
+ perQueryReferences.set(queryString, referencedTables);
398
+ registry.register(resultPromise, queryString);
399
+ }
400
+ else {
401
+ resultPromise = resultRef;
402
+ }
403
+ }
404
+ else {
405
+ resultPromise = getQueryResult(query);
406
+ cache.set(queryString, new WeakRef(resultPromise));
407
+ perQueryReferences.set(queryString, referencedTables);
408
+ registry.register(resultPromise, queryString);
409
+ }
410
+ const result = await resultPromise;
411
+ const _resultHash = crypto
412
+ .createHash("MD5")
413
+ // @ts-ignore
414
+ .update(JSON.stringify(result.rows))
415
+ .digest("hex")
416
+ .slice(0, 10);
417
+ if (_resultHash === resultHash)
418
+ continue;
419
+ resultHash = _resultHash;
420
+ // @ts-ignore
421
+ await stream.writeSSE({ data: JSON.stringify(result) });
422
+ }
423
+ catch {
424
+ stream.abort();
159
425
  }
160
- catch { }
161
- await statusResolver.promise;
162
426
  }
163
427
  });
164
428
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAEL,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,MAAM,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,aAAa,EACb,QAAQ,EACR,OAAO,GACR,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,SAAS,MAAM,WAAW,CAAC;AAKlC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B;;GAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAe,EAAE,EAAE;IAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE;QAC/C,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,EAAS;YACzC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAc,CAAC,OAAO,EAAE;SAC/C,CAAC,CAAC,CAAC;KACL;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,EAAS;QACzC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAc,CAAC,OAAO,EAAE;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EACrB,EAAE,EACF,MAAM,GAC0C,EAAE,EAAE;IACpD,IACE,UAAU,CAAC,aAAa,KAAK,SAAS;QACtC,UAAU,CAAC,eAAe,KAAK,SAAS;QACxC,UAAU,CAAC,sBAAsB,KAAK,SAAS,EAC/C;QACA,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;KACH;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAElD,sDAAsD;IACtD,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAErC,aAAa;IACb,MAAM,OAAO,GAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACxC,aAAa;IACb,MAAM,OAAO,GAAc,OAAO,CAAC,OAAO,CAAC;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC;IAEjD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAsC,CAAC;IACvE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IAErD,iDAAiD;IACjD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,CAAC,KAAK,IAAI,EAAE;QACV,OAAO,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC9D,IAAI;gBACF,OAAO,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CACxD,EAAE,KAAK,EAAE,cAAc,EAAE,EACzB,CAAC,EAAE,EAAE,EAAE,CACL,EAAE;qBACC,MAAM,EAAE;qBACR,IAAI,CAAC,kBAAkB,EAAE,CAAC;qBAC1B,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CACvD,CAAC;aACH;YAAC,MAAM,GAAE;YACV,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;SAC3D;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0C,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE/D,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAc,CAAC,WAAW,EAAE,EAAE;QACrE,2FAA2F;QAC3F,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1B,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;QAC9B,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAQ,CAAC,CAAC;KAC3D;IAED,MAAM,gBAAgB,GAAG,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAc,CAAC,CAAC,KAAM,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExD,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;SAC3D;QAED;;;;WAIG;QACH,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAe,EAAE;YACxD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC/B,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;aACrC;YAED,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC5B,OAAO,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC5B;YAED,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;gBACjC,KAAK,MAAM,SAAS,IAAI,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAE,EAAE;oBAC9D,KAAK,MAAM,UAAU,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE;wBACnD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;qBACxB;iBACF;gBACD,OAAO,MAAM,CAAC;aACf;YAED,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,uBAAuB,EAAE;YAC3D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;oBACjD,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;iBAClC;aACF;YACD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;SAChD;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,OAAO,GAAG,uBAAuB,CACrC,UAAU,CAAC,sBAAsB,CAAC,MAAM,CACzC,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAQ,CAAa,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAE1B,KAAK,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,IAAI,kBAAkB,EAAE;gBAChE,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;oBAC1B,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;wBAC/B,cAAc,GAAG,IAAI,CAAC;wBACtB,MAAM;qBACP;iBACF;gBAED,IAAI,cAAc,EAAE;oBAClB,iBAAiB,EAAE,CAAC;oBAEpB,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;oBACtD,IAAI,aAAa;wBAAE,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBAEtD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1B,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;iBACxC;aACF;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,OAAO,EAAE,CAAC;gBACvC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAQ,CAAC,CAAC;aAC3D;YAED,IAAI,iBAAiB,GAAG,CAAC,EAAE;gBACzB,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;oBACpC,GAAG,EAAE,sBAAsB;oBAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1C,WAAW,EAAE,iBAAiB;iBAC/B,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,MAAiC,CAAC;YAEtC,IAAI,qBAAqB,GAAG,KAAK,CAAC;YAElC,OAAO,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE;gBAC9D,qEAAqE;gBACrE,MAAM,IAAI,OAAO,CAAO,KAAK,EAAE,OAAO,EAAE,EAAE;oBACxC,IAAI;wBACF,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;wBAEtC,IAAI,qBAAqB,KAAK,KAAK,EAAE;4BACnC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE;gCAC5C,MAAM,EAAE,OAAO,EAAE,CAAC;gCAClB,MAAM,GAAG,SAAS,CAAC;4BACrB,CAAC,CAAC,CAAC;4BACH,qBAAqB,GAAG,IAAI,CAAC;yBAC9B;wBAED,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;4BACnC,GAAG,EAAE,+DAA+D;yBACrE,CAAC,CAAC;wBAEH,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,EAAE;4BACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAQ,CAAa,CAAC;4BAC7D,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;4BAClC,IAAI,iBAAiB,GAAG,CAAC,CAAC;4BAE1B,KAAK,MAAM,CACT,WAAW,EACX,gBAAgB,EACjB,IAAI,kBAAkB,EAAE;gCACvB,IAAI,cAAc,GAAG,KAAK,CAAC;gCAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;oCAC1B,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;wCAC/B,cAAc,GAAG,IAAI,CAAC;wCACtB,MAAM;qCACP;iCACF;gCAED,IAAI,cAAc,EAAE;oCAClB,iBAAiB,EAAE,CAAC;oCAEpB,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;oCACtD,IAAI,aAAa;wCAAE,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oCAEtD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oCAC1B,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;iCACxC;6BACF;4BAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gCAC1B,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,OAAO,EAAE,CAAC;gCACvC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAQ,CAAC,CAAC;6BAC3D;4BAED,IAAI,iBAAiB,GAAG,CAAC,EAAE;gCACzB,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;oCACpC,GAAG,EAAE,sBAAsB;oCAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oCAC9B,WAAW,EAAE,iBAAiB;iCAC/B,CAAC,CAAC;6BACJ;wBACH,CAAC,CAAC,CAAC;wBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;4BACjC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gCACnC,GAAG,EAAE,0DAA0D;gCAC/D,WAAW,EAAE,GAAG;gCAChB,KAAK;6BACN,CAAC,CAAC;4BACH,MAAM,EAAE,OAAO,EAAE,CAAC;4BAClB,MAAM,GAAG,SAAS,CAAC;4BAEnB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;4BAEzD,OAAO,EAAE,CAAC;wBACZ,CAAC,CAAC,CAAC;wBAEH,MAAM,OAAO,GAAG,uBAAuB,CACrC,UAAU,CAAC,sBAAsB,CAAC,MAAM,CACzC,CAAC;wBAEF,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;qBAC3C;oBAAC,OAAO,KAAK,EAAE;wBACd,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;4BACnC,GAAG,EAAE,0DAA0D;4BAC/D,WAAW,EAAE,GAAG;4BAChB,KAAK,EAAE,KAAc;yBACtB,CAAC,CAAC;wBACH,MAAM,EAAE,OAAO,EAAE,CAAC;wBAClB,MAAM,GAAG,SAAS,CAAC;wBAEnB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;wBAEzD,OAAO,EAAE,CAAC;qBACX;gBACH,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,EAAE,CAAC;KACN;IAED,MAAM,cAAc,GAAG,CAAC,KAAuB,EAAwB,EAAE;QACvE,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SAC3E;aAAM;YACL,OAAO,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAC1D,CAAC,EAAE,EAAE,EAAE;gBACL,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;qBAChB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;qBAChD,OAAO,EAAE,CAAC;YACf,CAAC,EACD,EAAE,UAAU,EAAE,WAAW,EAAE,CAC5B,CAAC;SACH;IACH,CAAC,CAAC;IAEF,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,gBAAgB,CAAC;QAEvB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE;YAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;aACrD;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAqB,CAAC;YAE/D,IAAI;gBACF,MAAM,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC5C;YAAC,OAAO,KAAK,EAAE;gBACb,KAAe,CAAC,KAAK,GAAG,SAAS,CAAC;gBACnC,OAAO,CAAC,CAAC,IAAI,CAAE,KAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBAC5B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;iBAChC;qBAAM,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBAClC,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,EAAE;wBACpD,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;qBACjC;iBACF;aACF;YAED,IAAI,aAA+B,CAAC;YAEpC,IAAI,OAAO,KAAK,KAAK,EAAE;gBACrB,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;aACvC;iBAAM,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,KAAK,EAAE,CAAC;gBAElD,IAAI,SAAS,KAAK,SAAS,EAAE;oBAC3B,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1B,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;oBACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;oBACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;iBAC/C;qBAAM;oBACL,aAAa,GAAG,SAAS,CAAC;iBAC3B;aACF;iBAAM;gBACL,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;gBACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;aAC/C;YAED,IAAI;gBACF,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,aAAa,CAAW,CAAC,CAAC;aAChD;YAAC,OAAO,KAAK,EAAE;gBACb,KAAe,CAAC,KAAK,GAAG,SAAS,CAAC;gBACnC,OAAO,CAAC,CAAC,IAAI,CAAE,KAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aAC9C;SACF;QAED,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE;YAC9B,IAAI,OAAO,KAAK,KAAK,EAAE;gBACrB,OAAO,CAAC,CAAC,IAAI,CACX,+DAA+D,EAC/D,GAAG,CACJ,CAAC;aACH;YAED,IAAI,cAAc,IAAI,gBAAgB,EAAE;gBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;aAC9D;YAED,cAAc,EAAE,CAAC;YAEjB,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YAC9C,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAErC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;aACrD;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAqB,CAAC;YAE/D,IAAI;gBACF,MAAM,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC5C;YAAC,OAAO,KAAK,EAAE;gBACb,KAAe,CAAC,KAAK,GAAG,SAAS,CAAC;gBACnC,OAAO,CAAC,CAAC,IAAI,CAAE,KAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBAC5B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;iBAChC;qBAAM,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBAClC,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,EAAE;wBACpD,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;qBACjC;iBACF;aACF;YAED,IAAI,MAAmB,CAAC;YACxB,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,KAAK,EAAE,CAAC;gBAElD,IAAI,SAAS,KAAK,SAAS,EAAE;oBAC3B,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBAC5C,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;oBACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;oBACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;oBAC9C,MAAM,GAAG,MAAM,aAAa,CAAC;iBAC9B;qBAAM;oBACL,MAAM,GAAG,MAAM,SAAS,CAAC;iBAC1B;aACF;iBAAM;gBACL,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC5C,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;gBACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;gBAC9C,MAAM,GAAG,MAAM,aAAa,CAAC;aAC9B;YAED,IAAI,UAAU,GAAG,MAAM;iBACpB,UAAU,CAAC,KAAK,CAAC;gBAClB,aAAa;iBACZ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBACnC,MAAM,CAAC,KAAK,CAAC;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhB,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACnC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;oBAClB,cAAc,EAAE,CAAC;gBACnB,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE;oBAC1D,MAAM,OAAO,CAAC,IAAI,CAChB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,OAAO,CACtD,CACF,CAAC;oBAEF,IAAI;wBACF,IAAI,aAA+B,CAAC;wBACpC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;4BAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,KAAK,EAAE,CAAC;4BAElD,IAAI,SAAS,KAAK,SAAS,EAAE;gCAC3B,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gCAC1B,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gCACtC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gCACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;gCACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;6BAC/C;iCAAM;gCACL,aAAa,GAAG,SAAS,CAAC;6BAC3B;yBACF;6BAAM;4BACL,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;4BACtC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;4BACnD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;4BACtD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;yBAC/C;wBAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;wBAEnC,MAAM,WAAW,GAAG,MAAM;6BACvB,UAAU,CAAC,KAAK,CAAC;4BAClB,aAAa;6BACZ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;6BACnC,MAAM,CAAC,KAAK,CAAC;6BACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAEhB,IAAI,WAAW,KAAK,UAAU;4BAAE,SAAS;wBACzC,UAAU,GAAG,WAAW,CAAC;wBAEzB,aAAa;wBACb,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;qBACzD;oBAAC,MAAM;wBACN,MAAM,CAAC,KAAK,EAAE,CAAC;qBAChB;iBACF;YACH,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}