@secondlayer/shared 11.6.1 → 11.7.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/archive/range-digest.d.ts +46 -27
- package/dist/src/archive/semantic-digest-builder.d.ts +46 -27
- package/dist/src/coverage/index.d.ts +46 -27
- package/dist/src/db/index.d.ts +57 -39
- package/dist/src/db/index.js +5 -4
- package/dist/src/db/index.js.map +3 -3
- package/dist/src/db/queries/chain-reorgs.d.ts +46 -27
- package/dist/src/db/queries/chain-reorgs.js +5 -4
- package/dist/src/db/queries/chain-reorgs.js.map +3 -3
- package/dist/src/db/queries/contracts.d.ts +46 -27
- package/dist/src/db/queries/instance.d.ts +46 -27
- package/dist/src/db/queries/integrity.d.ts +47 -28
- package/dist/src/db/queries/integrity.js +4 -3
- package/dist/src/db/queries/integrity.js.map +3 -3
- package/dist/src/db/queries/subgraph-gaps.d.ts +46 -27
- package/dist/src/db/queries/subgraph-operations.d.ts +46 -27
- package/dist/src/db/queries/subgraphs.d.ts +47 -33
- package/dist/src/db/queries/subgraphs.js +1 -10
- package/dist/src/db/queries/subgraphs.js.map +3 -3
- package/dist/src/db/queries/sync-scope.d.ts +46 -27
- package/dist/src/db/queries/webhooks.d.ts +46 -27
- package/dist/src/db/schema.d.ts +53 -36
- package/dist/src/index-http.d.ts +23 -0
- package/dist/src/index-http.js +9 -2
- package/dist/src/index-http.js.map +3 -3
- package/dist/src/index.d.ts +86 -42
- package/dist/src/index.js +58 -6
- package/dist/src/index.js.map +5 -5
- package/dist/src/node/local-client.d.ts +67 -28
- package/dist/src/node/local-client.js +41 -2
- package/dist/src/node/local-client.js.map +5 -4
- package/dist/src/schemas/index.d.ts +23 -1
- package/dist/src/schemas/index.js +38 -1
- package/dist/src/schemas/index.js.map +3 -3
- package/dist/src/schemas/webhooks.d.ts +23 -1
- package/dist/src/schemas/webhooks.js +38 -1
- package/dist/src/schemas/webhooks.js.map +3 -3
- package/dist/src/streams-rows/index.d.ts +43 -1
- package/dist/src/streams-rows/index.js +14 -3
- package/dist/src/streams-rows/index.js.map +3 -3
- package/dist/src/types.d.ts +12 -1
- package/migrations/0131_vm_events.ts +81 -0
- package/migrations/0132_vm_events_type_ordinal_idx.ts +21 -0
- package/migrations/0133_vm_events_fk_cascade.ts +47 -0
- package/migrations/0134_waitlists.ts +64 -0
- package/migrations/0135_drop_hosted_play_and_meters.ts +58 -0
- package/package.json +2 -2
|
@@ -93,6 +93,27 @@ interface EventsArchiveTable {
|
|
|
93
93
|
orphaned_block_hash: string | null;
|
|
94
94
|
archived_at: Generated<Date>;
|
|
95
95
|
}
|
|
96
|
+
interface VmEventsTable {
|
|
97
|
+
id: Generated<string>;
|
|
98
|
+
tx_id: string;
|
|
99
|
+
block_height: number;
|
|
100
|
+
ordinal: number;
|
|
101
|
+
type: string;
|
|
102
|
+
data: unknown;
|
|
103
|
+
created_at: Generated<Date>;
|
|
104
|
+
}
|
|
105
|
+
interface VmEventsArchiveTable {
|
|
106
|
+
archive_id: Generated<string>;
|
|
107
|
+
id: string;
|
|
108
|
+
tx_id: string;
|
|
109
|
+
block_height: number;
|
|
110
|
+
ordinal: number;
|
|
111
|
+
type: string;
|
|
112
|
+
data: unknown;
|
|
113
|
+
created_at: Date;
|
|
114
|
+
orphaned_block_hash: string | null;
|
|
115
|
+
archived_at: Generated<Date>;
|
|
116
|
+
}
|
|
96
117
|
interface DeadLetterEventsTable {
|
|
97
118
|
id: Generated<string>;
|
|
98
119
|
block_height: number;
|
|
@@ -273,21 +294,6 @@ interface MagicLinksTable {
|
|
|
273
294
|
failed_attempts: Generated<number>;
|
|
274
295
|
created_at: Generated<Date>;
|
|
275
296
|
}
|
|
276
|
-
/** One-shot hashed tokens that attach a play ghost to an email at claim. */
|
|
277
|
-
interface ClaimTokensTable {
|
|
278
|
-
id: Generated<string>;
|
|
279
|
-
account_id: string;
|
|
280
|
-
token_hash: string;
|
|
281
|
-
created_at: Generated<Date>;
|
|
282
|
-
expires_at: Date;
|
|
283
|
-
used_at: Date | null;
|
|
284
|
-
}
|
|
285
|
-
/** 3 play provisions per IP per UTC day. PK (ip_hash, day); `count` caps at 3. */
|
|
286
|
-
interface PlayProvisionsTable {
|
|
287
|
-
ip_hash: string;
|
|
288
|
-
day: string;
|
|
289
|
-
count: Generated<number>;
|
|
290
|
-
}
|
|
291
297
|
interface SubgraphProcessingStatsTable {
|
|
292
298
|
id: Generated<string>;
|
|
293
299
|
subgraph_name: string;
|
|
@@ -735,8 +741,10 @@ interface Database {
|
|
|
735
741
|
blocks: BlocksTable;
|
|
736
742
|
transactions: TransactionsTable;
|
|
737
743
|
events: EventsTable;
|
|
744
|
+
vm_events: VmEventsTable;
|
|
738
745
|
transactions_archive: TransactionsArchiveTable;
|
|
739
746
|
events_archive: EventsArchiveTable;
|
|
747
|
+
vm_events_archive: VmEventsArchiveTable;
|
|
740
748
|
dead_letter_events: DeadLetterEventsTable;
|
|
741
749
|
mempool_transactions: MempoolTransactionsTable;
|
|
742
750
|
index_progress: IndexProgressTable;
|
|
@@ -747,8 +755,6 @@ interface Database {
|
|
|
747
755
|
accounts: AccountsTable;
|
|
748
756
|
sessions: SessionsTable;
|
|
749
757
|
magic_links: MagicLinksTable;
|
|
750
|
-
claim_tokens: ClaimTokensTable;
|
|
751
|
-
play_provisions: PlayProvisionsTable;
|
|
752
758
|
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
753
759
|
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
754
760
|
subgraph_gaps: SubgraphGapsTable;
|
|
@@ -757,7 +763,6 @@ interface Database {
|
|
|
757
763
|
processed_stripe_events: ProcessedStripeEventsTable;
|
|
758
764
|
account_spend_caps: AccountSpendCapsTable;
|
|
759
765
|
account_credits: AccountCreditsTable;
|
|
760
|
-
hosted_meter_days: HostedMeterDaysTable;
|
|
761
766
|
webhooks: WebhooksTable;
|
|
762
767
|
webhook_outbox: WebhookOutboxTable;
|
|
763
768
|
webhook_deliveries: WebhookDeliveriesTable;
|
|
@@ -788,6 +793,8 @@ interface Database {
|
|
|
788
793
|
coverage_segments: CoverageSegmentsTable;
|
|
789
794
|
stage_failures: StageFailuresTable;
|
|
790
795
|
archive_fetches: ArchiveFetchesTable;
|
|
796
|
+
waitlists: WaitlistsTable;
|
|
797
|
+
waitlist_signups: WaitlistSignupsTable;
|
|
791
798
|
}
|
|
792
799
|
interface ServiceHeartbeatsTable {
|
|
793
800
|
name: string;
|
|
@@ -816,15 +823,6 @@ interface AccountCreditsTable {
|
|
|
816
823
|
refill_last_at: Date | null;
|
|
817
824
|
updated_at: Generated<Date>;
|
|
818
825
|
}
|
|
819
|
-
/** Daily idempotency ledger for hosted subgraph running + storage meters. */
|
|
820
|
-
interface HostedMeterDaysTable {
|
|
821
|
-
day: string;
|
|
822
|
-
account_id: string;
|
|
823
|
-
subgraph_name: string;
|
|
824
|
-
kind: string;
|
|
825
|
-
usd_micros: string | number | bigint;
|
|
826
|
-
billed_at: Generated<Date>;
|
|
827
|
-
}
|
|
828
826
|
/**
|
|
829
827
|
* Archive fetch charge log (design-f089 gate). Append-only: one row per
|
|
830
828
|
* priced attempt to fetch a partition object. `usd_micros` is 0 for
|
|
@@ -927,6 +925,27 @@ interface TriggerEvaluatorStateTable {
|
|
|
927
925
|
last_settlement_scan_at: ColumnType<Date | null, Date | null | undefined, Date | null>;
|
|
928
926
|
updated_at: Generated<Date>;
|
|
929
927
|
}
|
|
928
|
+
/** A public waitlist page: what it is for and whether it takes signups. */
|
|
929
|
+
interface WaitlistsTable {
|
|
930
|
+
slug: string;
|
|
931
|
+
title: string;
|
|
932
|
+
description: string;
|
|
933
|
+
url: string;
|
|
934
|
+
opened_at: Generated<Date>;
|
|
935
|
+
/** Null while the list is open. */
|
|
936
|
+
closed_at: Date | null;
|
|
937
|
+
}
|
|
938
|
+
/**
|
|
939
|
+
* One signup per (list, contact, token). `answers` holds the list's own
|
|
940
|
+
* questions, validated per list by the API before insert.
|
|
941
|
+
*/
|
|
942
|
+
interface WaitlistSignupsTable {
|
|
943
|
+
id: Generated<string>;
|
|
944
|
+
list: string;
|
|
945
|
+
contact: string;
|
|
946
|
+
answers: Record<string, unknown>;
|
|
947
|
+
created_at: Generated<Date>;
|
|
948
|
+
}
|
|
930
949
|
/**
|
|
931
950
|
* The instance's declared sync scope.
|
|
932
951
|
*
|
|
@@ -83,6 +83,27 @@ interface EventsArchiveTable {
|
|
|
83
83
|
orphaned_block_hash: string | null;
|
|
84
84
|
archived_at: Generated<Date>;
|
|
85
85
|
}
|
|
86
|
+
interface VmEventsTable {
|
|
87
|
+
id: Generated<string>;
|
|
88
|
+
tx_id: string;
|
|
89
|
+
block_height: number;
|
|
90
|
+
ordinal: number;
|
|
91
|
+
type: string;
|
|
92
|
+
data: unknown;
|
|
93
|
+
created_at: Generated<Date>;
|
|
94
|
+
}
|
|
95
|
+
interface VmEventsArchiveTable {
|
|
96
|
+
archive_id: Generated<string>;
|
|
97
|
+
id: string;
|
|
98
|
+
tx_id: string;
|
|
99
|
+
block_height: number;
|
|
100
|
+
ordinal: number;
|
|
101
|
+
type: string;
|
|
102
|
+
data: unknown;
|
|
103
|
+
created_at: Date;
|
|
104
|
+
orphaned_block_hash: string | null;
|
|
105
|
+
archived_at: Generated<Date>;
|
|
106
|
+
}
|
|
86
107
|
interface DeadLetterEventsTable {
|
|
87
108
|
id: Generated<string>;
|
|
88
109
|
block_height: number;
|
|
@@ -263,21 +284,6 @@ interface MagicLinksTable {
|
|
|
263
284
|
failed_attempts: Generated<number>;
|
|
264
285
|
created_at: Generated<Date>;
|
|
265
286
|
}
|
|
266
|
-
/** One-shot hashed tokens that attach a play ghost to an email at claim. */
|
|
267
|
-
interface ClaimTokensTable {
|
|
268
|
-
id: Generated<string>;
|
|
269
|
-
account_id: string;
|
|
270
|
-
token_hash: string;
|
|
271
|
-
created_at: Generated<Date>;
|
|
272
|
-
expires_at: Date;
|
|
273
|
-
used_at: Date | null;
|
|
274
|
-
}
|
|
275
|
-
/** 3 play provisions per IP per UTC day. PK (ip_hash, day); `count` caps at 3. */
|
|
276
|
-
interface PlayProvisionsTable {
|
|
277
|
-
ip_hash: string;
|
|
278
|
-
day: string;
|
|
279
|
-
count: Generated<number>;
|
|
280
|
-
}
|
|
281
287
|
interface SubgraphProcessingStatsTable {
|
|
282
288
|
id: Generated<string>;
|
|
283
289
|
subgraph_name: string;
|
|
@@ -725,8 +731,10 @@ interface Database {
|
|
|
725
731
|
blocks: BlocksTable;
|
|
726
732
|
transactions: TransactionsTable;
|
|
727
733
|
events: EventsTable;
|
|
734
|
+
vm_events: VmEventsTable;
|
|
728
735
|
transactions_archive: TransactionsArchiveTable;
|
|
729
736
|
events_archive: EventsArchiveTable;
|
|
737
|
+
vm_events_archive: VmEventsArchiveTable;
|
|
730
738
|
dead_letter_events: DeadLetterEventsTable;
|
|
731
739
|
mempool_transactions: MempoolTransactionsTable;
|
|
732
740
|
index_progress: IndexProgressTable;
|
|
@@ -737,8 +745,6 @@ interface Database {
|
|
|
737
745
|
accounts: AccountsTable;
|
|
738
746
|
sessions: SessionsTable;
|
|
739
747
|
magic_links: MagicLinksTable;
|
|
740
|
-
claim_tokens: ClaimTokensTable;
|
|
741
|
-
play_provisions: PlayProvisionsTable;
|
|
742
748
|
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
743
749
|
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
744
750
|
subgraph_gaps: SubgraphGapsTable;
|
|
@@ -747,7 +753,6 @@ interface Database {
|
|
|
747
753
|
processed_stripe_events: ProcessedStripeEventsTable;
|
|
748
754
|
account_spend_caps: AccountSpendCapsTable;
|
|
749
755
|
account_credits: AccountCreditsTable;
|
|
750
|
-
hosted_meter_days: HostedMeterDaysTable;
|
|
751
756
|
webhooks: WebhooksTable;
|
|
752
757
|
webhook_outbox: WebhookOutboxTable;
|
|
753
758
|
webhook_deliveries: WebhookDeliveriesTable;
|
|
@@ -778,6 +783,8 @@ interface Database {
|
|
|
778
783
|
coverage_segments: CoverageSegmentsTable;
|
|
779
784
|
stage_failures: StageFailuresTable;
|
|
780
785
|
archive_fetches: ArchiveFetchesTable;
|
|
786
|
+
waitlists: WaitlistsTable;
|
|
787
|
+
waitlist_signups: WaitlistSignupsTable;
|
|
781
788
|
}
|
|
782
789
|
interface ServiceHeartbeatsTable {
|
|
783
790
|
name: string;
|
|
@@ -806,15 +813,6 @@ interface AccountCreditsTable {
|
|
|
806
813
|
refill_last_at: Date | null;
|
|
807
814
|
updated_at: Generated<Date>;
|
|
808
815
|
}
|
|
809
|
-
/** Daily idempotency ledger for hosted subgraph running + storage meters. */
|
|
810
|
-
interface HostedMeterDaysTable {
|
|
811
|
-
day: string;
|
|
812
|
-
account_id: string;
|
|
813
|
-
subgraph_name: string;
|
|
814
|
-
kind: string;
|
|
815
|
-
usd_micros: string | number | bigint;
|
|
816
|
-
billed_at: Generated<Date>;
|
|
817
|
-
}
|
|
818
816
|
/**
|
|
819
817
|
* Archive fetch charge log (design-f089 gate). Append-only: one row per
|
|
820
818
|
* priced attempt to fetch a partition object. `usd_micros` is 0 for
|
|
@@ -918,6 +916,27 @@ interface TriggerEvaluatorStateTable {
|
|
|
918
916
|
last_settlement_scan_at: ColumnType<Date | null, Date | null | undefined, Date | null>;
|
|
919
917
|
updated_at: Generated<Date>;
|
|
920
918
|
}
|
|
919
|
+
/** A public waitlist page: what it is for and whether it takes signups. */
|
|
920
|
+
interface WaitlistsTable {
|
|
921
|
+
slug: string;
|
|
922
|
+
title: string;
|
|
923
|
+
description: string;
|
|
924
|
+
url: string;
|
|
925
|
+
opened_at: Generated<Date>;
|
|
926
|
+
/** Null while the list is open. */
|
|
927
|
+
closed_at: Date | null;
|
|
928
|
+
}
|
|
929
|
+
/**
|
|
930
|
+
* One signup per (list, contact, token). `answers` holds the list's own
|
|
931
|
+
* questions, validated per list by the API before insert.
|
|
932
|
+
*/
|
|
933
|
+
interface WaitlistSignupsTable {
|
|
934
|
+
id: Generated<string>;
|
|
935
|
+
list: string;
|
|
936
|
+
contact: string;
|
|
937
|
+
answers: Record<string, unknown>;
|
|
938
|
+
created_at: Generated<Date>;
|
|
939
|
+
}
|
|
921
940
|
/**
|
|
922
941
|
* Webhook CRUD. `signing_secret_enc` is transparently encrypted via
|
|
923
942
|
* `encryptSecret`/`decryptSecret`. Plaintext secrets only leave via the
|
package/dist/src/db/schema.d.ts
CHANGED
|
@@ -82,6 +82,27 @@ interface EventsArchiveTable {
|
|
|
82
82
|
orphaned_block_hash: string | null;
|
|
83
83
|
archived_at: Generated<Date>;
|
|
84
84
|
}
|
|
85
|
+
interface VmEventsTable {
|
|
86
|
+
id: Generated<string>;
|
|
87
|
+
tx_id: string;
|
|
88
|
+
block_height: number;
|
|
89
|
+
ordinal: number;
|
|
90
|
+
type: string;
|
|
91
|
+
data: unknown;
|
|
92
|
+
created_at: Generated<Date>;
|
|
93
|
+
}
|
|
94
|
+
interface VmEventsArchiveTable {
|
|
95
|
+
archive_id: Generated<string>;
|
|
96
|
+
id: string;
|
|
97
|
+
tx_id: string;
|
|
98
|
+
block_height: number;
|
|
99
|
+
ordinal: number;
|
|
100
|
+
type: string;
|
|
101
|
+
data: unknown;
|
|
102
|
+
created_at: Date;
|
|
103
|
+
orphaned_block_hash: string | null;
|
|
104
|
+
archived_at: Generated<Date>;
|
|
105
|
+
}
|
|
85
106
|
interface DeadLetterEventsTable {
|
|
86
107
|
id: Generated<string>;
|
|
87
108
|
block_height: number;
|
|
@@ -262,21 +283,6 @@ interface MagicLinksTable {
|
|
|
262
283
|
failed_attempts: Generated<number>;
|
|
263
284
|
created_at: Generated<Date>;
|
|
264
285
|
}
|
|
265
|
-
/** One-shot hashed tokens that attach a play ghost to an email at claim. */
|
|
266
|
-
interface ClaimTokensTable {
|
|
267
|
-
id: Generated<string>;
|
|
268
|
-
account_id: string;
|
|
269
|
-
token_hash: string;
|
|
270
|
-
created_at: Generated<Date>;
|
|
271
|
-
expires_at: Date;
|
|
272
|
-
used_at: Date | null;
|
|
273
|
-
}
|
|
274
|
-
/** 3 play provisions per IP per UTC day. PK (ip_hash, day); `count` caps at 3. */
|
|
275
|
-
interface PlayProvisionsTable {
|
|
276
|
-
ip_hash: string;
|
|
277
|
-
day: string;
|
|
278
|
-
count: Generated<number>;
|
|
279
|
-
}
|
|
280
286
|
interface SubgraphProcessingStatsTable {
|
|
281
287
|
id: Generated<string>;
|
|
282
288
|
subgraph_name: string;
|
|
@@ -724,8 +730,10 @@ interface Database {
|
|
|
724
730
|
blocks: BlocksTable;
|
|
725
731
|
transactions: TransactionsTable;
|
|
726
732
|
events: EventsTable;
|
|
733
|
+
vm_events: VmEventsTable;
|
|
727
734
|
transactions_archive: TransactionsArchiveTable;
|
|
728
735
|
events_archive: EventsArchiveTable;
|
|
736
|
+
vm_events_archive: VmEventsArchiveTable;
|
|
729
737
|
dead_letter_events: DeadLetterEventsTable;
|
|
730
738
|
mempool_transactions: MempoolTransactionsTable;
|
|
731
739
|
index_progress: IndexProgressTable;
|
|
@@ -736,8 +744,6 @@ interface Database {
|
|
|
736
744
|
accounts: AccountsTable;
|
|
737
745
|
sessions: SessionsTable;
|
|
738
746
|
magic_links: MagicLinksTable;
|
|
739
|
-
claim_tokens: ClaimTokensTable;
|
|
740
|
-
play_provisions: PlayProvisionsTable;
|
|
741
747
|
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
742
748
|
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
743
749
|
subgraph_gaps: SubgraphGapsTable;
|
|
@@ -746,7 +752,6 @@ interface Database {
|
|
|
746
752
|
processed_stripe_events: ProcessedStripeEventsTable;
|
|
747
753
|
account_spend_caps: AccountSpendCapsTable;
|
|
748
754
|
account_credits: AccountCreditsTable;
|
|
749
|
-
hosted_meter_days: HostedMeterDaysTable;
|
|
750
755
|
webhooks: WebhooksTable;
|
|
751
756
|
webhook_outbox: WebhookOutboxTable;
|
|
752
757
|
webhook_deliveries: WebhookDeliveriesTable;
|
|
@@ -777,6 +782,8 @@ interface Database {
|
|
|
777
782
|
coverage_segments: CoverageSegmentsTable;
|
|
778
783
|
stage_failures: StageFailuresTable;
|
|
779
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
waitlists: WaitlistsTable;
|
|
786
|
+
waitlist_signups: WaitlistSignupsTable;
|
|
780
787
|
}
|
|
781
788
|
interface ServiceHeartbeatsTable {
|
|
782
789
|
name: string;
|
|
@@ -811,18 +818,6 @@ interface AccountCreditsTable {
|
|
|
811
818
|
type AccountCredits = Selectable<AccountCreditsTable>;
|
|
812
819
|
type InsertAccountCredits = Insertable<AccountCreditsTable>;
|
|
813
820
|
type UpdateAccountCredits = Updateable<AccountCreditsTable>;
|
|
814
|
-
/** Daily idempotency ledger for hosted subgraph running + storage meters. */
|
|
815
|
-
interface HostedMeterDaysTable {
|
|
816
|
-
day: string;
|
|
817
|
-
account_id: string;
|
|
818
|
-
subgraph_name: string;
|
|
819
|
-
kind: string;
|
|
820
|
-
usd_micros: string | number | bigint;
|
|
821
|
-
billed_at: Generated<Date>;
|
|
822
|
-
}
|
|
823
|
-
type HostedMeterDay = Selectable<HostedMeterDaysTable>;
|
|
824
|
-
type InsertHostedMeterDay = Insertable<HostedMeterDaysTable>;
|
|
825
|
-
type UpdateHostedMeterDay = Updateable<HostedMeterDaysTable>;
|
|
826
821
|
/**
|
|
827
822
|
* Archive fetch charge log (design-f089 gate). Append-only: one row per
|
|
828
823
|
* priced attempt to fetch a partition object. `usd_micros` is 0 for
|
|
@@ -851,6 +846,9 @@ type InsertMempoolTransaction = Insertable<MempoolTransactionsTable>;
|
|
|
851
846
|
type Event = Selectable<EventsTable>;
|
|
852
847
|
type InsertEvent = Insertable<EventsTable>;
|
|
853
848
|
type UpdateEvent = Updateable<EventsTable>;
|
|
849
|
+
type VmEvent = Selectable<VmEventsTable>;
|
|
850
|
+
type InsertVmEvent = Insertable<VmEventsTable>;
|
|
851
|
+
type UpdateVmEvent = Updateable<VmEventsTable>;
|
|
854
852
|
type IndexProgress = Selectable<IndexProgressTable>;
|
|
855
853
|
type InsertIndexProgress = Insertable<IndexProgressTable>;
|
|
856
854
|
type UpdateIndexProgress = Updateable<IndexProgressTable>;
|
|
@@ -870,11 +868,6 @@ type Account = Selectable<AccountsTable>;
|
|
|
870
868
|
type InsertAccount = Insertable<AccountsTable>;
|
|
871
869
|
type MagicLink = Selectable<MagicLinksTable>;
|
|
872
870
|
type InsertMagicLink = Insertable<MagicLinksTable>;
|
|
873
|
-
type ClaimToken = Selectable<ClaimTokensTable>;
|
|
874
|
-
type InsertClaimToken = Insertable<ClaimTokensTable>;
|
|
875
|
-
type UpdateClaimToken = Updateable<ClaimTokensTable>;
|
|
876
|
-
type PlayProvision = Selectable<PlayProvisionsTable>;
|
|
877
|
-
type InsertPlayProvision = Insertable<PlayProvisionsTable>;
|
|
878
871
|
type Session = Selectable<SessionsTable>;
|
|
879
872
|
type InsertSession = Insertable<SessionsTable>;
|
|
880
873
|
type SubgraphHealthSnapshot = Selectable<SubgraphHealthSnapshotsTable>;
|
|
@@ -978,4 +971,28 @@ interface TriggerEvaluatorStateTable {
|
|
|
978
971
|
updated_at: Generated<Date>;
|
|
979
972
|
}
|
|
980
973
|
type TriggerEvaluatorState = Selectable<TriggerEvaluatorStateTable>;
|
|
981
|
-
|
|
974
|
+
/** A public waitlist page: what it is for and whether it takes signups. */
|
|
975
|
+
interface WaitlistsTable {
|
|
976
|
+
slug: string;
|
|
977
|
+
title: string;
|
|
978
|
+
description: string;
|
|
979
|
+
url: string;
|
|
980
|
+
opened_at: Generated<Date>;
|
|
981
|
+
/** Null while the list is open. */
|
|
982
|
+
closed_at: Date | null;
|
|
983
|
+
}
|
|
984
|
+
/**
|
|
985
|
+
* One signup per (list, contact, token). `answers` holds the list's own
|
|
986
|
+
* questions, validated per list by the API before insert.
|
|
987
|
+
*/
|
|
988
|
+
interface WaitlistSignupsTable {
|
|
989
|
+
id: Generated<string>;
|
|
990
|
+
list: string;
|
|
991
|
+
contact: string;
|
|
992
|
+
answers: Record<string, unknown>;
|
|
993
|
+
created_at: Generated<Date>;
|
|
994
|
+
}
|
|
995
|
+
type Waitlist = Selectable<WaitlistsTable>;
|
|
996
|
+
type WaitlistSignup = Selectable<WaitlistSignupsTable>;
|
|
997
|
+
type InsertWaitlistSignup = Insertable<WaitlistSignupsTable>;
|
|
998
|
+
export { WebhooksTable, WebhookStatus, WebhookRuntime, WebhookOutboxTable, WebhookOutbox, WebhookKind, WebhookFormat, WebhookDelivery, WebhookDeliveriesTable, Webhook, WaitlistsTable, WaitlistSignupsTable, WaitlistSignup, Waitlist, VmEventsTable, VmEventsArchiveTable, VmEvent, UpdateWebhookOutbox, UpdateWebhook, UpdateVmEvent, UpdateTransaction, UpdateSubgraphOperation, UpdateSubgraph, UpdateIndexProgress, UpdateEvent, UpdateContract, UpdateBlock, UpdateArchiveFetch, UpdateApiKey, UpdateAccountSpendCap, UpdateAccountCredits, TriggerEvaluatorStateTable, TriggerEvaluatorState, TransactionsTable, TransactionsArchiveTable, Transaction, SyncScopesTable, SubgraphsTable, SubgraphViolationsTable, SubgraphProcessingStatsTable, SubgraphOperationsTable, SubgraphOperationStatus, SubgraphOperationKind, SubgraphOperation, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGap, Subgraph, StageRunsTable, StageRegistryTable, StageKind, StageFailuresTable, StageBlockReceiptsTable, SessionsTable, Session, ServiceHeartbeatsTable, SbtcTokenEventsTable, SbtcTokenEventType, SbtcSettlementsTable, SbtcEventsTable, SbtcEventTopic, RunStatus, RetryState, RepairMode, ProcessedStripeEventsTable, Pox5EventsTable, Pox5EventTopic, Pox4FunctionName, Pox4CallsTable, PendingForkBlocksTable, OutboxStatus, ObserverJournalTable, ObserverJournalStatus, NativeClock, MempoolTransactionsTable, MempoolTransaction, MagicLinksTable, MagicLink, InstancesTable, InsertWebhookOutbox, InsertWebhookDelivery, InsertWebhook, InsertWaitlistSignup, InsertVmEvent, InsertTransaction, InsertSubgraphOperation, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertMempoolTransaction, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertContract, InsertBlock, InsertArchiveFetch, InsertApiKey, InsertAccountSpendCap, InsertAccountCredits, InsertAccount, IndexProgressTable, IndexProgress, FailureUnit, FailureClass, EventsTable, EventsArchiveTable, Event, DecoderCheckpointsTable, DecodedEventsTable, DeadLetterEventsTable, Database, CoverageSegmentsTable, ContractsTable, Contract, ChainReorgsTable, ChainReadCacheTable, BurnBlockRewardsTable, BurnBlockRewardSlotsTable, BnsNamespacesTable, BnsNamespaceEventsTable, BnsNamespaceEventStatus, BnsNamesTable, BnsNameEventsTable, BnsNameEventTopic, BnsMarketplaceEventsTable, BnsMarketplaceAction, BlocksTable, Block, ArchiveFetchesTable, ArchiveFetch, ApiKeysTable, ApiKey, AccountsTable, AccountSpendCapsTable, AccountSpendCap, AccountCreditsTable, AccountCredits, Account };
|
package/dist/src/index-http.d.ts
CHANGED
|
@@ -55,6 +55,26 @@ type IndexEventRow = IndexEventCommon & ({
|
|
|
55
55
|
value: unknown
|
|
56
56
|
raw_value: string | null
|
|
57
57
|
}
|
|
58
|
+
} | {
|
|
59
|
+
event_type: "nested_contract_call"
|
|
60
|
+
sender?: string | null
|
|
61
|
+
caller: string
|
|
62
|
+
function_name: string
|
|
63
|
+
function_args?: unknown
|
|
64
|
+
raw_result?: string | null
|
|
65
|
+
} | {
|
|
66
|
+
event_type: "var_set"
|
|
67
|
+
var_name: string
|
|
68
|
+
raw_value?: string | null
|
|
69
|
+
} | {
|
|
70
|
+
event_type: "map_set" | "map_insert"
|
|
71
|
+
map: string
|
|
72
|
+
raw_key?: string | null
|
|
73
|
+
raw_value?: string | null
|
|
74
|
+
} | {
|
|
75
|
+
event_type: "map_delete"
|
|
76
|
+
map: string
|
|
77
|
+
raw_key?: string | null
|
|
58
78
|
});
|
|
59
79
|
type IndexTransactionRow = {
|
|
60
80
|
tx_id: string
|
|
@@ -137,6 +157,9 @@ declare class IndexHttpClient {
|
|
|
137
157
|
* process past it, even if the Streams clock is ahead.
|
|
138
158
|
*/
|
|
139
159
|
getIndexTip(): Promise<number>;
|
|
160
|
+
/** Ingest tip. VM rows land with the block; decoded `block_height` can lag. */
|
|
161
|
+
getIndexSourceTip(): Promise<number>;
|
|
162
|
+
private getIndexTipEnvelope;
|
|
140
163
|
/** Reorgs since a resume token (wall-clock `detected_at`-keyed). */
|
|
141
164
|
listReorgs(since: string): Promise<{
|
|
142
165
|
reorgs: StreamsReorgRow[]
|
package/dist/src/index-http.js
CHANGED
|
@@ -164,9 +164,16 @@ class IndexHttpClient {
|
|
|
164
164
|
return Number(tip.block_height) || 0;
|
|
165
165
|
}
|
|
166
166
|
async getIndexTip() {
|
|
167
|
-
const env = await this.
|
|
167
|
+
const env = await this.getIndexTipEnvelope();
|
|
168
168
|
return Number(env.tip?.block_height) || 0;
|
|
169
169
|
}
|
|
170
|
+
async getIndexSourceTip() {
|
|
171
|
+
const env = await this.getIndexTipEnvelope();
|
|
172
|
+
return Number(env.tip?.source_block_height ?? env.tip?.block_height) || 0;
|
|
173
|
+
}
|
|
174
|
+
async getIndexTipEnvelope() {
|
|
175
|
+
return this.get(`${this.indexBaseUrl}/v1/index/blocks?limit=1`, this.indexApiKey);
|
|
176
|
+
}
|
|
170
177
|
async listReorgs(since) {
|
|
171
178
|
const params = new URLSearchParams({ since });
|
|
172
179
|
return this.get(`${this.streamsBaseUrl}/v1/streams/reorgs?${params}`, this.streamsApiKey);
|
|
@@ -186,5 +193,5 @@ export {
|
|
|
186
193
|
IndexHttpClient
|
|
187
194
|
};
|
|
188
195
|
|
|
189
|
-
//# debugId=
|
|
196
|
+
//# debugId=494275043F5C0F7B64756E2164756E21
|
|
190
197
|
//# sourceMappingURL=index-http.js.map
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"sources": ["../src/index-internal-auth.ts", "../src/index-http.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Internal service credentials for first-party consumers of /v1/index and\n// /v1/streams over HTTP (decoder, subgraph processor PublicApiBlockSource).\n// Seeded as internal tenants with NO account_id, so these reads are\n// unmetered (metering gates on account_id). Lives in shared so the API (seed)\n// and the consumers import it without a cycle.\n//\n// Resolution: STREAMS_INTERNAL_API_KEY / INDEX_INTERNAL_API_KEY, then\n// INSTANCE_TOKEN (OSS). No committed fallback. Empty-string env values fall\n// through (`trim()`, then empty): compose interpolates\n// `${STREAMS_INTERNAL_API_KEY:-}` which is \"\" when unset.\n//\n// Archive keys must not use the `sk-sl_` prefix; generate with `sl-int_`.\n// OSS compose should omit the internal env and send INSTANCE_TOKEN.\nexport const INDEX_INTERNAL_TENANT_ID = \"tenant_index_internal\";\nexport const INTERNAL_STREAMS_TENANT_ID = \"tenant_streams_decode_internal\";\n\nconst DEFAULT_INTERNAL_INDEX_BASE_URL = \"http://api:3800\";\n\nconst MISSING_INTERNAL_STREAMS_API_KEY =\n\t\"Set STREAMS_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Empty env no longer falls back to a committed secret.\";\n\nconst MISSING_INTERNAL_INDEX_API_KEY =\n\t\"Set INDEX_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Without one, Index reads go out anonymously and are capped at the last 24h, so any seek into older history 402s.\";\n\nexport function defaultInternalIndexApiKey(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n\tconst internal = env.INDEX_INTERNAL_API_KEY?.trim();\n\tif (internal) return internal;\n\tconst instance = env.INSTANCE_TOKEN?.trim();\n\tif (instance) return instance;\n\treturn undefined;\n}\n\nexport function defaultInternalStreamsApiKey(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n\tconst internal = env.STREAMS_INTERNAL_API_KEY?.trim();\n\tif (internal) return internal;\n\tconst instance = env.INSTANCE_TOKEN?.trim();\n\tif (instance) return instance;\n\treturn undefined;\n}\n\n/**\n * Platform-mode Index consumer: refuse to run with neither credential.\n *\n * A keyless Index read is not an error — it is an anonymous read, and the API\n * serves it for the last 24h (`api/src/index/free-window.ts`). That makes a\n * missing key invisible right up until a consumer's cursor falls out of the\n * window, at which point every read 402s and the container goes unhealthy,\n * possibly weeks after the misconfiguration. Callers that seek older history\n * on a platform-mode instance should fail here at startup instead.\n *\n * Self-hosted (oss/dedicated) instances are not gated, so they must NOT call\n * this — `defaultInternalIndexApiKey()` returning undefined is correct there.\n */\nexport function requireInternalIndexApiKey(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string {\n\tconst key = defaultInternalIndexApiKey(env);\n\tif (!key) throw new Error(MISSING_INTERNAL_INDEX_API_KEY);\n\treturn key;\n}\n\n/** Decoder startup: refuse to run with neither credential. */\nexport function requireInternalStreamsApiKey(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string {\n\tconst key = defaultInternalStreamsApiKey(env);\n\tif (!key) throw new Error(MISSING_INTERNAL_STREAMS_API_KEY);\n\treturn key;\n}\n\n/** Shared env contract for decoder + subgraph HTTP dogfood. */\nexport function defaultInternalIndexBaseUrl(): string {\n\treturn (\n\t\tprocess.env.SUBGRAPH_INDEX_API_URL ||\n\t\tprocess.env.STREAMS_API_URL ||\n\t\tDEFAULT_INTERNAL_INDEX_BASE_URL\n\t);\n}\n",
|
|
6
|
-
"import {\n\tdefaultInternalIndexApiKey,\n\tdefaultInternalIndexBaseUrl,\n\tdefaultInternalStreamsApiKey,\n} from \"./index-internal-auth.ts\";\n\n/**\n * Low-level transport for the public Index (`/v1/index`) + Streams clock\n * (`/v1/streams`) HTTP APIs: cursor-paginated reads, tip, reorgs. Lives in\n * `shared` (a leaf both the SDK and the subgraph runtime depend on) so the wire\n * format has one home and no package cycle. The SDK's ergonomic client should\n * eventually consume these row types too (see the plan's convergence task).\n *\n * This is intentionally minimal — just the GETs the subgraph runtime's\n * PublicApiBlockSource needs. It is NOT the SDK's full client (walk/consume/\n * retries/auth resolution).\n */\n\nconst PAGE_LIMIT = 1000;\n\n// Transport resilience for the streams-index data plane. The api runs N>1\n// replicas behind Caddy; during a rolling deploy one replica is briefly\n// unreachable, surfacing as a thrown fetch (connection refused/reset) or a\n// Caddy 502/503/504 while it fails over. Retrying a few times with backoff\n// makes a single-replica recreate transparent to the subgraph-processor /\n// decoder — closing the processors-depend-on-api coupling.\nconst MAX_ATTEMPTS = 4;\nconst RETRY_BASE_MS = 150;\nconst RETRYABLE_STATUS = new Set([502, 503, 504]);\n\nconst delay = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms));\n\ntype Envelope<K extends string, T> = {\n\t[P in K]: T[];\n} & { next_cursor: string | null };\n\n// ── Index API wire shapes (single source of truth) ─────────────────────────\nexport type IndexBlockRow = {\n\tblock_height: number;\n\tblock_hash: string;\n\tparent_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\t/** Nakamoto StacksBlockId. Absent from pre-2026-07 API deployments. */\n\tindex_block_hash?: string | null;\n\tblock_time: string | null;\n};\n\ntype IndexEventCommon = {\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index?: number;\n\tevent_index: number;\n\tcontract_id: string | null;\n\t/** Submitting-tx context — present only when the read passed `tx_context=true`.\n\t * Lets a consumer build the tx for `ctx.tx` without a separate\n\t * walkTransactions (the ~37x reindex over-fetch; see indexing-speed plan). */\n\ttx_sender?: string | null;\n\ttx_type?: string | null;\n\ttx_status?: string | null;\n\ttx_contract_id?: string | null;\n\ttx_function_name?: string | null;\n};\n\nexport type IndexEventRow = IndexEventCommon &\n\t(\n\t\t| {\n\t\t\t\tevent_type: \"ft_transfer\" | \"ft_mint\" | \"ft_burn\";\n\t\t\t\tasset_identifier: string;\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tamount: string;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"nft_transfer\" | \"nft_mint\" | \"nft_burn\";\n\t\t\t\tasset_identifier: string;\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tvalue: string;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"stx_transfer\" | \"stx_mint\" | \"stx_burn\";\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tamount: string;\n\t\t\t\tmemo?: string | null;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"stx_lock\";\n\t\t\t\tsender: string;\n\t\t\t\tamount: string;\n\t\t\t\tpayload: { unlock_height: string | null };\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"print\";\n\t\t\t\tpayload: {\n\t\t\t\t\ttopic: string | null;\n\t\t\t\t\tvalue: unknown;\n\t\t\t\t\traw_value: string | null;\n\t\t\t\t};\n\t\t }\n\t);\n\nexport type IndexTransactionRow = {\n\ttx_id: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\tburn_block_height?: number | null;\n\ttx_index: number;\n\ttx_type: string;\n\tsender: string;\n\tstatus: string;\n\tcontract_call?: {\n\t\tcontract_id: string;\n\t\tfunction_name: string;\n\t\tfunction_args_hex?: string[] | null;\n\t\tresult_hex?: string | null;\n\t} | null;\n\tsmart_contract?: { contract_id: string | null } | null;\n};\n\nexport type StreamsReorgRow = {\n\tid: string;\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\tnew_canonical_tip: string;\n};\n\nexport type IndexHttpOptions = {\n\t/** Base URL for /v1/index (the decoded data plane). */\n\tindexBaseUrl: string;\n\t/** Bearer for /v1/index. Empty/unset omits the header. */\n\tindexApiKey?: string;\n\t/** Base URL for /v1/streams (the canonical clock). */\n\tstreamsBaseUrl: string;\n\t/** Bearer for /v1/streams. Empty/unset omits the header. */\n\tstreamsApiKey?: string;\n};\n\nexport class IndexHttpClient {\n\tprivate readonly indexBaseUrl: string;\n\tprivate readonly indexApiKey: string | undefined;\n\tprivate readonly streamsBaseUrl: string;\n\tprivate readonly streamsApiKey: string | undefined;\n\n\tconstructor(opts: IndexHttpOptions) {\n\t\tthis.indexBaseUrl = opts.indexBaseUrl.replace(/\\/+$/, \"\");\n\t\tthis.indexApiKey = opts.indexApiKey ?? defaultInternalIndexApiKey();\n\t\tthis.streamsBaseUrl = opts.streamsBaseUrl.replace(/\\/+$/, \"\");\n\t\tthis.streamsApiKey = opts.streamsApiKey;\n\t}\n\n\tprivate async get<T>(url: string, apiKey: string | undefined): Promise<T> {\n\t\t// Index reads are anon — omit the header entirely when no key is set, so\n\t\t// an empty key reads anonymously rather than 401-ing as an invalid bearer.\n\t\tconst headers: Record<string, string> = apiKey\n\t\t\t? { authorization: `Bearer ${apiKey}` }\n\t\t\t: {};\n\t\tlet lastErr: unknown;\n\t\tfor (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n\t\t\tlet res: Response;\n\t\t\ttry {\n\t\t\t\tres = await fetch(url, { headers });\n\t\t\t} catch (err) {\n\t\t\t\t// An explicit abort/cancel is intentional — surface it immediately\n\t\t\t\t// rather than burning the retry budget masking it as transient.\n\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") throw err;\n\t\t\t\t// Otherwise a transport-level failure (connection refused/reset) —\n\t\t\t\t// e.g. an api replica mid-recreate. Retry; the next attempt\n\t\t\t\t// round-robins to a healthy replica.\n\t\t\t\tlastErr = err;\n\t\t\t\tif (attempt >= MAX_ATTEMPTS) break;\n\t\t\t\tawait delay(RETRY_BASE_MS * 2 ** (attempt - 1));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!res.ok) {\n\t\t\t\tif (RETRYABLE_STATUS.has(res.status) && attempt < MAX_ATTEMPTS) {\n\t\t\t\t\t// Drain the body so the connection can be reused, then back off.\n\t\t\t\t\tawait res.text().catch(() => {});\n\t\t\t\t\tawait delay(RETRY_BASE_MS * 2 ** (attempt - 1));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`GET ${url} → ${res.status} ${await res.text()}`);\n\t\t\t}\n\t\t\treturn (await res.json()) as T;\n\t\t}\n\t\tthrow (\n\t\t\tlastErr ?? new Error(`GET ${url} failed after ${MAX_ATTEMPTS} attempts`)\n\t\t);\n\t}\n\n\t/** Fetch a single cursor page of an Index collection. */\n\tprivate async getPage<K extends string, T>(\n\t\tpath: string,\n\t\tkey: K,\n\t\tparams: URLSearchParams,\n\t): Promise<{ items: T[]; next_cursor: string | null }> {\n\t\tconst env: Envelope<K, T> = await this.get(\n\t\t\t`${this.indexBaseUrl}${path}?${params}`,\n\t\t\tthis.indexApiKey,\n\t\t);\n\t\treturn { items: env[key], next_cursor: env.next_cursor };\n\t}\n\n\t/** Drain a cursor-paginated Index collection over [fromHeight, toHeight]. */\n\tprivate async walk<K extends string, T>(\n\t\tpath: string,\n\t\tkey: K,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\textraParams: Record<string, string> = {},\n\t): Promise<T[]> {\n\t\tconst out: T[] = [];\n\t\tlet cursor: string | null = null;\n\t\tdo {\n\t\t\tconst params = new URLSearchParams({\n\t\t\t\tto_height: String(toHeight),\n\t\t\t\tlimit: String(PAGE_LIMIT),\n\t\t\t\t...extraParams,\n\t\t\t});\n\t\t\t// from_height and cursor are mutually exclusive — anchor the first page\n\t\t\t// by height, then page forward by cursor only.\n\t\t\tif (cursor) params.set(\"cursor\", cursor);\n\t\t\telse params.set(\"from_height\", String(fromHeight));\n\t\t\tconst { items, next_cursor } = await this.getPage<K, T>(\n\t\t\t\tpath,\n\t\t\t\tkey,\n\t\t\t\tparams,\n\t\t\t);\n\t\t\tout.push(...items);\n\t\t\tcursor = next_cursor;\n\t\t} while (cursor);\n\t\treturn out;\n\t}\n\n\t/**\n\t * Fetch ONE page of contract-call transactions filtered to `contractId`.\n\t * Unlike walk(), this does NOT drain — the caller pages by feeding back\n\t * next_cursor — so a sparse high-volume filter (e.g. a single contract over\n\t * all history) costs one request per batch, not O(all-history) per tick.\n\t * `cursor` is exclusive (rows strictly after it); on the first call pass\n\t * `fromHeight` to anchor the backfill start instead.\n\t */\n\tasync fetchContractCalls(\n\t\tcontractId: string,\n\t\topts: {\n\t\t\ttoHeight: number;\n\t\t\tcursor?: string | null;\n\t\t\tfromHeight?: number;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<{\n\t\ttransactions: IndexTransactionRow[];\n\t\tnext_cursor: string | null;\n\t}> {\n\t\tconst params = new URLSearchParams({\n\t\t\tto_height: String(opts.toHeight),\n\t\t\tlimit: String(opts.limit ?? PAGE_LIMIT),\n\t\t\tcontract_id: contractId,\n\t\t});\n\t\tif (opts.cursor) params.set(\"cursor\", opts.cursor);\n\t\telse params.set(\"from_height\", String(opts.fromHeight ?? 0));\n\t\tconst { items, next_cursor } = await this.getPage<\n\t\t\t\"transactions\",\n\t\t\tIndexTransactionRow\n\t\t>(\"/v1/index/transactions\", \"transactions\", params);\n\t\treturn { transactions: items, next_cursor };\n\t}\n\n\twalkBlocks(fromHeight: number, toHeight: number): Promise<IndexBlockRow[]> {\n\t\treturn this.walk<\"blocks\", IndexBlockRow>(\n\t\t\t\"/v1/index/blocks\",\n\t\t\t\"blocks\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t);\n\t}\n\n\t/** Lowest block height in [fromHeight, toHeight] with a matching event, or\n\t * null. One page, limit 1 — built for sparse-scan probes. */\n\tasync firstEventHeight(\n\t\teventType: string,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\tcontractId?: string,\n\t): Promise<number | null> {\n\t\tconst params = new URLSearchParams({\n\t\t\tevent_type: eventType,\n\t\t\tfrom_height: String(fromHeight),\n\t\t\tto_height: String(toHeight),\n\t\t\tlimit: \"1\",\n\t\t\t...(contractId ? { contract_id: contractId } : {}),\n\t\t});\n\t\tconst { items } = await this.getPage<\"events\", IndexEventRow>(\n\t\t\t\"/v1/index/events\",\n\t\t\t\"events\",\n\t\t\tparams,\n\t\t);\n\t\treturn items[0]?.block_height ?? null;\n\t}\n\n\twalkEvents(\n\t\teventType: string,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\t/** Join the submitting tx so each row carries `tx_*` — lets an event-only\n\t\t * subgraph skip walkTransactions and build `ctx.tx` from the event. */\n\t\twithTx = false,\n\t): Promise<IndexEventRow[]> {\n\t\treturn this.walk<\"events\", IndexEventRow>(\n\t\t\t\"/v1/index/events\",\n\t\t\t\"events\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t\t{\n\t\t\t\tevent_type: eventType,\n\t\t\t\t...(withTx ? { tx_context: \"true\" } : {}),\n\t\t\t},\n\t\t);\n\t}\n\n\twalkTransactions(\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t): Promise<IndexTransactionRow[]> {\n\t\treturn this.walk<\"transactions\", IndexTransactionRow>(\n\t\t\t\"/v1/index/transactions\",\n\t\t\t\"transactions\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t);\n\t}\n\n\t/** Canonical tip height from the Streams clock. */\n\tasync getStreamsTip(): Promise<number> {\n\t\tconst tip = await this.get<{ block_height: number }>(\n\t\t\t`${this.streamsBaseUrl}/v1/streams/tip`,\n\t\t\tthis.streamsApiKey,\n\t\t);\n\t\treturn Number(tip.block_height) || 0;\n\t}\n\n\t/**\n\t * Highest block height the Index data plane can serve (tip is inline in every\n\t * envelope). This is the data-availability bound — a consumer must not\n\t * process past it, even if the Streams clock is ahead.\n\t */\n\tasync getIndexTip(): Promise<number> {\n\t\tconst env = await this.get<{ tip: { block_height: number } }>(\n\t\t\t`${this.indexBaseUrl}/v1/index/blocks?limit=1`,\n\t\t\tthis.indexApiKey,\n\t\t);\n\t\treturn Number(env.tip?.block_height) || 0;\n\t}\n\n\t/** Reorgs since a resume token (wall-clock `detected_at`-keyed). */\n\tasync listReorgs(\n\t\tsince: string,\n\t): Promise<{ reorgs: StreamsReorgRow[]; next_since: string | null }> {\n\t\tconst params = new URLSearchParams({ since });\n\t\treturn this.get(\n\t\t\t`${this.streamsBaseUrl}/v1/streams/reorgs?${params}`,\n\t\t\tthis.streamsApiKey,\n\t\t);\n\t}\n}\n\n/** Decoder + subgraph processor client. One env contract; omits bearer when no key. */\nexport function createInternalIndexHttpClient(): IndexHttpClient {\n\tconst baseUrl = defaultInternalIndexBaseUrl();\n\treturn new IndexHttpClient({\n\t\tindexBaseUrl: baseUrl,\n\t\tstreamsBaseUrl: baseUrl,\n\t\tindexApiKey: defaultInternalIndexApiKey(),\n\t\tstreamsApiKey: defaultInternalStreamsApiKey(),\n\t});\n}\n"
|
|
6
|
+
"import {\n\tdefaultInternalIndexApiKey,\n\tdefaultInternalIndexBaseUrl,\n\tdefaultInternalStreamsApiKey,\n} from \"./index-internal-auth.ts\";\n\n/**\n * Low-level transport for the public Index (`/v1/index`) + Streams clock\n * (`/v1/streams`) HTTP APIs: cursor-paginated reads, tip, reorgs. Lives in\n * `shared` (a leaf both the SDK and the subgraph runtime depend on) so the wire\n * format has one home and no package cycle. The SDK's ergonomic client should\n * eventually consume these row types too (see the plan's convergence task).\n *\n * This is intentionally minimal — just the GETs the subgraph runtime's\n * PublicApiBlockSource needs. It is NOT the SDK's full client (walk/consume/\n * retries/auth resolution).\n */\n\nconst PAGE_LIMIT = 1000;\n\n// Transport resilience for the streams-index data plane. The api runs N>1\n// replicas behind Caddy; during a rolling deploy one replica is briefly\n// unreachable, surfacing as a thrown fetch (connection refused/reset) or a\n// Caddy 502/503/504 while it fails over. Retrying a few times with backoff\n// makes a single-replica recreate transparent to the subgraph-processor /\n// decoder — closing the processors-depend-on-api coupling.\nconst MAX_ATTEMPTS = 4;\nconst RETRY_BASE_MS = 150;\nconst RETRYABLE_STATUS = new Set([502, 503, 504]);\n\nconst delay = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms));\n\ntype Envelope<K extends string, T> = {\n\t[P in K]: T[];\n} & { next_cursor: string | null };\n\n// ── Index API wire shapes (single source of truth) ─────────────────────────\nexport type IndexBlockRow = {\n\tblock_height: number;\n\tblock_hash: string;\n\tparent_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\t/** Nakamoto StacksBlockId. Absent from pre-2026-07 API deployments. */\n\tindex_block_hash?: string | null;\n\tblock_time: string | null;\n};\n\ntype IndexEventCommon = {\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index?: number;\n\tevent_index: number;\n\tcontract_id: string | null;\n\t/** Submitting-tx context — present only when the read passed `tx_context=true`.\n\t * Lets a consumer build the tx for `ctx.tx` without a separate\n\t * walkTransactions (the ~37x reindex over-fetch; see indexing-speed plan). */\n\ttx_sender?: string | null;\n\ttx_type?: string | null;\n\ttx_status?: string | null;\n\ttx_contract_id?: string | null;\n\ttx_function_name?: string | null;\n};\n\nexport type IndexEventRow = IndexEventCommon &\n\t(\n\t\t| {\n\t\t\t\tevent_type: \"ft_transfer\" | \"ft_mint\" | \"ft_burn\";\n\t\t\t\tasset_identifier: string;\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tamount: string;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"nft_transfer\" | \"nft_mint\" | \"nft_burn\";\n\t\t\t\tasset_identifier: string;\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tvalue: string;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"stx_transfer\" | \"stx_mint\" | \"stx_burn\";\n\t\t\t\tsender?: string;\n\t\t\t\trecipient?: string;\n\t\t\t\tamount: string;\n\t\t\t\tmemo?: string | null;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"stx_lock\";\n\t\t\t\tsender: string;\n\t\t\t\tamount: string;\n\t\t\t\tpayload: { unlock_height: string | null };\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"print\";\n\t\t\t\tpayload: {\n\t\t\t\t\ttopic: string | null;\n\t\t\t\t\tvalue: unknown;\n\t\t\t\t\traw_value: string | null;\n\t\t\t\t};\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"nested_contract_call\";\n\t\t\t\tsender?: string | null;\n\t\t\t\tcaller: string;\n\t\t\t\tfunction_name: string;\n\t\t\t\tfunction_args?: unknown;\n\t\t\t\traw_result?: string | null;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"var_set\";\n\t\t\t\tvar_name: string;\n\t\t\t\traw_value?: string | null;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"map_set\" | \"map_insert\";\n\t\t\t\tmap: string;\n\t\t\t\traw_key?: string | null;\n\t\t\t\traw_value?: string | null;\n\t\t }\n\t\t| {\n\t\t\t\tevent_type: \"map_delete\";\n\t\t\t\tmap: string;\n\t\t\t\traw_key?: string | null;\n\t\t }\n\t);\n\nexport type IndexTransactionRow = {\n\ttx_id: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\tburn_block_height?: number | null;\n\ttx_index: number;\n\ttx_type: string;\n\tsender: string;\n\tstatus: string;\n\tcontract_call?: {\n\t\tcontract_id: string;\n\t\tfunction_name: string;\n\t\tfunction_args_hex?: string[] | null;\n\t\tresult_hex?: string | null;\n\t} | null;\n\tsmart_contract?: { contract_id: string | null } | null;\n};\n\nexport type StreamsReorgRow = {\n\tid: string;\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\tnew_canonical_tip: string;\n};\n\nexport type IndexHttpOptions = {\n\t/** Base URL for /v1/index (the decoded data plane). */\n\tindexBaseUrl: string;\n\t/** Bearer for /v1/index. Empty/unset omits the header. */\n\tindexApiKey?: string;\n\t/** Base URL for /v1/streams (the canonical clock). */\n\tstreamsBaseUrl: string;\n\t/** Bearer for /v1/streams. Empty/unset omits the header. */\n\tstreamsApiKey?: string;\n};\n\nexport class IndexHttpClient {\n\tprivate readonly indexBaseUrl: string;\n\tprivate readonly indexApiKey: string | undefined;\n\tprivate readonly streamsBaseUrl: string;\n\tprivate readonly streamsApiKey: string | undefined;\n\n\tconstructor(opts: IndexHttpOptions) {\n\t\tthis.indexBaseUrl = opts.indexBaseUrl.replace(/\\/+$/, \"\");\n\t\tthis.indexApiKey = opts.indexApiKey ?? defaultInternalIndexApiKey();\n\t\tthis.streamsBaseUrl = opts.streamsBaseUrl.replace(/\\/+$/, \"\");\n\t\tthis.streamsApiKey = opts.streamsApiKey;\n\t}\n\n\tprivate async get<T>(url: string, apiKey: string | undefined): Promise<T> {\n\t\t// Index reads are anon — omit the header entirely when no key is set, so\n\t\t// an empty key reads anonymously rather than 401-ing as an invalid bearer.\n\t\tconst headers: Record<string, string> = apiKey\n\t\t\t? { authorization: `Bearer ${apiKey}` }\n\t\t\t: {};\n\t\tlet lastErr: unknown;\n\t\tfor (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n\t\t\tlet res: Response;\n\t\t\ttry {\n\t\t\t\tres = await fetch(url, { headers });\n\t\t\t} catch (err) {\n\t\t\t\t// An explicit abort/cancel is intentional — surface it immediately\n\t\t\t\t// rather than burning the retry budget masking it as transient.\n\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") throw err;\n\t\t\t\t// Otherwise a transport-level failure (connection refused/reset) —\n\t\t\t\t// e.g. an api replica mid-recreate. Retry; the next attempt\n\t\t\t\t// round-robins to a healthy replica.\n\t\t\t\tlastErr = err;\n\t\t\t\tif (attempt >= MAX_ATTEMPTS) break;\n\t\t\t\tawait delay(RETRY_BASE_MS * 2 ** (attempt - 1));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!res.ok) {\n\t\t\t\tif (RETRYABLE_STATUS.has(res.status) && attempt < MAX_ATTEMPTS) {\n\t\t\t\t\t// Drain the body so the connection can be reused, then back off.\n\t\t\t\t\tawait res.text().catch(() => {});\n\t\t\t\t\tawait delay(RETRY_BASE_MS * 2 ** (attempt - 1));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`GET ${url} → ${res.status} ${await res.text()}`);\n\t\t\t}\n\t\t\treturn (await res.json()) as T;\n\t\t}\n\t\tthrow (\n\t\t\tlastErr ?? new Error(`GET ${url} failed after ${MAX_ATTEMPTS} attempts`)\n\t\t);\n\t}\n\n\t/** Fetch a single cursor page of an Index collection. */\n\tprivate async getPage<K extends string, T>(\n\t\tpath: string,\n\t\tkey: K,\n\t\tparams: URLSearchParams,\n\t): Promise<{ items: T[]; next_cursor: string | null }> {\n\t\tconst env: Envelope<K, T> = await this.get(\n\t\t\t`${this.indexBaseUrl}${path}?${params}`,\n\t\t\tthis.indexApiKey,\n\t\t);\n\t\treturn { items: env[key], next_cursor: env.next_cursor };\n\t}\n\n\t/** Drain a cursor-paginated Index collection over [fromHeight, toHeight]. */\n\tprivate async walk<K extends string, T>(\n\t\tpath: string,\n\t\tkey: K,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\textraParams: Record<string, string> = {},\n\t): Promise<T[]> {\n\t\tconst out: T[] = [];\n\t\tlet cursor: string | null = null;\n\t\tdo {\n\t\t\tconst params = new URLSearchParams({\n\t\t\t\tto_height: String(toHeight),\n\t\t\t\tlimit: String(PAGE_LIMIT),\n\t\t\t\t...extraParams,\n\t\t\t});\n\t\t\t// from_height and cursor are mutually exclusive — anchor the first page\n\t\t\t// by height, then page forward by cursor only.\n\t\t\tif (cursor) params.set(\"cursor\", cursor);\n\t\t\telse params.set(\"from_height\", String(fromHeight));\n\t\t\tconst { items, next_cursor } = await this.getPage<K, T>(\n\t\t\t\tpath,\n\t\t\t\tkey,\n\t\t\t\tparams,\n\t\t\t);\n\t\t\tout.push(...items);\n\t\t\tcursor = next_cursor;\n\t\t} while (cursor);\n\t\treturn out;\n\t}\n\n\t/**\n\t * Fetch ONE page of contract-call transactions filtered to `contractId`.\n\t * Unlike walk(), this does NOT drain — the caller pages by feeding back\n\t * next_cursor — so a sparse high-volume filter (e.g. a single contract over\n\t * all history) costs one request per batch, not O(all-history) per tick.\n\t * `cursor` is exclusive (rows strictly after it); on the first call pass\n\t * `fromHeight` to anchor the backfill start instead.\n\t */\n\tasync fetchContractCalls(\n\t\tcontractId: string,\n\t\topts: {\n\t\t\ttoHeight: number;\n\t\t\tcursor?: string | null;\n\t\t\tfromHeight?: number;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<{\n\t\ttransactions: IndexTransactionRow[];\n\t\tnext_cursor: string | null;\n\t}> {\n\t\tconst params = new URLSearchParams({\n\t\t\tto_height: String(opts.toHeight),\n\t\t\tlimit: String(opts.limit ?? PAGE_LIMIT),\n\t\t\tcontract_id: contractId,\n\t\t});\n\t\tif (opts.cursor) params.set(\"cursor\", opts.cursor);\n\t\telse params.set(\"from_height\", String(opts.fromHeight ?? 0));\n\t\tconst { items, next_cursor } = await this.getPage<\n\t\t\t\"transactions\",\n\t\t\tIndexTransactionRow\n\t\t>(\"/v1/index/transactions\", \"transactions\", params);\n\t\treturn { transactions: items, next_cursor };\n\t}\n\n\twalkBlocks(fromHeight: number, toHeight: number): Promise<IndexBlockRow[]> {\n\t\treturn this.walk<\"blocks\", IndexBlockRow>(\n\t\t\t\"/v1/index/blocks\",\n\t\t\t\"blocks\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t);\n\t}\n\n\t/** Lowest block height in [fromHeight, toHeight] with a matching event, or\n\t * null. One page, limit 1 — built for sparse-scan probes. */\n\tasync firstEventHeight(\n\t\teventType: string,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\tcontractId?: string,\n\t): Promise<number | null> {\n\t\tconst params = new URLSearchParams({\n\t\t\tevent_type: eventType,\n\t\t\tfrom_height: String(fromHeight),\n\t\t\tto_height: String(toHeight),\n\t\t\tlimit: \"1\",\n\t\t\t...(contractId ? { contract_id: contractId } : {}),\n\t\t});\n\t\tconst { items } = await this.getPage<\"events\", IndexEventRow>(\n\t\t\t\"/v1/index/events\",\n\t\t\t\"events\",\n\t\t\tparams,\n\t\t);\n\t\treturn items[0]?.block_height ?? null;\n\t}\n\n\twalkEvents(\n\t\teventType: string,\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t\t/** Join the submitting tx so each row carries `tx_*` — lets an event-only\n\t\t * subgraph skip walkTransactions and build `ctx.tx` from the event. */\n\t\twithTx = false,\n\t): Promise<IndexEventRow[]> {\n\t\treturn this.walk<\"events\", IndexEventRow>(\n\t\t\t\"/v1/index/events\",\n\t\t\t\"events\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t\t{\n\t\t\t\tevent_type: eventType,\n\t\t\t\t...(withTx ? { tx_context: \"true\" } : {}),\n\t\t\t},\n\t\t);\n\t}\n\n\twalkTransactions(\n\t\tfromHeight: number,\n\t\ttoHeight: number,\n\t): Promise<IndexTransactionRow[]> {\n\t\treturn this.walk<\"transactions\", IndexTransactionRow>(\n\t\t\t\"/v1/index/transactions\",\n\t\t\t\"transactions\",\n\t\t\tfromHeight,\n\t\t\ttoHeight,\n\t\t);\n\t}\n\n\t/** Canonical tip height from the Streams clock. */\n\tasync getStreamsTip(): Promise<number> {\n\t\tconst tip = await this.get<{ block_height: number }>(\n\t\t\t`${this.streamsBaseUrl}/v1/streams/tip`,\n\t\t\tthis.streamsApiKey,\n\t\t);\n\t\treturn Number(tip.block_height) || 0;\n\t}\n\n\t/**\n\t * Highest block height the Index data plane can serve (tip is inline in every\n\t * envelope). This is the data-availability bound — a consumer must not\n\t * process past it, even if the Streams clock is ahead.\n\t */\n\tasync getIndexTip(): Promise<number> {\n\t\tconst env = await this.getIndexTipEnvelope();\n\t\treturn Number(env.tip?.block_height) || 0;\n\t}\n\n\t/** Ingest tip. VM rows land with the block; decoded `block_height` can lag. */\n\tasync getIndexSourceTip(): Promise<number> {\n\t\tconst env = await this.getIndexTipEnvelope();\n\t\treturn Number(env.tip?.source_block_height ?? env.tip?.block_height) || 0;\n\t}\n\n\tprivate async getIndexTipEnvelope(): Promise<{\n\t\ttip: { block_height: number; source_block_height?: number };\n\t}> {\n\t\treturn this.get<{\n\t\t\ttip: { block_height: number; source_block_height?: number };\n\t\t}>(`${this.indexBaseUrl}/v1/index/blocks?limit=1`, this.indexApiKey);\n\t}\n\n\t/** Reorgs since a resume token (wall-clock `detected_at`-keyed). */\n\tasync listReorgs(\n\t\tsince: string,\n\t): Promise<{ reorgs: StreamsReorgRow[]; next_since: string | null }> {\n\t\tconst params = new URLSearchParams({ since });\n\t\treturn this.get(\n\t\t\t`${this.streamsBaseUrl}/v1/streams/reorgs?${params}`,\n\t\t\tthis.streamsApiKey,\n\t\t);\n\t}\n}\n\n/** Decoder + subgraph processor client. One env contract; omits bearer when no key. */\nexport function createInternalIndexHttpClient(): IndexHttpClient {\n\tconst baseUrl = defaultInternalIndexBaseUrl();\n\treturn new IndexHttpClient({\n\t\tindexBaseUrl: baseUrl,\n\t\tstreamsBaseUrl: baseUrl,\n\t\tindexApiKey: defaultInternalIndexApiKey(),\n\t\tstreamsApiKey: defaultInternalStreamsApiKey(),\n\t});\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAaO,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AAE1C,IAAM,kCAAkC;AAExC,IAAM,mCACL;AAED,IAAM,iCACL;AAEM,SAAS,0BAA0B,CACzC,MAAyB,QAAQ,KACZ;AAAA,EACrB,MAAM,WAAW,IAAI,wBAAwB,KAAK;AAAA,EAClD,IAAI;AAAA,IAAU,OAAO;AAAA,EACrB,MAAM,WAAW,IAAI,gBAAgB,KAAK;AAAA,EAC1C,IAAI;AAAA,IAAU,OAAO;AAAA,EACrB;AAAA;AAGM,SAAS,4BAA4B,CAC3C,MAAyB,QAAQ,KACZ;AAAA,EACrB,MAAM,WAAW,IAAI,0BAA0B,KAAK;AAAA,EACpD,IAAI;AAAA,IAAU,OAAO;AAAA,EACrB,MAAM,WAAW,IAAI,gBAAgB,KAAK;AAAA,EAC1C,IAAI;AAAA,IAAU,OAAO;AAAA,EACrB;AAAA;AAgBM,SAAS,0BAA0B,CACzC,MAAyB,QAAQ,KACxB;AAAA,EACT,MAAM,MAAM,2BAA2B,GAAG;AAAA,EAC1C,IAAI,CAAC;AAAA,IAAK,MAAM,IAAI,MAAM,8BAA8B;AAAA,EACxD,OAAO;AAAA;AAID,SAAS,4BAA4B,CAC3C,MAAyB,QAAQ,KACxB;AAAA,EACT,MAAM,MAAM,6BAA6B,GAAG;AAAA,EAC5C,IAAI,CAAC;AAAA,IAAK,MAAM,IAAI,MAAM,gCAAgC;AAAA,EAC1D,OAAO;AAAA;AAID,SAAS,2BAA2B,GAAW;AAAA,EACrD,OACC,QAAQ,IAAI,0BACZ,QAAQ,IAAI,mBACZ;AAAA;;;AC7DF,IAAM,aAAa;AAQnB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC;AAEhD,IAAM,QAAQ,CAAC,OACd,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "494275043F5C0F7B64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|