@secondlayer/shared 0.4.0 → 0.5.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.
- package/dist/src/crypto/hmac.d.ts +1 -1
- package/dist/src/crypto/hmac.js +6 -2
- package/dist/src/crypto/hmac.js.map +3 -3
- package/dist/src/db/index.d.ts +85 -8
- package/dist/src/db/index.js +6 -2
- package/dist/src/db/index.js.map +2 -2
- package/dist/src/db/jsonb.js +6 -2
- package/dist/src/db/jsonb.js.map +2 -2
- package/dist/src/db/queries/accounts.d.ts +77 -5
- package/dist/src/db/queries/accounts.js +17 -2
- package/dist/src/db/queries/accounts.js.map +3 -3
- package/dist/src/db/queries/integrity.d.ts +75 -4
- package/dist/src/db/queries/integrity.js +6 -2
- package/dist/src/db/queries/integrity.js.map +2 -2
- package/dist/src/db/queries/metrics.d.ts +75 -4
- package/dist/src/db/queries/metrics.js +6 -2
- package/dist/src/db/queries/metrics.js.map +2 -2
- package/dist/src/db/queries/{views.d.ts → subgraphs.d.ts} +89 -18
- package/dist/src/db/queries/{views.js → subgraphs.js} +37 -33
- package/dist/src/db/queries/subgraphs.js.map +11 -0
- package/dist/src/db/queries/usage.d.ts +78 -7
- package/dist/src/db/queries/usage.js +13 -9
- package/dist/src/db/queries/usage.js.map +4 -4
- package/dist/src/db/schema.d.ts +85 -8
- package/dist/src/env.d.ts +1 -1
- package/dist/src/env.js +8 -4
- package/dist/src/env.js.map +3 -3
- package/dist/src/errors.d.ts +3 -3
- package/dist/src/errors.js +9 -5
- package/dist/src/errors.js.map +3 -3
- package/dist/src/index.d.ts +104 -27
- package/dist/src/index.js +24 -20
- package/dist/src/index.js.map +9 -9
- package/dist/src/lib/plans.d.ts +1 -1
- package/dist/src/lib/plans.js +7 -3
- package/dist/src/lib/plans.js.map +3 -3
- package/dist/src/logger.js +8 -4
- package/dist/src/logger.js.map +3 -3
- package/dist/src/node/client.js +6 -2
- package/dist/src/node/client.js.map +2 -2
- package/dist/src/node/hiro-client.js +8 -4
- package/dist/src/node/hiro-client.js.map +3 -3
- package/dist/src/node/local-client.d.ts +75 -4
- package/dist/src/node/local-client.js +6 -2
- package/dist/src/node/local-client.js.map +3 -3
- package/dist/src/queue/index.js +6 -2
- package/dist/src/queue/index.js.map +2 -2
- package/dist/src/queue/listener.js +6 -2
- package/dist/src/queue/listener.js.map +2 -2
- package/dist/src/queue/recovery.js +6 -2
- package/dist/src/queue/recovery.js.map +2 -2
- package/dist/src/schemas/filters.d.ts +1 -1
- package/dist/src/schemas/filters.js +7 -3
- package/dist/src/schemas/filters.js.map +3 -3
- package/dist/src/schemas/index.d.ts +17 -17
- package/dist/src/schemas/index.js +19 -15
- package/dist/src/schemas/index.js.map +6 -6
- package/dist/src/schemas/{views.d.ts → subgraphs.d.ts} +9 -9
- package/dist/src/schemas/{views.js → subgraphs.js} +12 -8
- package/dist/src/schemas/subgraphs.js.map +10 -0
- package/dist/src/types.d.ts +2 -2
- package/dist/src/types.js +1 -12
- package/dist/src/types.js.map +1 -1
- package/migrations/0009_waitlist.ts +19 -0
- package/migrations/0010_waitlist_status.ts +12 -0
- package/migrations/0011_account_insights.ts +63 -0
- package/migrations/0012_view_health_snapshots.ts +29 -0
- package/migrations/0013_view_processing_stats.ts +42 -0
- package/migrations/0014_view_table_snapshots.ts +33 -0
- package/migrations/0015_rename_views_to_subgraphs.ts +136 -0
- package/migrations/0016_rename_webhook_to_endpoint.ts +12 -0
- package/package.json +8 -8
- package/dist/src/db/queries/views.js.map +0 -11
- package/dist/src/schemas/views.js.map +0 -10
|
@@ -36,8 +36,8 @@ interface StreamsTable {
|
|
|
36
36
|
status: Generated<string>;
|
|
37
37
|
filters: unknown;
|
|
38
38
|
options: Generated<unknown>;
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
endpoint_url: string;
|
|
40
|
+
signing_secret: string | null;
|
|
41
41
|
api_key_id: string | null;
|
|
42
42
|
created_at: Generated<Date>;
|
|
43
43
|
updated_at: Generated<Date>;
|
|
@@ -83,7 +83,7 @@ interface DeliveriesTable {
|
|
|
83
83
|
payload: unknown;
|
|
84
84
|
created_at: Generated<Date>;
|
|
85
85
|
}
|
|
86
|
-
interface
|
|
86
|
+
interface SubgraphsTable {
|
|
87
87
|
id: Generated<string>;
|
|
88
88
|
name: string;
|
|
89
89
|
version: Generated<string>;
|
|
@@ -151,6 +151,71 @@ interface UsageSnapshotsTable {
|
|
|
151
151
|
measured_at: Generated<Date>;
|
|
152
152
|
storage_bytes: Generated<number>;
|
|
153
153
|
}
|
|
154
|
+
interface WaitlistTable {
|
|
155
|
+
id: Generated<string>;
|
|
156
|
+
email: string;
|
|
157
|
+
source: Generated<string>;
|
|
158
|
+
status: Generated<string>;
|
|
159
|
+
created_at: Generated<Date>;
|
|
160
|
+
}
|
|
161
|
+
interface AccountInsightsTable {
|
|
162
|
+
id: Generated<string>;
|
|
163
|
+
account_id: string;
|
|
164
|
+
category: string;
|
|
165
|
+
insight_type: string;
|
|
166
|
+
resource_id: string | null;
|
|
167
|
+
severity: string;
|
|
168
|
+
title: string;
|
|
169
|
+
body: string;
|
|
170
|
+
data: unknown;
|
|
171
|
+
dismissed_at: Date | null;
|
|
172
|
+
expires_at: Date | null;
|
|
173
|
+
created_at: Generated<Date>;
|
|
174
|
+
}
|
|
175
|
+
interface AccountAgentRunsTable {
|
|
176
|
+
id: Generated<string>;
|
|
177
|
+
account_id: string;
|
|
178
|
+
started_at: Generated<Date>;
|
|
179
|
+
completed_at: Date | null;
|
|
180
|
+
status: Generated<string>;
|
|
181
|
+
input_tokens: Generated<number>;
|
|
182
|
+
output_tokens: Generated<number>;
|
|
183
|
+
cost_usd: Generated<number>;
|
|
184
|
+
insights_created: Generated<number>;
|
|
185
|
+
error: string | null;
|
|
186
|
+
}
|
|
187
|
+
interface SubgraphProcessingStatsTable {
|
|
188
|
+
id: Generated<string>;
|
|
189
|
+
subgraph_name: string;
|
|
190
|
+
api_key_id: string | null;
|
|
191
|
+
bucket_start: Date | null;
|
|
192
|
+
bucket_end: Date | null;
|
|
193
|
+
blocks_processed: number | null;
|
|
194
|
+
total_time_ms: number | null;
|
|
195
|
+
handler_time_ms: number | null;
|
|
196
|
+
flush_time_ms: number | null;
|
|
197
|
+
max_block_time_ms: number | null;
|
|
198
|
+
max_handler_time_ms: number | null;
|
|
199
|
+
avg_ops_per_block: number | null;
|
|
200
|
+
is_catchup: Generated<boolean>;
|
|
201
|
+
created_at: Generated<Date>;
|
|
202
|
+
}
|
|
203
|
+
interface SubgraphTableSnapshotsTable {
|
|
204
|
+
id: Generated<string>;
|
|
205
|
+
subgraph_name: string;
|
|
206
|
+
api_key_id: string | null;
|
|
207
|
+
table_name: string;
|
|
208
|
+
row_count: number | null;
|
|
209
|
+
created_at: Generated<Date>;
|
|
210
|
+
}
|
|
211
|
+
interface SubgraphHealthSnapshotsTable {
|
|
212
|
+
id: Generated<string>;
|
|
213
|
+
subgraph_id: string;
|
|
214
|
+
total_processed: number;
|
|
215
|
+
total_errors: number;
|
|
216
|
+
last_processed_block: number | null;
|
|
217
|
+
captured_at: Generated<Date>;
|
|
218
|
+
}
|
|
154
219
|
interface Database {
|
|
155
220
|
blocks: BlocksTable;
|
|
156
221
|
transactions: TransactionsTable;
|
|
@@ -160,13 +225,19 @@ interface Database {
|
|
|
160
225
|
jobs: JobsTable;
|
|
161
226
|
index_progress: IndexProgressTable;
|
|
162
227
|
deliveries: DeliveriesTable;
|
|
163
|
-
|
|
228
|
+
subgraphs: SubgraphsTable;
|
|
164
229
|
api_keys: ApiKeysTable;
|
|
165
230
|
accounts: AccountsTable;
|
|
166
231
|
sessions: SessionsTable;
|
|
167
232
|
magic_links: MagicLinksTable;
|
|
168
233
|
usage_daily: UsageDailyTable;
|
|
169
234
|
usage_snapshots: UsageSnapshotsTable;
|
|
235
|
+
waitlist: WaitlistTable;
|
|
236
|
+
account_insights: AccountInsightsTable;
|
|
237
|
+
account_agent_runs: AccountAgentRunsTable;
|
|
238
|
+
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
239
|
+
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
240
|
+
subgraph_table_snapshots: SubgraphTableSnapshotsTable;
|
|
170
241
|
}
|
|
171
242
|
type StreamMetrics = Selectable<StreamMetricsTable>;
|
|
172
243
|
declare function getStreamMetrics(db: Kysely<Database>, streamId: string): Promise<StreamMetrics | null>;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
3
7
|
var __export = (target, all) => {
|
|
4
8
|
for (var name in all)
|
|
5
9
|
__defProp(target, name, {
|
|
6
10
|
get: all[name],
|
|
7
11
|
enumerable: true,
|
|
8
12
|
configurable: true,
|
|
9
|
-
set: (
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
10
14
|
});
|
|
11
15
|
};
|
|
12
16
|
|
|
@@ -47,5 +51,5 @@ export {
|
|
|
47
51
|
getStreamMetrics
|
|
48
52
|
};
|
|
49
53
|
|
|
50
|
-
//# debugId=
|
|
54
|
+
//# debugId=B4106C2E1F1C5A3F64756E2164756E21
|
|
51
55
|
//# sourceMappingURL=metrics.js.map
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { sql, type Kysely } from \"kysely\";\nimport type { Database, StreamMetrics } from \"../types.ts\";\n\nexport async function getStreamMetrics(db: Kysely<Database>, streamId: string): Promise<StreamMetrics | null> {\n return (\n await db\n .selectFrom(\"stream_metrics\")\n .selectAll()\n .where(\"stream_id\", \"=\", streamId)\n .executeTakeFirst()\n ) ?? null;\n}\n\nexport async function updateStreamMetrics(\n db: Kysely<Database>,\n streamId: string,\n updates: Partial<{\n lastTriggeredAt: Date;\n lastTriggeredBlock: number;\n totalDeliveries: number;\n failedDeliveries: number;\n errorMessage: string | null;\n }>,\n): Promise<void> {\n await db\n .insertInto(\"stream_metrics\")\n .values({\n stream_id: streamId,\n last_triggered_at: updates.lastTriggeredAt ?? null,\n last_triggered_block: updates.lastTriggeredBlock ?? null,\n total_deliveries: updates.totalDeliveries ?? 0,\n failed_deliveries: updates.failedDeliveries ?? 0,\n error_message: updates.errorMessage ?? null,\n })\n .onConflict((oc) =>\n oc.column(\"stream_id\").doUpdateSet({\n ...(updates.lastTriggeredAt !== undefined ? { last_triggered_at: updates.lastTriggeredAt } : {}),\n ...(updates.lastTriggeredBlock !== undefined ? { last_triggered_block: updates.lastTriggeredBlock } : {}),\n ...(updates.totalDeliveries !== undefined ? { total_deliveries: updates.totalDeliveries } : {}),\n ...(updates.failedDeliveries !== undefined ? { failed_deliveries: updates.failedDeliveries } : {}),\n ...(updates.errorMessage !== undefined ? { error_message: updates.errorMessage } : {}),\n }),\n )\n .execute();\n}\n\nexport async function incrementDeliveryCount(\n db: Kysely<Database>,\n streamId: string,\n failed: boolean,\n): Promise<void> {\n await db\n .insertInto(\"stream_metrics\")\n .values({\n stream_id: streamId,\n total_deliveries: 1,\n failed_deliveries: failed ? 1 : 0,\n })\n .onConflict((oc) =>\n oc.column(\"stream_id\").doUpdateSet({\n total_deliveries: sql`stream_metrics.total_deliveries + 1`,\n ...(failed ? { failed_deliveries: sql`stream_metrics.failed_deliveries + 1` } : {}),\n }),\n )\n .execute();\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAGA,eAAsB,gBAAgB,CAAC,IAAsB,UAAiD;AAAA,EAC5G,OACE,MAAM,GACH,WAAW,gBAAgB,EAC3B,UAAU,EACV,MAAM,aAAa,KAAK,QAAQ,EAChC,iBAAiB,KACjB;AAAA;AAGP,eAAsB,mBAAmB,CACvC,IACA,UACA,SAOe;AAAA,EACf,MAAM,GACH,WAAW,gBAAgB,EAC3B,OAAO;AAAA,IACN,WAAW;AAAA,IACX,mBAAmB,QAAQ,mBAAmB;AAAA,IAC9C,sBAAsB,QAAQ,sBAAsB;AAAA,IACpD,kBAAkB,QAAQ,mBAAmB;AAAA,IAC7C,mBAAmB,QAAQ,oBAAoB;AAAA,IAC/C,eAAe,QAAQ,gBAAgB;AAAA,EACzC,CAAC,EACA,WAAW,CAAC,OACX,GAAG,OAAO,WAAW,EAAE,YAAY;AAAA,OAC7B,QAAQ,oBAAoB,YAAY,EAAE,mBAAmB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,OAC1F,QAAQ,uBAAuB,YAAY,EAAE,sBAAsB,QAAQ,mBAAmB,IAAI,CAAC;AAAA,OACnG,QAAQ,oBAAoB,YAAY,EAAE,kBAAkB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,OACzF,QAAQ,qBAAqB,YAAY,EAAE,mBAAmB,QAAQ,iBAAiB,IAAI,CAAC;AAAA,OAC5F,QAAQ,iBAAiB,YAAY,EAAE,eAAe,QAAQ,aAAa,IAAI,CAAC;AAAA,EACtF,CAAC,CACH,EACC,QAAQ;AAAA;AAGb,eAAsB,sBAAsB,CAC1C,IACA,UACA,QACe;AAAA,EACf,MAAM,GACH,WAAW,gBAAgB,EAC3B,OAAO;AAAA,IACN,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,mBAAmB,SAAS,IAAI;AAAA,EAClC,CAAC,EACA,WAAW,CAAC,OACX,GAAG,OAAO,WAAW,EAAE,YAAY;AAAA,IACjC,kBAAkB;AAAA,OACd,SAAS,EAAE,mBAAmB,0CAA0C,IAAI,CAAC;AAAA,EACnF,CAAC,CACH,EACC,QAAQ;AAAA;",
|
|
8
|
+
"debugId": "B4106C2E1F1C5A3F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,8 +36,8 @@ interface StreamsTable {
|
|
|
36
36
|
status: Generated<string>;
|
|
37
37
|
filters: unknown;
|
|
38
38
|
options: Generated<unknown>;
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
endpoint_url: string;
|
|
40
|
+
signing_secret: string | null;
|
|
41
41
|
api_key_id: string | null;
|
|
42
42
|
created_at: Generated<Date>;
|
|
43
43
|
updated_at: Generated<Date>;
|
|
@@ -83,7 +83,7 @@ interface DeliveriesTable {
|
|
|
83
83
|
payload: unknown;
|
|
84
84
|
created_at: Generated<Date>;
|
|
85
85
|
}
|
|
86
|
-
interface
|
|
86
|
+
interface SubgraphsTable {
|
|
87
87
|
id: Generated<string>;
|
|
88
88
|
name: string;
|
|
89
89
|
version: Generated<string>;
|
|
@@ -151,6 +151,71 @@ interface UsageSnapshotsTable {
|
|
|
151
151
|
measured_at: Generated<Date>;
|
|
152
152
|
storage_bytes: Generated<number>;
|
|
153
153
|
}
|
|
154
|
+
interface WaitlistTable {
|
|
155
|
+
id: Generated<string>;
|
|
156
|
+
email: string;
|
|
157
|
+
source: Generated<string>;
|
|
158
|
+
status: Generated<string>;
|
|
159
|
+
created_at: Generated<Date>;
|
|
160
|
+
}
|
|
161
|
+
interface AccountInsightsTable {
|
|
162
|
+
id: Generated<string>;
|
|
163
|
+
account_id: string;
|
|
164
|
+
category: string;
|
|
165
|
+
insight_type: string;
|
|
166
|
+
resource_id: string | null;
|
|
167
|
+
severity: string;
|
|
168
|
+
title: string;
|
|
169
|
+
body: string;
|
|
170
|
+
data: unknown;
|
|
171
|
+
dismissed_at: Date | null;
|
|
172
|
+
expires_at: Date | null;
|
|
173
|
+
created_at: Generated<Date>;
|
|
174
|
+
}
|
|
175
|
+
interface AccountAgentRunsTable {
|
|
176
|
+
id: Generated<string>;
|
|
177
|
+
account_id: string;
|
|
178
|
+
started_at: Generated<Date>;
|
|
179
|
+
completed_at: Date | null;
|
|
180
|
+
status: Generated<string>;
|
|
181
|
+
input_tokens: Generated<number>;
|
|
182
|
+
output_tokens: Generated<number>;
|
|
183
|
+
cost_usd: Generated<number>;
|
|
184
|
+
insights_created: Generated<number>;
|
|
185
|
+
error: string | null;
|
|
186
|
+
}
|
|
187
|
+
interface SubgraphProcessingStatsTable {
|
|
188
|
+
id: Generated<string>;
|
|
189
|
+
subgraph_name: string;
|
|
190
|
+
api_key_id: string | null;
|
|
191
|
+
bucket_start: Date | null;
|
|
192
|
+
bucket_end: Date | null;
|
|
193
|
+
blocks_processed: number | null;
|
|
194
|
+
total_time_ms: number | null;
|
|
195
|
+
handler_time_ms: number | null;
|
|
196
|
+
flush_time_ms: number | null;
|
|
197
|
+
max_block_time_ms: number | null;
|
|
198
|
+
max_handler_time_ms: number | null;
|
|
199
|
+
avg_ops_per_block: number | null;
|
|
200
|
+
is_catchup: Generated<boolean>;
|
|
201
|
+
created_at: Generated<Date>;
|
|
202
|
+
}
|
|
203
|
+
interface SubgraphTableSnapshotsTable {
|
|
204
|
+
id: Generated<string>;
|
|
205
|
+
subgraph_name: string;
|
|
206
|
+
api_key_id: string | null;
|
|
207
|
+
table_name: string;
|
|
208
|
+
row_count: number | null;
|
|
209
|
+
created_at: Generated<Date>;
|
|
210
|
+
}
|
|
211
|
+
interface SubgraphHealthSnapshotsTable {
|
|
212
|
+
id: Generated<string>;
|
|
213
|
+
subgraph_id: string;
|
|
214
|
+
total_processed: number;
|
|
215
|
+
total_errors: number;
|
|
216
|
+
last_processed_block: number | null;
|
|
217
|
+
captured_at: Generated<Date>;
|
|
218
|
+
}
|
|
154
219
|
interface Database {
|
|
155
220
|
blocks: BlocksTable;
|
|
156
221
|
transactions: TransactionsTable;
|
|
@@ -160,22 +225,28 @@ interface Database {
|
|
|
160
225
|
jobs: JobsTable;
|
|
161
226
|
index_progress: IndexProgressTable;
|
|
162
227
|
deliveries: DeliveriesTable;
|
|
163
|
-
|
|
228
|
+
subgraphs: SubgraphsTable;
|
|
164
229
|
api_keys: ApiKeysTable;
|
|
165
230
|
accounts: AccountsTable;
|
|
166
231
|
sessions: SessionsTable;
|
|
167
232
|
magic_links: MagicLinksTable;
|
|
168
233
|
usage_daily: UsageDailyTable;
|
|
169
234
|
usage_snapshots: UsageSnapshotsTable;
|
|
235
|
+
waitlist: WaitlistTable;
|
|
236
|
+
account_insights: AccountInsightsTable;
|
|
237
|
+
account_agent_runs: AccountAgentRunsTable;
|
|
238
|
+
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
239
|
+
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
240
|
+
subgraph_table_snapshots: SubgraphTableSnapshotsTable;
|
|
170
241
|
}
|
|
171
|
-
type
|
|
242
|
+
type Subgraph = Selectable<SubgraphsTable>;
|
|
172
243
|
/**
|
|
173
|
-
* Convert a
|
|
174
|
-
* With keyPrefix: "
|
|
175
|
-
* Without keyPrefix: "
|
|
244
|
+
* Convert a subgraph name to its PostgreSQL schema name.
|
|
245
|
+
* With keyPrefix: "subgraph_{prefix}_{name}" (tenant-isolated)
|
|
246
|
+
* Without keyPrefix: "subgraph_{name}" (backward compat)
|
|
176
247
|
*/
|
|
177
|
-
declare function pgSchemaName(
|
|
178
|
-
declare function
|
|
248
|
+
declare function pgSchemaName(subgraphName: string, keyPrefix?: string): string;
|
|
249
|
+
declare function registerSubgraph(db: Kysely<Database>, data: {
|
|
179
250
|
name: string
|
|
180
251
|
version: string
|
|
181
252
|
definition: Record<string, unknown>
|
|
@@ -183,11 +254,11 @@ declare function registerView(db: Kysely<Database>, data: {
|
|
|
183
254
|
handlerPath: string
|
|
184
255
|
apiKeyId?: string
|
|
185
256
|
schemaName?: string
|
|
186
|
-
}): Promise<
|
|
187
|
-
declare function
|
|
188
|
-
declare function
|
|
189
|
-
declare function
|
|
190
|
-
declare function
|
|
191
|
-
declare function
|
|
192
|
-
declare function
|
|
193
|
-
export {
|
|
257
|
+
}): Promise<Subgraph>;
|
|
258
|
+
declare function getSubgraph(db: Kysely<Database>, name: string, apiKeyId?: string): Promise<Subgraph | null>;
|
|
259
|
+
declare function listSubgraphs(db: Kysely<Database>, apiKeyId?: string): Promise<Subgraph[]>;
|
|
260
|
+
declare function updateSubgraphStatus(db: Kysely<Database>, name: string, status: string, lastProcessedBlock?: number): Promise<void>;
|
|
261
|
+
declare function recordSubgraphProcessed(db: Kysely<Database>, name: string, processed: number, errors: number, lastError?: string): Promise<void>;
|
|
262
|
+
declare function updateSubgraphHandlerPath(db: Kysely<Database>, name: string, handlerPath: string): Promise<void>;
|
|
263
|
+
declare function deleteSubgraph(db: Kysely<Database>, name: string, apiKeyId?: string): Promise<Subgraph | null>;
|
|
264
|
+
export { updateSubgraphStatus, updateSubgraphHandlerPath, registerSubgraph, recordSubgraphProcessed, pgSchemaName, listSubgraphs, getSubgraph, deleteSubgraph };
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
3
7
|
var __export = (target, all) => {
|
|
4
8
|
for (var name in all)
|
|
5
9
|
__defProp(target, name, {
|
|
6
10
|
get: all[name],
|
|
7
11
|
enumerable: true,
|
|
8
12
|
configurable: true,
|
|
9
|
-
set: (
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
10
14
|
});
|
|
11
15
|
};
|
|
12
16
|
|
|
@@ -27,18 +31,18 @@ function parseJsonb(value) {
|
|
|
27
31
|
return value ?? {};
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
// src/db/queries/
|
|
34
|
+
// src/db/queries/subgraphs.ts
|
|
31
35
|
import { sql as sql2 } from "kysely";
|
|
32
|
-
function pgSchemaName(
|
|
33
|
-
const safeName =
|
|
36
|
+
function pgSchemaName(subgraphName, keyPrefix) {
|
|
37
|
+
const safeName = subgraphName.replace(/-/g, "_");
|
|
34
38
|
if (!keyPrefix) {
|
|
35
|
-
return `
|
|
39
|
+
return `subgraph_${safeName}`;
|
|
36
40
|
}
|
|
37
41
|
const safePrefix = keyPrefix.replace(/^sk-sl_/, "").replace(/-/g, "_");
|
|
38
|
-
return `
|
|
42
|
+
return `subgraph_${safePrefix}_${safeName}`;
|
|
39
43
|
}
|
|
40
|
-
async function
|
|
41
|
-
return await db.insertInto("
|
|
44
|
+
async function registerSubgraph(db, data) {
|
|
45
|
+
return await db.insertInto("subgraphs").values({
|
|
42
46
|
name: data.name,
|
|
43
47
|
version: data.version,
|
|
44
48
|
definition: jsonb(data.definition),
|
|
@@ -55,57 +59,57 @@ async function registerView(db, data) {
|
|
|
55
59
|
updated_at: new Date
|
|
56
60
|
})).returningAll().executeTakeFirstOrThrow();
|
|
57
61
|
}
|
|
58
|
-
async function
|
|
59
|
-
let query = db.selectFrom("
|
|
62
|
+
async function getSubgraph(db, name, apiKeyId) {
|
|
63
|
+
let query = db.selectFrom("subgraphs").selectAll().where("name", "=", name);
|
|
60
64
|
if (apiKeyId) {
|
|
61
65
|
query = query.where("api_key_id", "=", apiKeyId);
|
|
62
66
|
}
|
|
63
67
|
return await query.executeTakeFirst() ?? null;
|
|
64
68
|
}
|
|
65
|
-
async function
|
|
66
|
-
let query = db.selectFrom("
|
|
69
|
+
async function listSubgraphs(db, apiKeyId) {
|
|
70
|
+
let query = db.selectFrom("subgraphs").selectAll();
|
|
67
71
|
if (apiKeyId) {
|
|
68
72
|
query = query.where("api_key_id", "=", apiKeyId);
|
|
69
73
|
}
|
|
70
74
|
return query.execute();
|
|
71
75
|
}
|
|
72
|
-
async function
|
|
73
|
-
await db.updateTable("
|
|
76
|
+
async function updateSubgraphStatus(db, name, status, lastProcessedBlock) {
|
|
77
|
+
await db.updateTable("subgraphs").set({
|
|
74
78
|
status,
|
|
75
79
|
...lastProcessedBlock !== undefined ? { last_processed_block: lastProcessedBlock } : {},
|
|
76
80
|
updated_at: new Date
|
|
77
81
|
}).where("name", "=", name).execute();
|
|
78
82
|
}
|
|
79
|
-
async function
|
|
80
|
-
await db.updateTable("
|
|
83
|
+
async function recordSubgraphProcessed(db, name, processed, errors, lastError) {
|
|
84
|
+
await db.updateTable("subgraphs").set({
|
|
81
85
|
total_processed: sql2`total_processed + ${processed}`,
|
|
82
86
|
total_errors: sql2`total_errors + ${errors}`,
|
|
83
87
|
...lastError ? { last_error: lastError, last_error_at: new Date } : {},
|
|
84
88
|
updated_at: new Date
|
|
85
89
|
}).where("name", "=", name).execute();
|
|
86
90
|
}
|
|
87
|
-
async function
|
|
88
|
-
await db.updateTable("
|
|
91
|
+
async function updateSubgraphHandlerPath(db, name, handlerPath) {
|
|
92
|
+
await db.updateTable("subgraphs").set({ handler_path: handlerPath, updated_at: new Date }).where("name", "=", name).execute();
|
|
89
93
|
}
|
|
90
|
-
async function
|
|
91
|
-
const
|
|
92
|
-
if (!
|
|
94
|
+
async function deleteSubgraph(db, name, apiKeyId) {
|
|
95
|
+
const subgraph = await getSubgraph(db, name, apiKeyId);
|
|
96
|
+
if (!subgraph)
|
|
93
97
|
return null;
|
|
94
|
-
const schemaName =
|
|
98
|
+
const schemaName = subgraph.schema_name ?? pgSchemaName(name);
|
|
95
99
|
await sql2`DROP SCHEMA IF EXISTS ${sql2.raw(`"${schemaName}"`)} CASCADE`.execute(db);
|
|
96
|
-
await db.deleteFrom("
|
|
97
|
-
return
|
|
100
|
+
await db.deleteFrom("subgraphs").where("id", "=", subgraph.id).execute();
|
|
101
|
+
return subgraph;
|
|
98
102
|
}
|
|
99
103
|
export {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
updateSubgraphStatus,
|
|
105
|
+
updateSubgraphHandlerPath,
|
|
106
|
+
registerSubgraph,
|
|
107
|
+
recordSubgraphProcessed,
|
|
104
108
|
pgSchemaName,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
listSubgraphs,
|
|
110
|
+
getSubgraph,
|
|
111
|
+
deleteSubgraph
|
|
108
112
|
};
|
|
109
113
|
|
|
110
|
-
//# debugId=
|
|
111
|
-
//# sourceMappingURL=
|
|
114
|
+
//# debugId=A3A252C7C09E8C5564756E2164756E21
|
|
115
|
+
//# sourceMappingURL=subgraphs.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/db/jsonb.ts", "../src/db/queries/subgraphs.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { sql, type RawBuilder } from \"kysely\";\n\n/**\n * Safely encode a JS value as a JSONB literal for Kysely inserts/updates.\n * Kysely + postgres.js double-encodes JSON when using parameterized queries\n * with ::jsonb casts. This uses sql.raw to inline a properly escaped literal.\n */\nexport function jsonb(value: unknown): RawBuilder<unknown> {\n const escaped = JSON.stringify(value).replace(/'/g, \"''\");\n return sql`${sql.raw(`'${escaped}'::jsonb`)}`;\n}\n\n/**\n * Safely parse a JSONB value from the database.\n * Handles double-encoded strings where postgres.js returns a JSON string\n * instead of a parsed object.\n */\nexport function parseJsonb<T = unknown>(value: unknown): T {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as T;\n } catch {\n return value as T;\n }\n }\n return (value ?? {}) as T;\n}\n",
|
|
6
|
+
"import { sql, type Kysely } from \"kysely\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type { Database, Subgraph } from \"../types.ts\";\n\n/**\n * Convert a subgraph name to its PostgreSQL schema name.\n * With keyPrefix: \"subgraph_{prefix}_{name}\" (tenant-isolated)\n * Without keyPrefix: \"subgraph_{name}\" (backward compat)\n */\nexport function pgSchemaName(subgraphName: string, keyPrefix?: string): string {\n const safeName = subgraphName.replace(/-/g, \"_\");\n if (!keyPrefix) {\n return `subgraph_${safeName}`;\n }\n const safePrefix = keyPrefix.replace(/^sk-sl_/, \"\").replace(/-/g, \"_\");\n return `subgraph_${safePrefix}_${safeName}`;\n}\n\nexport async function registerSubgraph(\n db: Kysely<Database>,\n data: {\n name: string;\n version: string;\n definition: Record<string, unknown>;\n schemaHash: string;\n handlerPath: string;\n apiKeyId?: string;\n schemaName?: string;\n },\n): Promise<Subgraph> {\n return await db\n .insertInto(\"subgraphs\")\n .values({\n name: data.name,\n version: data.version,\n definition: jsonb(data.definition) as any,\n schema_hash: data.schemaHash,\n handler_path: data.handlerPath,\n api_key_id: data.apiKeyId ?? null,\n schema_name: data.schemaName ?? null,\n })\n .onConflict((oc) =>\n oc.columns([\"name\", \"api_key_id\"]).doUpdateSet({\n version: data.version,\n definition: jsonb(data.definition) as any,\n schema_hash: data.schemaHash,\n handler_path: data.handlerPath,\n schema_name: data.schemaName ?? null,\n updated_at: new Date(),\n }),\n )\n .returningAll()\n .executeTakeFirstOrThrow();\n}\n\nexport async function getSubgraph(db: Kysely<Database>, name: string, apiKeyId?: string): Promise<Subgraph | null> {\n let query = db\n .selectFrom(\"subgraphs\")\n .selectAll()\n .where(\"name\", \"=\", name);\n\n if (apiKeyId) {\n query = query.where(\"api_key_id\", \"=\", apiKeyId);\n }\n\n return (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function listSubgraphs(db: Kysely<Database>, apiKeyId?: string): Promise<Subgraph[]> {\n let query = db.selectFrom(\"subgraphs\").selectAll();\n if (apiKeyId) {\n query = query.where(\"api_key_id\", \"=\", apiKeyId);\n }\n return query.execute();\n}\n\nexport async function updateSubgraphStatus(\n db: Kysely<Database>,\n name: string,\n status: string,\n lastProcessedBlock?: number,\n): Promise<void> {\n await db\n .updateTable(\"subgraphs\")\n .set({\n status,\n ...(lastProcessedBlock !== undefined ? { last_processed_block: lastProcessedBlock } : {}),\n updated_at: new Date(),\n })\n .where(\"name\", \"=\", name)\n .execute();\n}\n\nexport async function recordSubgraphProcessed(\n db: Kysely<Database>,\n name: string,\n processed: number,\n errors: number,\n lastError?: string,\n): Promise<void> {\n await db\n .updateTable(\"subgraphs\")\n .set({\n total_processed: sql`total_processed + ${processed}`,\n total_errors: sql`total_errors + ${errors}`,\n ...(lastError\n ? { last_error: lastError, last_error_at: new Date() }\n : {}),\n updated_at: new Date(),\n })\n .where(\"name\", \"=\", name)\n .execute();\n}\n\nexport async function updateSubgraphHandlerPath(\n db: Kysely<Database>,\n name: string,\n handlerPath: string,\n): Promise<void> {\n await db\n .updateTable(\"subgraphs\")\n .set({ handler_path: handlerPath, updated_at: new Date() })\n .where(\"name\", \"=\", name)\n .execute();\n}\n\nexport async function deleteSubgraph(db: Kysely<Database>, name: string, apiKeyId?: string): Promise<Subgraph | null> {\n const subgraph = await getSubgraph(db, name, apiKeyId);\n if (!subgraph) return null;\n\n // Use stored schema_name if available, otherwise compute\n const schemaName = subgraph.schema_name ?? pgSchemaName(name);\n\n // Drop the subgraph's schema (CASCADE drops all tables within)\n await sql`DROP SCHEMA IF EXISTS ${sql.raw(`\"${schemaName}\"`)} CASCADE`.execute(db);\n\n // Remove from registry\n await db.deleteFrom(\"subgraphs\").where(\"id\", \"=\", subgraph.id).execute();\n\n return subgraph;\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "A3A252C7C09E8C5564756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
interface PlanLimits {
|
|
2
2
|
streams: number;
|
|
3
|
-
|
|
3
|
+
subgraphs: number;
|
|
4
4
|
apiRequestsPerDay: number;
|
|
5
5
|
deliveriesPerMonth: number;
|
|
6
6
|
storageBytes: number;
|
|
@@ -44,8 +44,8 @@ interface StreamsTable {
|
|
|
44
44
|
status: Generated<string>;
|
|
45
45
|
filters: unknown;
|
|
46
46
|
options: Generated<unknown>;
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
endpoint_url: string;
|
|
48
|
+
signing_secret: string | null;
|
|
49
49
|
api_key_id: string | null;
|
|
50
50
|
created_at: Generated<Date>;
|
|
51
51
|
updated_at: Generated<Date>;
|
|
@@ -91,7 +91,7 @@ interface DeliveriesTable {
|
|
|
91
91
|
payload: unknown;
|
|
92
92
|
created_at: Generated<Date>;
|
|
93
93
|
}
|
|
94
|
-
interface
|
|
94
|
+
interface SubgraphsTable {
|
|
95
95
|
id: Generated<string>;
|
|
96
96
|
name: string;
|
|
97
97
|
version: Generated<string>;
|
|
@@ -159,6 +159,71 @@ interface UsageSnapshotsTable {
|
|
|
159
159
|
measured_at: Generated<Date>;
|
|
160
160
|
storage_bytes: Generated<number>;
|
|
161
161
|
}
|
|
162
|
+
interface WaitlistTable {
|
|
163
|
+
id: Generated<string>;
|
|
164
|
+
email: string;
|
|
165
|
+
source: Generated<string>;
|
|
166
|
+
status: Generated<string>;
|
|
167
|
+
created_at: Generated<Date>;
|
|
168
|
+
}
|
|
169
|
+
interface AccountInsightsTable {
|
|
170
|
+
id: Generated<string>;
|
|
171
|
+
account_id: string;
|
|
172
|
+
category: string;
|
|
173
|
+
insight_type: string;
|
|
174
|
+
resource_id: string | null;
|
|
175
|
+
severity: string;
|
|
176
|
+
title: string;
|
|
177
|
+
body: string;
|
|
178
|
+
data: unknown;
|
|
179
|
+
dismissed_at: Date | null;
|
|
180
|
+
expires_at: Date | null;
|
|
181
|
+
created_at: Generated<Date>;
|
|
182
|
+
}
|
|
183
|
+
interface AccountAgentRunsTable {
|
|
184
|
+
id: Generated<string>;
|
|
185
|
+
account_id: string;
|
|
186
|
+
started_at: Generated<Date>;
|
|
187
|
+
completed_at: Date | null;
|
|
188
|
+
status: Generated<string>;
|
|
189
|
+
input_tokens: Generated<number>;
|
|
190
|
+
output_tokens: Generated<number>;
|
|
191
|
+
cost_usd: Generated<number>;
|
|
192
|
+
insights_created: Generated<number>;
|
|
193
|
+
error: string | null;
|
|
194
|
+
}
|
|
195
|
+
interface SubgraphProcessingStatsTable {
|
|
196
|
+
id: Generated<string>;
|
|
197
|
+
subgraph_name: string;
|
|
198
|
+
api_key_id: string | null;
|
|
199
|
+
bucket_start: Date | null;
|
|
200
|
+
bucket_end: Date | null;
|
|
201
|
+
blocks_processed: number | null;
|
|
202
|
+
total_time_ms: number | null;
|
|
203
|
+
handler_time_ms: number | null;
|
|
204
|
+
flush_time_ms: number | null;
|
|
205
|
+
max_block_time_ms: number | null;
|
|
206
|
+
max_handler_time_ms: number | null;
|
|
207
|
+
avg_ops_per_block: number | null;
|
|
208
|
+
is_catchup: Generated<boolean>;
|
|
209
|
+
created_at: Generated<Date>;
|
|
210
|
+
}
|
|
211
|
+
interface SubgraphTableSnapshotsTable {
|
|
212
|
+
id: Generated<string>;
|
|
213
|
+
subgraph_name: string;
|
|
214
|
+
api_key_id: string | null;
|
|
215
|
+
table_name: string;
|
|
216
|
+
row_count: number | null;
|
|
217
|
+
created_at: Generated<Date>;
|
|
218
|
+
}
|
|
219
|
+
interface SubgraphHealthSnapshotsTable {
|
|
220
|
+
id: Generated<string>;
|
|
221
|
+
subgraph_id: string;
|
|
222
|
+
total_processed: number;
|
|
223
|
+
total_errors: number;
|
|
224
|
+
last_processed_block: number | null;
|
|
225
|
+
captured_at: Generated<Date>;
|
|
226
|
+
}
|
|
162
227
|
interface Database {
|
|
163
228
|
blocks: BlocksTable;
|
|
164
229
|
transactions: TransactionsTable;
|
|
@@ -168,13 +233,19 @@ interface Database {
|
|
|
168
233
|
jobs: JobsTable;
|
|
169
234
|
index_progress: IndexProgressTable;
|
|
170
235
|
deliveries: DeliveriesTable;
|
|
171
|
-
|
|
236
|
+
subgraphs: SubgraphsTable;
|
|
172
237
|
api_keys: ApiKeysTable;
|
|
173
238
|
accounts: AccountsTable;
|
|
174
239
|
sessions: SessionsTable;
|
|
175
240
|
magic_links: MagicLinksTable;
|
|
176
241
|
usage_daily: UsageDailyTable;
|
|
177
242
|
usage_snapshots: UsageSnapshotsTable;
|
|
243
|
+
waitlist: WaitlistTable;
|
|
244
|
+
account_insights: AccountInsightsTable;
|
|
245
|
+
account_agent_runs: AccountAgentRunsTable;
|
|
246
|
+
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
247
|
+
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
248
|
+
subgraph_table_snapshots: SubgraphTableSnapshotsTable;
|
|
178
249
|
}
|
|
179
250
|
/** Increment API request counter for today. Fire-and-forget safe. */
|
|
180
251
|
declare function incrementApiRequests(db: Kysely<Database>, accountId: string): Promise<void>;
|
|
@@ -192,7 +263,7 @@ interface LimitCheck {
|
|
|
192
263
|
limits: ReturnType<typeof getPlanLimits>;
|
|
193
264
|
current: UsageSummary & {
|
|
194
265
|
streams: number
|
|
195
|
-
|
|
266
|
+
subgraphs: number
|
|
196
267
|
};
|
|
197
268
|
exceeded?: string;
|
|
198
269
|
}
|
|
@@ -200,7 +271,7 @@ interface LimitCheck {
|
|
|
200
271
|
declare function checkLimits(db: Kysely<Database>, accountId: string, plan: string): Promise<LimitCheck>;
|
|
201
272
|
/**
|
|
202
273
|
* Measure storage for all accounts by querying pg_total_relation_size
|
|
203
|
-
* for each tenant's
|
|
274
|
+
* for each tenant's subgraph schemas.
|
|
204
275
|
*/
|
|
205
276
|
declare function measureStorage(db: Kysely<Database>): Promise<void>;
|
|
206
277
|
export { measureStorage, incrementDeliveries, incrementApiRequests, getUsage, checkLimits, UsageSummary, LimitCheck };
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
3
7
|
var __export = (target, all) => {
|
|
4
8
|
for (var name in all)
|
|
5
9
|
__defProp(target, name, {
|
|
6
10
|
get: all[name],
|
|
7
11
|
enumerable: true,
|
|
8
12
|
configurable: true,
|
|
9
|
-
set: (
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
10
14
|
});
|
|
11
15
|
};
|
|
12
16
|
|
|
13
17
|
// src/lib/plans.ts
|
|
14
18
|
var FREE_PLAN = {
|
|
15
19
|
streams: 3,
|
|
16
|
-
|
|
20
|
+
subgraphs: 2,
|
|
17
21
|
apiRequestsPerDay: 1000,
|
|
18
22
|
deliveriesPerMonth: 5000,
|
|
19
23
|
storageBytes: 100 * 1024 * 1024
|
|
@@ -56,17 +60,17 @@ async function checkLimits(db, accountId, plan) {
|
|
|
56
60
|
const limits = getPlanLimits(plan);
|
|
57
61
|
const usage = await getUsage(db, accountId);
|
|
58
62
|
const streamCount = await db.selectFrom("streams").innerJoin("api_keys", "streams.api_key_id", "api_keys.id").select(sql`count(*)`.as("count")).where("api_keys.account_id", "=", accountId).executeTakeFirst();
|
|
59
|
-
const
|
|
63
|
+
const subgraphCount = await db.selectFrom("subgraphs").innerJoin("api_keys", "subgraphs.api_key_id", "api_keys.id").select(sql`count(*)`.as("count")).where("api_keys.account_id", "=", accountId).executeTakeFirst();
|
|
60
64
|
const current = {
|
|
61
65
|
...usage,
|
|
62
66
|
streams: Number(streamCount?.count ?? 0),
|
|
63
|
-
|
|
67
|
+
subgraphs: Number(subgraphCount?.count ?? 0)
|
|
64
68
|
};
|
|
65
69
|
if (current.streams >= limits.streams) {
|
|
66
70
|
return { allowed: false, limits, current, exceeded: "streams" };
|
|
67
71
|
}
|
|
68
|
-
if (current.
|
|
69
|
-
return { allowed: false, limits, current, exceeded: "
|
|
72
|
+
if (current.subgraphs >= limits.subgraphs) {
|
|
73
|
+
return { allowed: false, limits, current, exceeded: "subgraphs" };
|
|
70
74
|
}
|
|
71
75
|
if (current.apiRequestsToday >= limits.apiRequestsPerDay) {
|
|
72
76
|
return { allowed: false, limits, current, exceeded: "api_requests" };
|
|
@@ -80,9 +84,9 @@ async function checkLimits(db, accountId, plan) {
|
|
|
80
84
|
return { allowed: true, limits, current };
|
|
81
85
|
}
|
|
82
86
|
async function measureStorage(db) {
|
|
83
|
-
const
|
|
87
|
+
const accountSubgraphs = await db.selectFrom("subgraphs").innerJoin("api_keys", "subgraphs.api_key_id", "api_keys.id").select(["api_keys.account_id", "subgraphs.schema_name"]).where("subgraphs.schema_name", "is not", null).execute();
|
|
84
88
|
const byAccount = new Map;
|
|
85
|
-
for (const row of
|
|
89
|
+
for (const row of accountSubgraphs) {
|
|
86
90
|
const schemas = byAccount.get(row.account_id) ?? [];
|
|
87
91
|
if (row.schema_name)
|
|
88
92
|
schemas.push(row.schema_name);
|
|
@@ -113,5 +117,5 @@ export {
|
|
|
113
117
|
checkLimits
|
|
114
118
|
};
|
|
115
119
|
|
|
116
|
-
//# debugId=
|
|
120
|
+
//# debugId=31E68DFE6E6CCA6264756E2164756E21
|
|
117
121
|
//# sourceMappingURL=usage.js.map
|