@secondlayer/shared 11.8.0 → 11.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/archive/range-digest.d.ts +31 -0
- package/dist/src/archive/semantic-digest-builder.d.ts +31 -0
- package/dist/src/coverage/index.d.ts +31 -0
- package/dist/src/coverage/index.js +13 -1
- package/dist/src/coverage/index.js.map +3 -3
- package/dist/src/db/index.d.ts +36 -1
- package/dist/src/db/index.js +2 -1
- package/dist/src/db/index.js.map +3 -3
- package/dist/src/db/queries/chain-reorgs.d.ts +31 -0
- package/dist/src/db/queries/chain-reorgs.js +2 -1
- package/dist/src/db/queries/chain-reorgs.js.map +3 -3
- package/dist/src/db/queries/contracts.d.ts +31 -0
- package/dist/src/db/queries/instance.d.ts +31 -0
- package/dist/src/db/queries/integrity.d.ts +31 -0
- package/dist/src/db/queries/subgraph-gaps.d.ts +31 -0
- package/dist/src/db/queries/subgraph-operations.d.ts +31 -0
- package/dist/src/db/queries/subgraphs.d.ts +31 -0
- package/dist/src/db/queries/sync-scope.d.ts +31 -0
- package/dist/src/db/queries/webhooks.d.ts +31 -0
- package/dist/src/db/schema.d.ts +35 -1
- package/dist/src/errors.d.ts +3 -3
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index-http.js +2 -2
- package/dist/src/index-http.js.map +3 -3
- package/dist/src/index-internal-auth.d.ts +3 -6
- package/dist/src/index-internal-auth.js +2 -2
- package/dist/src/index-internal-auth.js.map +3 -3
- package/dist/src/index.d.ts +56 -5
- package/dist/src/index.js +60 -5
- package/dist/src/index.js.map +7 -7
- package/dist/src/node/local-client.d.ts +31 -0
- package/dist/src/schemas/index.d.ts +8 -1
- package/dist/src/schemas/index.js +46 -5
- package/dist/src/schemas/index.js.map +4 -4
- package/dist/src/schemas/subgraphs.d.ts +1 -1
- package/dist/src/schemas/subgraphs.js.map +1 -1
- package/dist/src/schemas/webhooks.d.ts +19 -1
- package/dist/src/schemas/webhooks.js +51 -6
- package/dist/src/schemas/webhooks.js.map +3 -3
- package/migrations/0137_webhook_outbox_last_error.ts +27 -0
- package/migrations/0138_usage_ledger.ts +46 -0
- package/migrations/0139_webhook_outbox_block_time.ts +28 -0
- package/package.json +1 -1
|
@@ -782,6 +782,7 @@ interface Database {
|
|
|
782
782
|
coverage_segments: CoverageSegmentsTable;
|
|
783
783
|
stage_failures: StageFailuresTable;
|
|
784
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
usage_ledger: UsageLedgerTable;
|
|
785
786
|
waitlists: WaitlistsTable;
|
|
786
787
|
waitlist_signups: WaitlistSignupsTable;
|
|
787
788
|
}
|
|
@@ -826,6 +827,27 @@ interface ArchiveFetchesTable {
|
|
|
826
827
|
via_allowance: Generated<boolean>;
|
|
827
828
|
charged_at: Generated<Date>;
|
|
828
829
|
}
|
|
830
|
+
/**
|
|
831
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
832
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
833
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
834
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
835
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
836
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
837
|
+
* top-up (`unit: "topup"`).
|
|
838
|
+
*/
|
|
839
|
+
interface UsageLedgerTable {
|
|
840
|
+
id: Generated<string>;
|
|
841
|
+
account_id: string;
|
|
842
|
+
unit: string;
|
|
843
|
+
quantity: string | number | bigint;
|
|
844
|
+
usd_micros: string | number | bigint;
|
|
845
|
+
debited: Generated<boolean>;
|
|
846
|
+
source: string;
|
|
847
|
+
idempotency_key: string;
|
|
848
|
+
occurred_at: Generated<Date>;
|
|
849
|
+
recorded_at: Generated<Date>;
|
|
850
|
+
}
|
|
829
851
|
type WebhookStatus = "active" | "paused" | "error";
|
|
830
852
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
831
853
|
* `chain` reacts to raw chain events matched directly off the Index/Streams
|
|
@@ -884,10 +906,19 @@ interface WebhookOutboxTable {
|
|
|
884
906
|
next_attempt_at: Generated<Date>;
|
|
885
907
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
886
908
|
is_replay: Generated<boolean>;
|
|
909
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
910
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
911
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
912
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
913
|
+
block_time: Date | null;
|
|
887
914
|
delivered_at: Date | null;
|
|
888
915
|
failed_at: Date | null;
|
|
889
916
|
locked_by: string | null;
|
|
890
917
|
locked_until: Date | null;
|
|
918
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
919
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
920
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
921
|
+
last_error: string | null;
|
|
891
922
|
created_at: Generated<Date>;
|
|
892
923
|
}
|
|
893
924
|
interface WebhookDeliveriesTable {
|
|
@@ -782,6 +782,7 @@ interface Database {
|
|
|
782
782
|
coverage_segments: CoverageSegmentsTable;
|
|
783
783
|
stage_failures: StageFailuresTable;
|
|
784
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
usage_ledger: UsageLedgerTable;
|
|
785
786
|
waitlists: WaitlistsTable;
|
|
786
787
|
waitlist_signups: WaitlistSignupsTable;
|
|
787
788
|
}
|
|
@@ -826,6 +827,27 @@ interface ArchiveFetchesTable {
|
|
|
826
827
|
via_allowance: Generated<boolean>;
|
|
827
828
|
charged_at: Generated<Date>;
|
|
828
829
|
}
|
|
830
|
+
/**
|
|
831
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
832
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
833
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
834
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
835
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
836
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
837
|
+
* top-up (`unit: "topup"`).
|
|
838
|
+
*/
|
|
839
|
+
interface UsageLedgerTable {
|
|
840
|
+
id: Generated<string>;
|
|
841
|
+
account_id: string;
|
|
842
|
+
unit: string;
|
|
843
|
+
quantity: string | number | bigint;
|
|
844
|
+
usd_micros: string | number | bigint;
|
|
845
|
+
debited: Generated<boolean>;
|
|
846
|
+
source: string;
|
|
847
|
+
idempotency_key: string;
|
|
848
|
+
occurred_at: Generated<Date>;
|
|
849
|
+
recorded_at: Generated<Date>;
|
|
850
|
+
}
|
|
829
851
|
type WebhookStatus = "active" | "paused" | "error";
|
|
830
852
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
831
853
|
* `chain` reacts to raw chain events matched directly off the Index/Streams
|
|
@@ -884,10 +906,19 @@ interface WebhookOutboxTable {
|
|
|
884
906
|
next_attempt_at: Generated<Date>;
|
|
885
907
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
886
908
|
is_replay: Generated<boolean>;
|
|
909
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
910
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
911
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
912
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
913
|
+
block_time: Date | null;
|
|
887
914
|
delivered_at: Date | null;
|
|
888
915
|
failed_at: Date | null;
|
|
889
916
|
locked_by: string | null;
|
|
890
917
|
locked_until: Date | null;
|
|
918
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
919
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
920
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
921
|
+
last_error: string | null;
|
|
891
922
|
created_at: Generated<Date>;
|
|
892
923
|
}
|
|
893
924
|
interface WebhookDeliveriesTable {
|
|
@@ -782,6 +782,7 @@ interface Database {
|
|
|
782
782
|
coverage_segments: CoverageSegmentsTable;
|
|
783
783
|
stage_failures: StageFailuresTable;
|
|
784
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
usage_ledger: UsageLedgerTable;
|
|
785
786
|
waitlists: WaitlistsTable;
|
|
786
787
|
waitlist_signups: WaitlistSignupsTable;
|
|
787
788
|
}
|
|
@@ -826,6 +827,27 @@ interface ArchiveFetchesTable {
|
|
|
826
827
|
via_allowance: Generated<boolean>;
|
|
827
828
|
charged_at: Generated<Date>;
|
|
828
829
|
}
|
|
830
|
+
/**
|
|
831
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
832
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
833
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
834
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
835
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
836
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
837
|
+
* top-up (`unit: "topup"`).
|
|
838
|
+
*/
|
|
839
|
+
interface UsageLedgerTable {
|
|
840
|
+
id: Generated<string>;
|
|
841
|
+
account_id: string;
|
|
842
|
+
unit: string;
|
|
843
|
+
quantity: string | number | bigint;
|
|
844
|
+
usd_micros: string | number | bigint;
|
|
845
|
+
debited: Generated<boolean>;
|
|
846
|
+
source: string;
|
|
847
|
+
idempotency_key: string;
|
|
848
|
+
occurred_at: Generated<Date>;
|
|
849
|
+
recorded_at: Generated<Date>;
|
|
850
|
+
}
|
|
829
851
|
type SubgraphOperation = Selectable<SubgraphOperationsTable>;
|
|
830
852
|
type WebhookStatus = "active" | "paused" | "error";
|
|
831
853
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
@@ -885,10 +907,19 @@ interface WebhookOutboxTable {
|
|
|
885
907
|
next_attempt_at: Generated<Date>;
|
|
886
908
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
887
909
|
is_replay: Generated<boolean>;
|
|
910
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
911
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
912
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
913
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
914
|
+
block_time: Date | null;
|
|
888
915
|
delivered_at: Date | null;
|
|
889
916
|
failed_at: Date | null;
|
|
890
917
|
locked_by: string | null;
|
|
891
918
|
locked_until: Date | null;
|
|
919
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
920
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
921
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
922
|
+
last_error: string | null;
|
|
892
923
|
created_at: Generated<Date>;
|
|
893
924
|
}
|
|
894
925
|
interface WebhookDeliveriesTable {
|
|
@@ -782,6 +782,7 @@ interface Database {
|
|
|
782
782
|
coverage_segments: CoverageSegmentsTable;
|
|
783
783
|
stage_failures: StageFailuresTable;
|
|
784
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
usage_ledger: UsageLedgerTable;
|
|
785
786
|
waitlists: WaitlistsTable;
|
|
786
787
|
waitlist_signups: WaitlistSignupsTable;
|
|
787
788
|
}
|
|
@@ -826,6 +827,27 @@ interface ArchiveFetchesTable {
|
|
|
826
827
|
via_allowance: Generated<boolean>;
|
|
827
828
|
charged_at: Generated<Date>;
|
|
828
829
|
}
|
|
830
|
+
/**
|
|
831
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
832
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
833
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
834
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
835
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
836
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
837
|
+
* top-up (`unit: "topup"`).
|
|
838
|
+
*/
|
|
839
|
+
interface UsageLedgerTable {
|
|
840
|
+
id: Generated<string>;
|
|
841
|
+
account_id: string;
|
|
842
|
+
unit: string;
|
|
843
|
+
quantity: string | number | bigint;
|
|
844
|
+
usd_micros: string | number | bigint;
|
|
845
|
+
debited: Generated<boolean>;
|
|
846
|
+
source: string;
|
|
847
|
+
idempotency_key: string;
|
|
848
|
+
occurred_at: Generated<Date>;
|
|
849
|
+
recorded_at: Generated<Date>;
|
|
850
|
+
}
|
|
829
851
|
type Subgraph = Selectable<SubgraphsTable>;
|
|
830
852
|
type WebhookStatus = "active" | "paused" | "error";
|
|
831
853
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
@@ -885,10 +907,19 @@ interface WebhookOutboxTable {
|
|
|
885
907
|
next_attempt_at: Generated<Date>;
|
|
886
908
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
887
909
|
is_replay: Generated<boolean>;
|
|
910
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
911
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
912
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
913
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
914
|
+
block_time: Date | null;
|
|
888
915
|
delivered_at: Date | null;
|
|
889
916
|
failed_at: Date | null;
|
|
890
917
|
locked_by: string | null;
|
|
891
918
|
locked_until: Date | null;
|
|
919
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
920
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
921
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
922
|
+
last_error: string | null;
|
|
892
923
|
created_at: Generated<Date>;
|
|
893
924
|
}
|
|
894
925
|
interface WebhookDeliveriesTable {
|
|
@@ -792,6 +792,7 @@ interface Database {
|
|
|
792
792
|
coverage_segments: CoverageSegmentsTable;
|
|
793
793
|
stage_failures: StageFailuresTable;
|
|
794
794
|
archive_fetches: ArchiveFetchesTable;
|
|
795
|
+
usage_ledger: UsageLedgerTable;
|
|
795
796
|
waitlists: WaitlistsTable;
|
|
796
797
|
waitlist_signups: WaitlistSignupsTable;
|
|
797
798
|
}
|
|
@@ -836,6 +837,27 @@ interface ArchiveFetchesTable {
|
|
|
836
837
|
via_allowance: Generated<boolean>;
|
|
837
838
|
charged_at: Generated<Date>;
|
|
838
839
|
}
|
|
840
|
+
/**
|
|
841
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
842
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
843
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
844
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
845
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
846
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
847
|
+
* top-up (`unit: "topup"`).
|
|
848
|
+
*/
|
|
849
|
+
interface UsageLedgerTable {
|
|
850
|
+
id: Generated<string>;
|
|
851
|
+
account_id: string;
|
|
852
|
+
unit: string;
|
|
853
|
+
quantity: string | number | bigint;
|
|
854
|
+
usd_micros: string | number | bigint;
|
|
855
|
+
debited: Generated<boolean>;
|
|
856
|
+
source: string;
|
|
857
|
+
idempotency_key: string;
|
|
858
|
+
occurred_at: Generated<Date>;
|
|
859
|
+
recorded_at: Generated<Date>;
|
|
860
|
+
}
|
|
839
861
|
type WebhookStatus = "active" | "paused" | "error";
|
|
840
862
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
841
863
|
* `chain` reacts to raw chain events matched directly off the Index/Streams
|
|
@@ -894,10 +916,19 @@ interface WebhookOutboxTable {
|
|
|
894
916
|
next_attempt_at: Generated<Date>;
|
|
895
917
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
896
918
|
is_replay: Generated<boolean>;
|
|
919
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
920
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
921
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
922
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
923
|
+
block_time: Date | null;
|
|
897
924
|
delivered_at: Date | null;
|
|
898
925
|
failed_at: Date | null;
|
|
899
926
|
locked_by: string | null;
|
|
900
927
|
locked_until: Date | null;
|
|
928
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
929
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
930
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
931
|
+
last_error: string | null;
|
|
901
932
|
created_at: Generated<Date>;
|
|
902
933
|
}
|
|
903
934
|
interface WebhookDeliveriesTable {
|
|
@@ -782,6 +782,7 @@ interface Database {
|
|
|
782
782
|
coverage_segments: CoverageSegmentsTable;
|
|
783
783
|
stage_failures: StageFailuresTable;
|
|
784
784
|
archive_fetches: ArchiveFetchesTable;
|
|
785
|
+
usage_ledger: UsageLedgerTable;
|
|
785
786
|
waitlists: WaitlistsTable;
|
|
786
787
|
waitlist_signups: WaitlistSignupsTable;
|
|
787
788
|
}
|
|
@@ -826,6 +827,27 @@ interface ArchiveFetchesTable {
|
|
|
826
827
|
via_allowance: Generated<boolean>;
|
|
827
828
|
charged_at: Generated<Date>;
|
|
828
829
|
}
|
|
830
|
+
/**
|
|
831
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
832
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
833
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
834
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
835
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
836
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
837
|
+
* top-up (`unit: "topup"`).
|
|
838
|
+
*/
|
|
839
|
+
interface UsageLedgerTable {
|
|
840
|
+
id: Generated<string>;
|
|
841
|
+
account_id: string;
|
|
842
|
+
unit: string;
|
|
843
|
+
quantity: string | number | bigint;
|
|
844
|
+
usd_micros: string | number | bigint;
|
|
845
|
+
debited: Generated<boolean>;
|
|
846
|
+
source: string;
|
|
847
|
+
idempotency_key: string;
|
|
848
|
+
occurred_at: Generated<Date>;
|
|
849
|
+
recorded_at: Generated<Date>;
|
|
850
|
+
}
|
|
829
851
|
type WebhookStatus = "active" | "paused" | "error";
|
|
830
852
|
/** Polymorphic webhook mode: `subgraph` reacts to processed table rows;
|
|
831
853
|
* `chain` reacts to raw chain events matched directly off the Index/Streams
|
|
@@ -885,10 +907,19 @@ interface WebhookOutboxTable {
|
|
|
885
907
|
next_attempt_at: Generated<Date>;
|
|
886
908
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
887
909
|
is_replay: Generated<boolean>;
|
|
910
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
911
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
912
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
913
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
914
|
+
block_time: Date | null;
|
|
888
915
|
delivered_at: Date | null;
|
|
889
916
|
failed_at: Date | null;
|
|
890
917
|
locked_by: string | null;
|
|
891
918
|
locked_until: Date | null;
|
|
919
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
920
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
921
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
922
|
+
last_error: string | null;
|
|
892
923
|
created_at: Generated<Date>;
|
|
893
924
|
}
|
|
894
925
|
interface WebhookDeliveriesTable {
|
package/dist/src/db/schema.d.ts
CHANGED
|
@@ -781,6 +781,7 @@ interface Database {
|
|
|
781
781
|
coverage_segments: CoverageSegmentsTable;
|
|
782
782
|
stage_failures: StageFailuresTable;
|
|
783
783
|
archive_fetches: ArchiveFetchesTable;
|
|
784
|
+
usage_ledger: UsageLedgerTable;
|
|
784
785
|
waitlists: WaitlistsTable;
|
|
785
786
|
waitlist_signups: WaitlistSignupsTable;
|
|
786
787
|
}
|
|
@@ -834,6 +835,30 @@ interface ArchiveFetchesTable {
|
|
|
834
835
|
type ArchiveFetch = Selectable<ArchiveFetchesTable>;
|
|
835
836
|
type InsertArchiveFetch = Insertable<ArchiveFetchesTable>;
|
|
836
837
|
type UpdateArchiveFetch = Updateable<ArchiveFetchesTable>;
|
|
838
|
+
/**
|
|
839
|
+
* One metered ledger for every billable unit (archive partitions, hosted
|
|
840
|
+
* Index/Streams rows, and future hosted-stack meters). Append-only, written
|
|
841
|
+
* only by `meter()`. `idempotency_key` is UNIQUE so a retried submission
|
|
842
|
+
* no-ops instead of double-charging. `debited` is false when the balance
|
|
843
|
+
* (or a spend cap) refused the charge — the row still exists so the gap is
|
|
844
|
+
* visible, never silently dropped. `usd_micros` is negative for a Stripe
|
|
845
|
+
* top-up (`unit: "topup"`).
|
|
846
|
+
*/
|
|
847
|
+
interface UsageLedgerTable {
|
|
848
|
+
id: Generated<string>;
|
|
849
|
+
account_id: string;
|
|
850
|
+
unit: string;
|
|
851
|
+
quantity: string | number | bigint;
|
|
852
|
+
usd_micros: string | number | bigint;
|
|
853
|
+
debited: Generated<boolean>;
|
|
854
|
+
source: string;
|
|
855
|
+
idempotency_key: string;
|
|
856
|
+
occurred_at: Generated<Date>;
|
|
857
|
+
recorded_at: Generated<Date>;
|
|
858
|
+
}
|
|
859
|
+
type UsageLedgerRow = Selectable<UsageLedgerTable>;
|
|
860
|
+
type InsertUsageLedgerRow = Insertable<UsageLedgerTable>;
|
|
861
|
+
type UpdateUsageLedgerRow = Updateable<UsageLedgerTable>;
|
|
837
862
|
type Block = Selectable<BlocksTable>;
|
|
838
863
|
type InsertBlock = Insertable<BlocksTable>;
|
|
839
864
|
type UpdateBlock = Updateable<BlocksTable>;
|
|
@@ -934,10 +959,19 @@ interface WebhookOutboxTable {
|
|
|
934
959
|
next_attempt_at: Generated<Date>;
|
|
935
960
|
status: ColumnType<OutboxStatus, OutboxStatus | undefined, OutboxStatus>;
|
|
936
961
|
is_replay: Generated<boolean>;
|
|
962
|
+
/** The chain block_time of the matched event/tx. Null for rows written
|
|
963
|
+
* before this column existed, and for the settlement scan path (not yet
|
|
964
|
+
* wired). Lets `delivered_at - block_time` measure end-to-end webhook
|
|
965
|
+
* latency without a join to SOURCE-plane `blocks`. */
|
|
966
|
+
block_time: Date | null;
|
|
937
967
|
delivered_at: Date | null;
|
|
938
968
|
failed_at: Date | null;
|
|
939
969
|
locked_by: string | null;
|
|
940
970
|
locked_until: Date | null;
|
|
971
|
+
/** Set when a reorg marks an in-flight row `dead` instead of retrying it
|
|
972
|
+
* into an orphaned fork. Null otherwise — delivery failures track their
|
|
973
|
+
* history on `webhooks.last_error`, not per-row. */
|
|
974
|
+
last_error: string | null;
|
|
941
975
|
created_at: Generated<Date>;
|
|
942
976
|
}
|
|
943
977
|
type WebhookOutbox = Selectable<WebhookOutboxTable>;
|
|
@@ -994,4 +1028,4 @@ interface WaitlistSignupsTable {
|
|
|
994
1028
|
type Waitlist = Selectable<WaitlistsTable>;
|
|
995
1029
|
type WaitlistSignup = Selectable<WaitlistSignupsTable>;
|
|
996
1030
|
type InsertWaitlistSignup = Insertable<WaitlistSignupsTable>;
|
|
997
|
-
export { Account, AccountCredits, AccountCreditsTable, AccountSpendCap, AccountSpendCapsTable, AccountsTable, ApiKey, ApiKeysTable, ArchiveFetch, ArchiveFetchesTable, Block, BlocksTable, BnsMarketplaceAction, BnsMarketplaceEventsTable, BnsNameEventTopic, BnsNameEventsTable, BnsNamesTable, BnsNamespaceEventStatus, BnsNamespaceEventsTable, BnsNamespacesTable, BurnBlockRewardSlotsTable, BurnBlockRewardsTable, ChainReadCacheTable, ChainReorgsTable, Contract, ContractsTable, CoverageSegmentsTable, Database, DeadLetterEventsTable, DecodedEventsTable, DecoderCheckpointsTable, Event, EventsArchiveTable, EventsTable, FailureClass, FailureUnit, IndexProgress, IndexProgressTable, InsertAccount, InsertAccountCredits, InsertAccountSpendCap, InsertApiKey, InsertArchiveFetch, InsertBlock, InsertContract, InsertEvent, InsertIndexProgress, InsertMagicLink, InsertMempoolTransaction, InsertSession, InsertSubgraph, InsertSubgraphGap, InsertSubgraphHealthSnapshot, InsertSubgraphOperation, InsertTransaction, InsertVmEvent, InsertWaitlistSignup, InsertWebhook, InsertWebhookDelivery, InsertWebhookOutbox, InstancesTable, MagicLink, MagicLinksTable, MempoolTransaction, MempoolTransactionsTable, NativeClock, ObserverJournalStatus, ObserverJournalTable, OutboxStatus, PendingForkBlocksTable, Pox4CallsTable, Pox4FunctionName, Pox5EventTopic, Pox5EventsTable, ProcessedStripeEventsTable, RepairMode, RetryState, RunStatus, SbtcEventTopic, SbtcEventsTable, SbtcSettlementsTable, SbtcTokenEventType, SbtcTokenEventsTable, ServiceHeartbeatsTable, Session, SessionsTable, StageBlockReceiptsTable, StageFailuresTable, StageKind, StageRegistryTable, StageRunsTable, Subgraph, SubgraphGap, SubgraphGapsTable, SubgraphHealthSnapshot, SubgraphHealthSnapshotsTable, SubgraphOperation, SubgraphOperationKind, SubgraphOperationStatus, SubgraphOperationsTable, SubgraphProcessingStatsTable, SubgraphViolationsTable, SubgraphsTable, SyncScopesTable, Transaction, TransactionsArchiveTable, TransactionsTable, TriggerEvaluatorState, TriggerEvaluatorStateTable, UpdateAccountCredits, UpdateAccountSpendCap, UpdateApiKey, UpdateArchiveFetch, UpdateBlock, UpdateContract, UpdateEvent, UpdateIndexProgress, UpdateSubgraph, UpdateSubgraphOperation, UpdateTransaction, UpdateVmEvent, UpdateWebhook, UpdateWebhookOutbox, VmEvent, VmEventsArchiveTable, VmEventsTable, Waitlist, WaitlistSignup, WaitlistSignupsTable, WaitlistsTable, Webhook, WebhookDeliveriesTable, WebhookDelivery, WebhookFormat, WebhookKind, WebhookOutbox, WebhookOutboxTable, WebhookRuntime, WebhookStatus, WebhooksTable };
|
|
1031
|
+
export { Account, AccountCredits, AccountCreditsTable, AccountSpendCap, AccountSpendCapsTable, AccountsTable, ApiKey, ApiKeysTable, ArchiveFetch, ArchiveFetchesTable, Block, BlocksTable, BnsMarketplaceAction, BnsMarketplaceEventsTable, BnsNameEventTopic, BnsNameEventsTable, BnsNamesTable, BnsNamespaceEventStatus, BnsNamespaceEventsTable, BnsNamespacesTable, BurnBlockRewardSlotsTable, BurnBlockRewardsTable, ChainReadCacheTable, ChainReorgsTable, Contract, ContractsTable, CoverageSegmentsTable, Database, DeadLetterEventsTable, DecodedEventsTable, DecoderCheckpointsTable, Event, EventsArchiveTable, EventsTable, FailureClass, FailureUnit, IndexProgress, IndexProgressTable, InsertAccount, InsertAccountCredits, InsertAccountSpendCap, InsertApiKey, InsertArchiveFetch, InsertBlock, InsertContract, InsertEvent, InsertIndexProgress, InsertMagicLink, InsertMempoolTransaction, InsertSession, InsertSubgraph, InsertSubgraphGap, InsertSubgraphHealthSnapshot, InsertSubgraphOperation, InsertTransaction, InsertUsageLedgerRow, InsertVmEvent, InsertWaitlistSignup, InsertWebhook, InsertWebhookDelivery, InsertWebhookOutbox, InstancesTable, MagicLink, MagicLinksTable, MempoolTransaction, MempoolTransactionsTable, NativeClock, ObserverJournalStatus, ObserverJournalTable, OutboxStatus, PendingForkBlocksTable, Pox4CallsTable, Pox4FunctionName, Pox5EventTopic, Pox5EventsTable, ProcessedStripeEventsTable, RepairMode, RetryState, RunStatus, SbtcEventTopic, SbtcEventsTable, SbtcSettlementsTable, SbtcTokenEventType, SbtcTokenEventsTable, ServiceHeartbeatsTable, Session, SessionsTable, StageBlockReceiptsTable, StageFailuresTable, StageKind, StageRegistryTable, StageRunsTable, Subgraph, SubgraphGap, SubgraphGapsTable, SubgraphHealthSnapshot, SubgraphHealthSnapshotsTable, SubgraphOperation, SubgraphOperationKind, SubgraphOperationStatus, SubgraphOperationsTable, SubgraphProcessingStatsTable, SubgraphViolationsTable, SubgraphsTable, SyncScopesTable, Transaction, TransactionsArchiveTable, TransactionsTable, TriggerEvaluatorState, TriggerEvaluatorStateTable, UpdateAccountCredits, UpdateAccountSpendCap, UpdateApiKey, UpdateArchiveFetch, UpdateBlock, UpdateContract, UpdateEvent, UpdateIndexProgress, UpdateSubgraph, UpdateSubgraphOperation, UpdateTransaction, UpdateUsageLedgerRow, UpdateVmEvent, UpdateWebhook, UpdateWebhookOutbox, UsageLedgerRow, UsageLedgerTable, VmEvent, VmEventsArchiveTable, VmEventsTable, Waitlist, WaitlistSignup, WaitlistSignupsTable, WaitlistsTable, Webhook, WebhookDeliveriesTable, WebhookDelivery, WebhookFormat, WebhookKind, WebhookOutbox, WebhookOutboxTable, WebhookRuntime, WebhookStatus, WebhooksTable };
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -52,9 +52,9 @@ declare class RateLimitError extends SecondLayerError {
|
|
|
52
52
|
constructor(message: string);
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* HTTP 402. Carries
|
|
56
|
-
*
|
|
57
|
-
*
|
|
55
|
+
* HTTP 402: insufficient credits. Carries a machine-readable reason (e.g.
|
|
56
|
+
* `insufficient_credits`, `UPGRADE_REQUIRED`) in `details` so the global
|
|
57
|
+
* error handler emits it in the body, alongside a top-up hint/link.
|
|
58
58
|
*/
|
|
59
59
|
declare class PaymentRequiredError extends SecondLayerError {
|
|
60
60
|
constructor(message: string, details?: Record<string, unknown>);
|
package/dist/src/errors.js.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/errors.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"export const ErrorCodes = {\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tDATABASE_ERROR: \"DATABASE_ERROR\",\n\tAUTHENTICATION_ERROR: \"AUTHENTICATION_ERROR\",\n\tAUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\n\tRATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\n\tPAYMENT_REQUIRED: \"PAYMENT_REQUIRED\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tVERSION_CONFLICT: \"VERSION_CONFLICT\",\n\tNOT_FOUND: \"NOT_FOUND\",\n\t// Tenant lifecycle (CLI surfaces these verbatim)\n\tKEY_ROTATED: \"KEY_ROTATED\",\n\tTENANT_SUSPENDED: \"TENANT_SUSPENDED\",\n\tNO_TENANT_FOR_PROJECT: \"NO_TENANT_FOR_PROJECT\",\n\tINSTANCE_EXISTS: \"INSTANCE_EXISTS\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/** Base error class for all Secondlayer errors. */\nexport class SecondLayerError extends Error {\n\tpublic code: ErrorCode;\n\tpublic override cause?: unknown;\n\t/** Optional structured payload merged into the HTTP error body (machine-readable hints). */\n\tpublic details?: Record<string, unknown>;\n\n\tconstructor(\n\t\tcode: ErrorCode,\n\t\tmessage: string,\n\t\tcause?: unknown,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t\tthis.cause = cause;\n\t\tthis.details = details;\n\t\tthis.name = this.constructor.name;\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tcode: string;\n\t\tmessage: string;\n\t\tstack: string | undefined;\n\t\tcause: unknown;\n\t\tdetails: Record<string, unknown> | undefined;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause,\n\t\t\tdetails: this.details,\n\t\t};\n\t}\n}\n\nexport class NotFoundError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"NOT_FOUND\", message);\n\t}\n}\n\nexport class ValidationError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"VALIDATION_ERROR\", message, cause);\n\t}\n}\n\nexport class DatabaseError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"DATABASE_ERROR\", message, cause);\n\t}\n}\n\nexport class AuthenticationError extends SecondLayerError {\n\t/** `details` is merged into the HTTP body — use it to carry the recovery\n\t * hint (which credential, where it comes from) instead of a bare \"invalid\n\t * key\" the caller cannot act on. */\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHENTICATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class AuthorizationError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHORIZATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class RateLimitError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"RATE_LIMIT_ERROR\", message);\n\t}\n}\n\n/**\n * HTTP 402. Carries
|
|
5
|
+
"export const ErrorCodes = {\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tDATABASE_ERROR: \"DATABASE_ERROR\",\n\tAUTHENTICATION_ERROR: \"AUTHENTICATION_ERROR\",\n\tAUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\n\tRATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\n\tPAYMENT_REQUIRED: \"PAYMENT_REQUIRED\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tVERSION_CONFLICT: \"VERSION_CONFLICT\",\n\tNOT_FOUND: \"NOT_FOUND\",\n\t// Tenant lifecycle (CLI surfaces these verbatim)\n\tKEY_ROTATED: \"KEY_ROTATED\",\n\tTENANT_SUSPENDED: \"TENANT_SUSPENDED\",\n\tNO_TENANT_FOR_PROJECT: \"NO_TENANT_FOR_PROJECT\",\n\tINSTANCE_EXISTS: \"INSTANCE_EXISTS\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/** Base error class for all Secondlayer errors. */\nexport class SecondLayerError extends Error {\n\tpublic code: ErrorCode;\n\tpublic override cause?: unknown;\n\t/** Optional structured payload merged into the HTTP error body (machine-readable hints). */\n\tpublic details?: Record<string, unknown>;\n\n\tconstructor(\n\t\tcode: ErrorCode,\n\t\tmessage: string,\n\t\tcause?: unknown,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t\tthis.cause = cause;\n\t\tthis.details = details;\n\t\tthis.name = this.constructor.name;\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tcode: string;\n\t\tmessage: string;\n\t\tstack: string | undefined;\n\t\tcause: unknown;\n\t\tdetails: Record<string, unknown> | undefined;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause,\n\t\t\tdetails: this.details,\n\t\t};\n\t}\n}\n\nexport class NotFoundError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"NOT_FOUND\", message);\n\t}\n}\n\nexport class ValidationError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"VALIDATION_ERROR\", message, cause);\n\t}\n}\n\nexport class DatabaseError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"DATABASE_ERROR\", message, cause);\n\t}\n}\n\nexport class AuthenticationError extends SecondLayerError {\n\t/** `details` is merged into the HTTP body — use it to carry the recovery\n\t * hint (which credential, where it comes from) instead of a bare \"invalid\n\t * key\" the caller cannot act on. */\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHENTICATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class AuthorizationError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHORIZATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class RateLimitError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"RATE_LIMIT_ERROR\", message);\n\t}\n}\n\n/**\n * HTTP 402: insufficient credits. Carries a machine-readable reason (e.g.\n * `insufficient_credits`, `UPGRADE_REQUIRED`) in `details` so the global\n * error handler emits it in the body, alongside a top-up hint/link.\n */\nexport class PaymentRequiredError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"PAYMENT_REQUIRED\", message, undefined, details);\n\t}\n}\n\nexport class ForbiddenError extends SecondLayerError {\n\tconstructor(message = \"Forbidden\") {\n\t\tsuper(\"FORBIDDEN\", message);\n\t}\n}\n\nexport class VersionConflictError extends SecondLayerError {\n\tpublic currentVersion: string;\n\tpublic expectedVersion: string;\n\n\tconstructor(currentVersion: string, expectedVersion: string) {\n\t\tsuper(\n\t\t\t\"VERSION_CONFLICT\",\n\t\t\t`Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t\t);\n\t\tthis.currentVersion = currentVersion;\n\t\tthis.expectedVersion = expectedVersion;\n\t}\n}\n\nexport class KeyRotatedError extends SecondLayerError {\n\tconstructor(message = \"Token has been rotated\") {\n\t\tsuper(\"KEY_ROTATED\", message);\n\t}\n}\n\nexport class TenantSuspendedError extends SecondLayerError {\n\tconstructor(message = \"Instance is suspended\") {\n\t\tsuper(\"TENANT_SUSPENDED\", message);\n\t}\n}\n\n/** Error code → HTTP status. Used by API middleware for code-based matching\n * (avoids cross-bundle instanceof failures from bunup class duplication). */\n// String literal map — codes don't have to be in the central ErrorCode\n// enum (route-local error classes can supply any code; we just map the\n// HTTP status here). This keeps cross-bundle instanceof failures out of\n// the equation.\nexport const CODE_TO_STATUS: Record<\n\tstring,\n\t400 | 401 | 402 | 403 | 404 | 409 | 415 | 422 | 423 | 429 | 503\n> = {\n\t// The chain plane has no data yet — a fresh self-host install before the\n\t// first block lands. Retryable, and not the operator's mistake, so it is a\n\t// 503 with a name rather than an opaque 500.\n\tCHAIN_DATA_UNAVAILABLE: 503,\n\tAUTHENTICATION_ERROR: 401,\n\tAUTHORIZATION_ERROR: 403,\n\tPAYMENT_REQUIRED: 402,\n\tRATE_LIMIT_ERROR: 429,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tVALIDATION_ERROR: 400,\n\tKEY_ROTATED: 401,\n\tTENANT_SUSPENDED: 423,\n\tNO_TENANT_FOR_PROJECT: 404,\n\tINSTANCE_EXISTS: 409,\n\tSUBGRAPH_NOT_FOUND: 404,\n\tGHOST_KEY_READ_ONLY: 403,\n\t// A write that did not declare `Content-Type: application/json`. Shaped\n\t// like something a browser could have forged cross-origin without a CORS\n\t// preflight — see the API's `middleware/csrf.ts`.\n\tUNSUPPORTED_MEDIA_TYPE: 415,\n} as const;\n\nexport function getErrorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
8
|
"debugId": "342CE76CCD6FF26D64756E2164756E21",
|
package/dist/src/index-http.js
CHANGED
|
@@ -3,7 +3,7 @@ var INDEX_INTERNAL_TENANT_ID = "tenant_index_internal";
|
|
|
3
3
|
var INTERNAL_STREAMS_TENANT_ID = "tenant_streams_decode_internal";
|
|
4
4
|
var DEFAULT_INTERNAL_INDEX_BASE_URL = "http://api:3800";
|
|
5
5
|
var MISSING_INTERNAL_STREAMS_API_KEY = "Set STREAMS_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Empty env no longer falls back to a committed secret.";
|
|
6
|
-
var MISSING_INTERNAL_INDEX_API_KEY = "Set INDEX_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Without one, Index reads
|
|
6
|
+
var MISSING_INTERNAL_INDEX_API_KEY = "Set INDEX_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Without one, Index reads carry no credential and platform mode 401s every one of them.";
|
|
7
7
|
function defaultInternalIndexApiKey(env = process.env) {
|
|
8
8
|
const internal = env.INDEX_INTERNAL_API_KEY?.trim();
|
|
9
9
|
if (internal)
|
|
@@ -177,5 +177,5 @@ export {
|
|
|
177
177
|
createInternalIndexHttpClient
|
|
178
178
|
};
|
|
179
179
|
|
|
180
|
-
//# debugId=
|
|
180
|
+
//# debugId=B9D3318245CBB63B64756E2164756E21
|
|
181
181
|
//# sourceMappingURL=index-http.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index-internal-auth.ts", "../src/index-http.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
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
|
|
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 carry no credential and platform mode 401s every one of them.\";\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 * Platform mode requires a credential on every Index read (a keyless read\n * 401s, `api/src/index/auth.ts`) — a first-party consumer with no internal\n * key would fail every request at call time. 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
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;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "B9D3318245CBB63B64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -5,12 +5,9 @@ declare function defaultInternalStreamsApiKey(env?: NodeJS.ProcessEnv): string |
|
|
|
5
5
|
/**
|
|
6
6
|
* Platform-mode Index consumer: refuse to run with neither credential.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* window, at which point every read 402s and the container goes unhealthy,
|
|
12
|
-
* possibly weeks after the misconfiguration. Callers that seek older history
|
|
13
|
-
* on a platform-mode instance should fail here at startup instead.
|
|
8
|
+
* Platform mode requires a credential on every Index read (a keyless read
|
|
9
|
+
* 401s, `api/src/index/auth.ts`) — a first-party consumer with no internal
|
|
10
|
+
* key would fail every request at call time. Fail here at startup instead.
|
|
14
11
|
*
|
|
15
12
|
* Self-hosted (oss/dedicated) instances are not gated, so they must NOT call
|
|
16
13
|
* this — `defaultInternalIndexApiKey()` returning undefined is correct there.
|
|
@@ -3,7 +3,7 @@ var INDEX_INTERNAL_TENANT_ID = "tenant_index_internal";
|
|
|
3
3
|
var INTERNAL_STREAMS_TENANT_ID = "tenant_streams_decode_internal";
|
|
4
4
|
var DEFAULT_INTERNAL_INDEX_BASE_URL = "http://api:3800";
|
|
5
5
|
var MISSING_INTERNAL_STREAMS_API_KEY = "Set STREAMS_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Empty env no longer falls back to a committed secret.";
|
|
6
|
-
var MISSING_INTERNAL_INDEX_API_KEY = "Set INDEX_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Without one, Index reads
|
|
6
|
+
var MISSING_INTERNAL_INDEX_API_KEY = "Set INDEX_INTERNAL_API_KEY (archive; prefix sl-int_) or INSTANCE_TOKEN (OSS). Without one, Index reads carry no credential and platform mode 401s every one of them.";
|
|
7
7
|
function defaultInternalIndexApiKey(env = process.env) {
|
|
8
8
|
const internal = env.INDEX_INTERNAL_API_KEY?.trim();
|
|
9
9
|
if (internal)
|
|
@@ -47,5 +47,5 @@ export {
|
|
|
47
47
|
requireInternalStreamsApiKey
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
//# debugId=
|
|
50
|
+
//# debugId=E78A002D4B7D692A64756E2164756E21
|
|
51
51
|
//# sourceMappingURL=index-internal-auth.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index-internal-auth.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
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
|
|
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 carry no credential and platform mode 401s every one of them.\";\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 * Platform mode requires a credential on every Index read (a keyless read\n * 401s, `api/src/index/auth.ts`) — a first-party consumer with no internal\n * key would fail every request at call time. 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
6
|
],
|
|
7
|
-
"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;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"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;AAaM,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;",
|
|
8
|
+
"debugId": "E78A002D4B7D692A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|