@rocicorp/zero 0.5.2024110200 → 0.6.2024111700
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/out/{internal.js → advanced.js} +2 -2
- package/out/{chunk-YCMA66NH.js → chunk-5UY46OAF.js} +5 -2
- package/out/{chunk-YCMA66NH.js.map → chunk-5UY46OAF.js.map} +2 -2
- package/out/{chunk-INJ4WJHS.js → chunk-PIFWXXO2.js} +1209 -586
- package/out/chunk-PIFWXXO2.js.map +7 -0
- package/out/react.js.map +2 -2
- package/out/shared/src/browser-env.d.ts +17 -0
- package/out/shared/src/browser-env.d.ts.map +1 -1
- package/out/shared/src/expand.d.ts +7 -0
- package/out/shared/src/expand.d.ts.map +1 -0
- package/out/solid.js +5 -5
- package/out/solid.js.map +2 -2
- package/out/zero-cache/src/auth/load-authorization.d.ts +3 -0
- package/out/zero-cache/src/auth/load-authorization.d.ts.map +1 -0
- package/out/zero-cache/src/auth/load-authorization.js +21 -0
- package/out/zero-cache/src/auth/load-authorization.js.map +1 -0
- package/out/zero-cache/src/config/config.d.ts +112 -0
- package/out/zero-cache/src/config/config.d.ts.map +1 -0
- package/out/zero-cache/src/config/config.js +246 -0
- package/out/zero-cache/src/config/config.js.map +1 -0
- package/out/zero-cache/src/config/zero-config.d.ts +145 -964
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +242 -115
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/delete-lite-db.d.ts +2 -0
- package/out/zero-cache/src/db/delete-lite-db.d.ts.map +1 -0
- package/out/zero-cache/src/db/delete-lite-db.js +7 -0
- package/out/zero-cache/src/db/delete-lite-db.js.map +1 -0
- package/out/zero-cache/src/db/migration.d.ts +1 -0
- package/out/zero-cache/src/db/migration.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration.js +17 -7
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js +7 -3
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/db/short-lived-client.d.ts +16 -0
- package/out/zero-cache/src/db/short-lived-client.d.ts.map +1 -0
- package/out/zero-cache/src/db/short-lived-client.js +50 -0
- package/out/zero-cache/src/db/short-lived-client.js.map +1 -0
- package/out/zero-cache/src/db/specs.d.ts +12 -3
- package/out/zero-cache/src/db/specs.d.ts.map +1 -1
- package/out/zero-cache/src/db/specs.js +6 -1
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts +8 -2
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +43 -9
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +34 -9
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/life-cycle.d.ts +1 -1
- package/out/zero-cache/src/server/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/server/life-cycle.js +2 -3
- package/out/zero-cache/src/server/life-cycle.js.map +1 -1
- package/out/zero-cache/src/server/logging.d.ts.map +1 -1
- package/out/zero-cache/src/server/logging.js +2 -15
- package/out/zero-cache/src/server/logging.js.map +1 -1
- package/out/zero-cache/src/server/main.js +28 -10
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +6 -5
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +16 -12
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +2 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +153 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +136 -19
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +17 -9
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js +4 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +1 -0
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +9 -2
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts +10 -0
- package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/change-source.js +171 -24
- package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +33 -19
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +62 -39
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +8 -40
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts +8 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.js +41 -8
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +83 -13
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +15 -5
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts +39 -3
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js +67 -36
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/validation.d.ts +8 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/validation.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/validation.js +33 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/validation.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +5 -1
- package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/change.js +3 -0
- package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +4 -6
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +6 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +19 -4
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +29 -2
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +90 -8
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +1 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +18 -3
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts +5 -3
- package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/services/dispatcher/dispatcher.js +20 -5
- package/out/zero-cache/src/services/dispatcher/dispatcher.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +6 -5
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +26 -20
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts +7 -6
- package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/write-authorizer.js +10 -18
- package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +8 -8
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js +1 -10
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/running-state.d.ts +6 -1
- package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/running-state.js +23 -5
- package/out/zero-cache/src/services/running-state.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +49 -29
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +2 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/lexi-version.d.ts +3 -2
- package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -1
- package/out/zero-cache/src/types/lexi-version.js +8 -6
- package/out/zero-cache/src/types/lexi-version.js.map +1 -1
- package/out/zero-cache/src/types/processes.d.ts.map +1 -1
- package/out/zero-cache/src/types/processes.js +1 -0
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +2 -4
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +1 -1
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/crud.d.ts +56 -25
- package/out/zero-client/src/client/crud.d.ts.map +1 -1
- package/out/zero-client/src/client/http-string.d.ts +1 -0
- package/out/zero-client/src/client/http-string.d.ts.map +1 -1
- package/out/zero-client/src/client/log-options.d.ts +2 -1
- package/out/zero-client/src/client/log-options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.d.ts +8 -8
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/protocol-version.d.ts +2 -0
- package/out/zero-client/src/client/protocol-version.d.ts.map +1 -0
- package/out/zero-client/src/client/server-option.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -1
- package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +26 -14
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +4 -2
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.d.ts +37 -21
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +21 -6
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/change-desired-queries.d.ts +16 -8
- package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.d.ts +16 -8
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/down.d.ts +16 -8
- package/out/zero-protocol/src/down.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.d.ts +32 -16
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/push.d.ts +18 -18
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +5 -5
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/queries-patch.d.ts +24 -12
- package/out/zero-protocol/src/queries-patch.d.ts.map +1 -1
- package/out/zero-protocol/src/up.d.ts +18 -10
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-react/src/use-zero.d.ts.map +1 -1
- package/out/zero-schema/src/authorization.d.ts +25 -0
- package/out/zero-schema/src/authorization.d.ts.map +1 -0
- package/out/zero-schema/src/compiled-authorization.d.ts +379 -0
- package/out/zero-schema/src/compiled-authorization.d.ts.map +1 -0
- package/out/zero-schema/src/compiled-authorization.js +15 -0
- package/out/zero-schema/src/compiled-authorization.js.map +1 -0
- package/out/zero-schema/src/mod.d.ts +1 -0
- package/out/zero-schema/src/mod.d.ts.map +1 -1
- package/out/{zero-client/src/client → zero-schema/src}/normalized-schema.d.ts +2 -2
- package/out/zero-schema/src/normalized-schema.d.ts.map +1 -0
- package/out/zero-schema/src/table-schema.d.ts +15 -7
- package/out/zero-schema/src/table-schema.d.ts.map +1 -1
- package/out/zero-schema/src/table-schema.js.map +1 -1
- package/out/zero.js +10 -14
- package/out/zql/src/builder/builder.d.ts +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +136 -30
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/filter.d.ts +2 -1
- package/out/zql/src/builder/filter.d.ts.map +1 -1
- package/out/zql/src/builder/filter.js +18 -0
- package/out/zql/src/builder/filter.js.map +1 -1
- package/out/zql/src/builder/like.d.ts +2 -2
- package/out/zql/src/builder/like.d.ts.map +1 -1
- package/out/zql/src/ivm/change.d.ts +1 -0
- package/out/zql/src/ivm/change.d.ts.map +1 -1
- package/out/zql/src/ivm/change.js +4 -1
- package/out/zql/src/ivm/change.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +18 -0
- package/out/zql/src/ivm/exists.d.ts.map +1 -0
- package/out/zql/src/ivm/exists.js +186 -0
- package/out/zql/src/ivm/exists.js.map +1 -0
- package/out/zql/src/ivm/fan-in.d.ts +1 -1
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +3 -3
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js +4 -7
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter.js +1 -1
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +10 -6
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +60 -75
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/skip.js +1 -1
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/take.d.ts +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +11 -7
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/query/auth-query.d.ts +7 -3
- package/out/zql/src/query/auth-query.d.ts.map +1 -1
- package/out/zql/src/query/dnf.d.ts +10 -0
- package/out/zql/src/query/dnf.d.ts.map +1 -0
- package/out/zql/src/query/expression.d.ts +40 -23
- package/out/zql/src/query/expression.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +7 -6
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query.d.ts +17 -46
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +19 -6
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +12 -3
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +81 -2
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +7 -11
- package/out/chunk-INJ4WJHS.js.map +0 -7
- package/out/datadog/src/datadog-log-sink.js +0 -231
- package/out/datadog/src/datadog-log-sink.js.map +0 -1
- package/out/datadog/src/mod.js +0 -2
- package/out/datadog/src/mod.js.map +0 -1
- package/out/shared/src/immutable.js +0 -2
- package/out/shared/src/immutable.js.map +0 -1
- package/out/shared/src/sorted-entries.js +0 -6
- package/out/shared/src/sorted-entries.js.map +0 -1
- package/out/shared/src/writable.js +0 -2
- package/out/shared/src/writable.js.map +0 -1
- package/out/zero/src/config.d.ts +0 -2
- package/out/zero/src/config.d.ts.map +0 -1
- package/out/zero/src/config.js +0 -2
- package/out/zero/src/config.js.map +0 -1
- package/out/zero-cache/src/config/config-query.d.ts +0 -19
- package/out/zero-cache/src/config/config-query.d.ts.map +0 -1
- package/out/zero-cache/src/config/config-query.js +0 -22
- package/out/zero-cache/src/config/config-query.js.map +0 -1
- package/out/zero-cache/src/config/define-config.d.ts +0 -43
- package/out/zero-cache/src/config/define-config.d.ts.map +0 -1
- package/out/zero-cache/src/config/define-config.js +0 -121
- package/out/zero-cache/src/config/define-config.js.map +0 -1
- package/out/zero-cache/src/config/refs.d.ts +0 -3
- package/out/zero-cache/src/config/refs.d.ts.map +0 -1
- package/out/zero-cache/src/config/refs.js +0 -14
- package/out/zero-cache/src/config/refs.js.map +0 -1
- package/out/zero-client/src/client/normalized-schema.d.ts.map +0 -1
- package/out/zero-client/src/client/normalized-schema.js +0 -31
- package/out/zero-client/src/client/normalized-schema.js.map +0 -1
- package/out/zero-protocol/src/ast-hash.js +0 -14
- package/out/zero-protocol/src/ast-hash.js.map +0 -1
- package/out/zero-schema/src/mod.js +0 -4
- package/out/zero-schema/src/mod.js.map +0 -1
- package/out/zero-schema/src/normalize-table-schema.js +0 -116
- package/out/zero-schema/src/normalize-table-schema.js.map +0 -1
- package/out/zero-schema/src/schema.js +0 -4
- package/out/zero-schema/src/schema.js.map +0 -1
- package/out/zql/src/ivm/array-view.js +0 -70
- package/out/zql/src/ivm/array-view.js.map +0 -1
- package/out/zql/src/ivm/view-apply-change.js +0 -156
- package/out/zql/src/ivm/view-apply-change.js.map +0 -1
- package/out/zql/src/ivm/view.js +0 -2
- package/out/zql/src/ivm/view.js.map +0 -1
- package/out/zql/src/query/auth-query.js +0 -26
- package/out/zql/src/query/auth-query.js.map +0 -1
- package/out/zql/src/query/expression.js +0 -121
- package/out/zql/src/query/expression.js.map +0 -1
- package/out/zql/src/query/query-impl.js +0 -291
- package/out/zql/src/query/query-impl.js.map +0 -1
- package/out/zql/src/query/query-internal.js +0 -2
- package/out/zql/src/query/query-internal.js.map +0 -1
- package/out/zql/src/query/query.js +0 -3
- package/out/zql/src/query/query.js.map +0 -1
- package/out/zql/src/query/typed-view.js +0 -2
- package/out/zql/src/query/typed-view.js.map +0 -1
- /package/out/{internal.js.map → advanced.js.map} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import postgres from 'postgres';
|
|
3
|
+
import { AbortError } from '../../../../../shared/src/abort-error.js';
|
|
3
4
|
import type { PostgresDB } from '../../../types/pg.js';
|
|
4
5
|
import type { Change } from './change.js';
|
|
5
6
|
export declare const PG_SCHEMA = "cdc";
|
|
@@ -18,5 +19,9 @@ export type ReplicationConfig = {
|
|
|
18
19
|
publications: string[];
|
|
19
20
|
};
|
|
20
21
|
export declare function setupCDCTables(lc: LogContext, db: postgres.TransactionSql): Promise<void>;
|
|
21
|
-
export declare function
|
|
22
|
+
export declare function markResetRequired(db: PostgresDB): Promise<void>;
|
|
23
|
+
export declare function ensureReplicationConfig(lc: LogContext, db: PostgresDB, config: ReplicationConfig, autoReset: boolean): Promise<void>;
|
|
24
|
+
export declare class AutoResetSignal extends AbortError {
|
|
25
|
+
readonly name = "AutoResetSignal";
|
|
26
|
+
}
|
|
22
27
|
//# sourceMappingURL=tables.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAC;AAEpE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAI/B,MAAM,MAAM,cAAc,GAAG;IAG3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAYF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAcF,wBAAsB,cAAc,CAClC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,QAAQ,CAAC,cAAc,iBAI5B;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,UAAU,iBAErD;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,OAAO,iBA4CnB;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,QAAQ,CAAC,IAAI,qBAAqB;CACnC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import postgres from 'postgres';
|
|
3
|
+
import { AbortError } from '../../../../../shared/src/abort-error.js';
|
|
3
4
|
import { equals } from '../../../../../shared/src/set-utils.js';
|
|
4
5
|
export const PG_SCHEMA = 'cdc';
|
|
5
6
|
const CREATE_CDC_SCHEMA = `CREATE SCHEMA IF NOT EXISTS cdc;`;
|
|
@@ -16,6 +17,7 @@ const CREATE_REPLICATION_CONFIG_TABLE = `
|
|
|
16
17
|
CREATE TABLE cdc."replicationConfig" (
|
|
17
18
|
"replicaVersion" TEXT NOT NULL,
|
|
18
19
|
"publications" TEXT[] NOT NULL,
|
|
20
|
+
"resetRequired" BOOL,
|
|
19
21
|
"lock" INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1)
|
|
20
22
|
);
|
|
21
23
|
`;
|
|
@@ -24,26 +26,39 @@ export async function setupCDCTables(lc, db) {
|
|
|
24
26
|
lc.info?.(`Setting up CDC tables`);
|
|
25
27
|
await db.unsafe(CREATE_CDC_TABLES);
|
|
26
28
|
}
|
|
27
|
-
export async function
|
|
29
|
+
export async function markResetRequired(db) {
|
|
30
|
+
await db `UPDATE cdc."replicationConfig" SET "resetRequired" = true`;
|
|
31
|
+
}
|
|
32
|
+
export async function ensureReplicationConfig(lc, db, config, autoReset) {
|
|
28
33
|
// Restrict the fields of the supplied `config`.
|
|
29
34
|
const { publications, replicaVersion } = config;
|
|
30
35
|
const replicaConfig = { publications, replicaVersion };
|
|
31
36
|
await db.begin(async (tx) => {
|
|
32
|
-
const results = await tx `SELECT "replicaVersion", "publications" FROM cdc."replicationConfig"`;
|
|
37
|
+
const results = await tx `SELECT "replicaVersion", "publications", "resetRequired" FROM cdc."replicationConfig"`;
|
|
33
38
|
if (results.length === 0) {
|
|
34
39
|
return tx `INSERT INTO cdc."replicationConfig" ${tx(replicaConfig)}`;
|
|
35
40
|
}
|
|
36
|
-
const { replicaVersion, publications } = results[0];
|
|
41
|
+
const { replicaVersion, publications, resetRequired } = results[0];
|
|
37
42
|
if (replicaVersion !== replicaConfig.replicaVersion ||
|
|
38
43
|
!equals(new Set(publications), new Set(replicaConfig.publications))) {
|
|
39
44
|
lc.info?.(`Data in cdc tables @${replicaVersion} is incompatible ` +
|
|
40
45
|
`with replica @${replicaConfig.replicaVersion}. Clearing tables.`);
|
|
41
46
|
return [
|
|
42
47
|
tx `TRUNCATE TABLE cdc."changeLog"`,
|
|
43
|
-
tx `
|
|
48
|
+
tx `TRUNCATE TABLE cdc."replicationConfig"`,
|
|
49
|
+
tx `INSERT INTO cdc."replicationConfig" ${tx(replicaConfig)}`,
|
|
44
50
|
].map(stmt => stmt.execute());
|
|
45
51
|
}
|
|
52
|
+
if (resetRequired) {
|
|
53
|
+
if (autoReset) {
|
|
54
|
+
throw new AutoResetSignal();
|
|
55
|
+
}
|
|
56
|
+
lc.warn?.('reset required but auto-reset is disabled');
|
|
57
|
+
}
|
|
46
58
|
return [];
|
|
47
59
|
});
|
|
48
60
|
}
|
|
61
|
+
export class AutoResetSignal extends AbortError {
|
|
62
|
+
name = 'AutoResetSignal';
|
|
63
|
+
}
|
|
49
64
|
//# sourceMappingURL=tables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,wCAAwC,CAAC;AAI9D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAE/B,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAS7D,MAAM,uBAAuB,GAAG;;;;;;;;CAQ/B,CAAC;AAaF,MAAM,+BAA+B,GAAG
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAC;AACpE,OAAO,EAAC,MAAM,EAAC,MAAM,wCAAwC,CAAC;AAI9D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAE/B,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAS7D,MAAM,uBAAuB,GAAG;;;;;;;;CAQ/B,CAAC;AAaF,MAAM,+BAA+B,GAAG;;;;;;;CAOvC,CAAC;AAEF,MAAM,iBAAiB,GACrB,iBAAiB,GAAG,uBAAuB,GAAG,+BAA+B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAc,EACd,EAA2B;IAE3B,EAAE,CAAC,IAAI,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAc;IACpD,MAAM,EAAE,CAAA,2DAA2D,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAc,EACd,EAAc,EACd,MAAyB,EACzB,SAAkB;IAElB,gDAAgD;IAChD,MAAM,EAAC,YAAY,EAAE,cAAc,EAAC,GAAG,MAAM,CAAC;IAC9C,MAAM,aAAa,GAAG,EAAC,YAAY,EAAE,cAAc,EAAC,CAAC;IAErD,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QACxB,MAAM,OAAO,GAAG,MAAM,EAAE,CAMvB,uFAAuF,CAAC;QAEzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA,uCAAuC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,EAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,IACE,cAAc,KAAK,aAAa,CAAC,cAAc;YAC/C,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EACnE,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,CACP,uBAAuB,cAAc,mBAAmB;gBACtD,iBAAiB,aAAa,CAAC,cAAc,oBAAoB,CACpE,CAAC;YACF,OAAO;gBACL,EAAE,CAAA,gCAAgC;gBAClC,EAAE,CAAA,wCAAwC;gBAC1C,EAAE,CAAA,uCAAuC,EAAE,CAAC,aAAa,CAAC,EAAE;aAC7D,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,eAAe,EAAE,CAAC;YAC9B,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,CAAC,2CAA2C,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IACpC,IAAI,GAAG,iBAAiB,CAAC;CACnC"}
|
|
@@ -2,18 +2,45 @@ import { LogContext } from '@rocicorp/logger';
|
|
|
2
2
|
import type { PostgresDB } from '../../types/pg.js';
|
|
3
3
|
import type { Service } from '../service.js';
|
|
4
4
|
import type { WatermarkedChange } from './change-streamer-service.js';
|
|
5
|
-
import type
|
|
5
|
+
import { type Commit } from './change-streamer.js';
|
|
6
6
|
import { Subscriber } from './subscriber.js';
|
|
7
7
|
/**
|
|
8
8
|
* Handles the storage of changes and the catchup of subscribers
|
|
9
9
|
* that are behind.
|
|
10
|
+
*
|
|
11
|
+
* In the context of catchup and cleanup, it is the responsibility of the
|
|
12
|
+
* Storer to decide whether a client can be caught up, or whether the
|
|
13
|
+
* changes needed to catch a client up have been purged.
|
|
14
|
+
*
|
|
15
|
+
* **Maintained invariant**: The Change DB is only empty for a
|
|
16
|
+
* completely new replica (i.e. initial-sync with no changes from the
|
|
17
|
+
* replication stream).
|
|
18
|
+
* * In this case, all new subscribers are expected start from the
|
|
19
|
+
* `replicaVersion`, which is the version at which initial sync
|
|
20
|
+
* was performed, and any attempts to catchup from a different
|
|
21
|
+
* point fail.
|
|
22
|
+
*
|
|
23
|
+
* Conversely, if non-initial changes have flowed through the system
|
|
24
|
+
* (i.e. via the replication stream), the ChangeDB must *not* be empty,
|
|
25
|
+
* and the earliest change in the `changeLog` represents the earliest
|
|
26
|
+
* "commit" from (after) which a subscriber can be caught up.
|
|
27
|
+
* * Any attempts to catchup from an earlier point must fail with
|
|
28
|
+
* a `WatermarkTooOld` error.
|
|
29
|
+
* * Failure to do so could result in streaming changes to the
|
|
30
|
+
* subscriber such that there is a gap in its replication history.
|
|
31
|
+
*
|
|
32
|
+
* Note: Subscribers (i.e. `incremental-syncer`) consider an "error" signal
|
|
33
|
+
* an unrecoverable error and shut down in response. This allows the
|
|
34
|
+
* production system to replace it with a new task and fresh copy of the
|
|
35
|
+
* replica backup.
|
|
10
36
|
*/
|
|
11
37
|
export declare class Storer implements Service {
|
|
12
38
|
#private;
|
|
13
39
|
readonly id = "storer";
|
|
14
40
|
readonly stopped: import("@rocicorp/resolver").Resolver<false, unknown>;
|
|
15
|
-
constructor(lc: LogContext, db: PostgresDB, onCommit: (c: Commit) => void);
|
|
41
|
+
constructor(lc: LogContext, db: PostgresDB, replicaVersion: string, onCommit: (c: Commit) => void);
|
|
16
42
|
getLastStoredWatermark(): Promise<string | null>;
|
|
43
|
+
purgeRecordsBefore(watermark: string): Promise<number>;
|
|
17
44
|
store(entry: WatermarkedChange): void;
|
|
18
45
|
catchup(sub: Subscriber): void;
|
|
19
46
|
run(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAO5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAO5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAA8B,KAAK,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAU3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;IAMvB,QAAQ,CAAC,OAAO,wDAAqB;gBAGnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI;IAQzB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOhD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B5D,KAAK,CAAC,KAAK,EAAE,iBAAiB;IAI9B,OAAO,CAAC,GAAG,EAAE,UAAU;IAIjB,GAAG;IAyKT,IAAI;CAIL"}
|
|
@@ -4,27 +4,78 @@ import { assert } from '../../../../shared/src/asserts.js';
|
|
|
4
4
|
import { Queue } from '../../../../shared/src/queue.js';
|
|
5
5
|
import { promiseVoid } from '../../../../shared/src/resolved-promises.js';
|
|
6
6
|
import { Mode, TransactionPool } from '../../db/transaction-pool.js';
|
|
7
|
+
import { ErrorType } from './change-streamer.js';
|
|
7
8
|
import { Subscriber } from './subscriber.js';
|
|
8
9
|
/**
|
|
9
10
|
* Handles the storage of changes and the catchup of subscribers
|
|
10
11
|
* that are behind.
|
|
12
|
+
*
|
|
13
|
+
* In the context of catchup and cleanup, it is the responsibility of the
|
|
14
|
+
* Storer to decide whether a client can be caught up, or whether the
|
|
15
|
+
* changes needed to catch a client up have been purged.
|
|
16
|
+
*
|
|
17
|
+
* **Maintained invariant**: The Change DB is only empty for a
|
|
18
|
+
* completely new replica (i.e. initial-sync with no changes from the
|
|
19
|
+
* replication stream).
|
|
20
|
+
* * In this case, all new subscribers are expected start from the
|
|
21
|
+
* `replicaVersion`, which is the version at which initial sync
|
|
22
|
+
* was performed, and any attempts to catchup from a different
|
|
23
|
+
* point fail.
|
|
24
|
+
*
|
|
25
|
+
* Conversely, if non-initial changes have flowed through the system
|
|
26
|
+
* (i.e. via the replication stream), the ChangeDB must *not* be empty,
|
|
27
|
+
* and the earliest change in the `changeLog` represents the earliest
|
|
28
|
+
* "commit" from (after) which a subscriber can be caught up.
|
|
29
|
+
* * Any attempts to catchup from an earlier point must fail with
|
|
30
|
+
* a `WatermarkTooOld` error.
|
|
31
|
+
* * Failure to do so could result in streaming changes to the
|
|
32
|
+
* subscriber such that there is a gap in its replication history.
|
|
33
|
+
*
|
|
34
|
+
* Note: Subscribers (i.e. `incremental-syncer`) consider an "error" signal
|
|
35
|
+
* an unrecoverable error and shut down in response. This allows the
|
|
36
|
+
* production system to replace it with a new task and fresh copy of the
|
|
37
|
+
* replica backup.
|
|
11
38
|
*/
|
|
12
39
|
export class Storer {
|
|
13
40
|
id = 'storer';
|
|
14
41
|
#lc;
|
|
15
42
|
#db;
|
|
43
|
+
#replicaVersion;
|
|
16
44
|
#onCommit;
|
|
17
45
|
#queue = new Queue();
|
|
18
46
|
stopped = resolver();
|
|
19
|
-
constructor(lc, db, onCommit) {
|
|
47
|
+
constructor(lc, db, replicaVersion, onCommit) {
|
|
20
48
|
this.#lc = lc;
|
|
21
49
|
this.#db = db;
|
|
50
|
+
this.#replicaVersion = replicaVersion;
|
|
22
51
|
this.#onCommit = onCommit;
|
|
23
52
|
}
|
|
24
53
|
async getLastStoredWatermark() {
|
|
25
54
|
const result = await this.#db `SELECT MAX(watermark) as max FROM cdc."changeLog"`;
|
|
26
55
|
return result[0].max;
|
|
27
56
|
}
|
|
57
|
+
async purgeRecordsBefore(watermark) {
|
|
58
|
+
// This is a sanity check to guarantee the invariant of the "changeLog"
|
|
59
|
+
// that it always contains at least one entry (from which catchup can proceed),
|
|
60
|
+
// unless no replication changes have flowed through the system
|
|
61
|
+
// (i.e. watermark === replicaVersion).
|
|
62
|
+
const exists = await this.#db `
|
|
63
|
+
SELECT watermark FROM cdc."changeLog" WHERE watermark = ${watermark}`;
|
|
64
|
+
// Watermark boundaries should always be "commit" entries, which are the sole
|
|
65
|
+
// entry with that watermark (i.e. exists.length === 1). It follows that
|
|
66
|
+
// catchup, which proceeds from the next entry, always starts with a
|
|
67
|
+
// "begin" entry.
|
|
68
|
+
if (exists.length !== 1 && watermark !== this.#replicaVersion) {
|
|
69
|
+
this.#lc.warn?.(`rejecting attempted to purge up to watermark ${watermark} with ${exists.length} entries`);
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
const result = await this.#db `
|
|
73
|
+
WITH purged AS (
|
|
74
|
+
DELETE FROM cdc."changeLog" WHERE watermark < ${watermark}
|
|
75
|
+
RETURNING watermark, pos
|
|
76
|
+
) SELECT COUNT(*) as deleted FROM purged;`;
|
|
77
|
+
return Number(result[0].deleted);
|
|
78
|
+
}
|
|
28
79
|
store(entry) {
|
|
29
80
|
void this.#queue.enqueue(['change', entry]);
|
|
30
81
|
}
|
|
@@ -100,6 +151,14 @@ export class Storer {
|
|
|
100
151
|
// concurrently catchup any queued subscribers.
|
|
101
152
|
this.#processCatchup(catchupQueue.splice(0));
|
|
102
153
|
}
|
|
154
|
+
else if (tag === 'rollback') {
|
|
155
|
+
// Aborted transactions are not stored in the changeLog. Abort the current tx
|
|
156
|
+
// and process catchup of subscribers that were waiting for it to end.
|
|
157
|
+
tx.pool.abort();
|
|
158
|
+
await tx.pool.done();
|
|
159
|
+
tx = null;
|
|
160
|
+
this.#processCatchup(catchupQueue.splice(0));
|
|
161
|
+
}
|
|
103
162
|
}
|
|
104
163
|
this.#lc.info?.('storer stopped');
|
|
105
164
|
}
|
|
@@ -117,20 +176,41 @@ export class Storer {
|
|
|
117
176
|
try {
|
|
118
177
|
await reader.processReadTask(async (tx) => {
|
|
119
178
|
const start = Date.now();
|
|
179
|
+
// When starting from initial-sync, there won't be a change with a watermark
|
|
180
|
+
// equal to the replica version. This is the empty changeLog scenario.
|
|
181
|
+
let watermarkFound = sub.watermark === this.#replicaVersion;
|
|
120
182
|
let count = 0;
|
|
121
183
|
for await (const entries of tx `
|
|
122
184
|
SELECT watermark, change FROM cdc."changeLog"
|
|
123
|
-
WHERE watermark
|
|
185
|
+
WHERE watermark >= ${sub.watermark}
|
|
124
186
|
ORDER BY watermark, pos`.cursor(10000)) {
|
|
125
187
|
for (const entry of entries) {
|
|
126
|
-
sub.
|
|
127
|
-
|
|
188
|
+
if (entry.watermark === sub.watermark) {
|
|
189
|
+
// This should be the first entry.
|
|
190
|
+
// Catchup starts from *after* the watermark.
|
|
191
|
+
watermarkFound = true;
|
|
192
|
+
}
|
|
193
|
+
else if (watermarkFound) {
|
|
194
|
+
sub.catchup(toDownstream(entry));
|
|
195
|
+
count++;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
this.#lc.warn?.(`rejecting subscriber at watermark ${sub.watermark}`);
|
|
199
|
+
sub.close(ErrorType.WatermarkTooOld, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
128
202
|
}
|
|
129
203
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
204
|
+
if (watermarkFound) {
|
|
205
|
+
// Flushes the backlog of messages buffered during catchup and
|
|
206
|
+
// allows the subscription to forward subsequent messages immediately.
|
|
207
|
+
sub.setCaughtUp();
|
|
208
|
+
this.#lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this.#lc.warn?.(`rejecting subscriber at watermark ${sub.watermark}`);
|
|
212
|
+
sub.close(ErrorType.WatermarkNotFound, `cannot catch up from requested watermark ${sub.watermark}`);
|
|
213
|
+
}
|
|
134
214
|
});
|
|
135
215
|
}
|
|
136
216
|
catch (err) {
|
|
@@ -150,6 +230,8 @@ function toDownstream(entry) {
|
|
|
150
230
|
return [watermark, ['begin', change]];
|
|
151
231
|
case 'commit':
|
|
152
232
|
return [watermark, ['commit', change, { watermark }]];
|
|
233
|
+
case 'rollback':
|
|
234
|
+
return [watermark, ['rollback', change]];
|
|
153
235
|
default:
|
|
154
236
|
return [watermark, ['data', change]];
|
|
155
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAC,KAAK,EAAC,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAC,WAAW,EAAC,MAAM,6CAA6C,CAAC;AACxE,OAAO,EAAC,IAAI,EAAE,eAAe,EAAC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export declare class Subscriber {
|
|
|
13
13
|
readonly id: string;
|
|
14
14
|
constructor(id: string, watermark: string, downstream: Subscription<Downstream>);
|
|
15
15
|
get watermark(): string;
|
|
16
|
+
get acked(): string;
|
|
16
17
|
send(change: WatermarkedChange): void;
|
|
17
18
|
/** catchup() is called on ChangeEntries loaded from the store. */
|
|
18
19
|
catchup(change: WatermarkedChange): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,KAAK,UAAU,EAAE,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAOlB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC;IAStC,IAAI,SAAS,WAEZ;IAED,IAAI,KAAK,WAER;IAED,IAAI,CAAC,MAAM,EAAE,iBAAiB;IAW9B,kEAAkE;IAClE,OAAO,CAAC,MAAM,EAAE,iBAAiB;IAIjC;;;OAGG;IACH,WAAW;IAuBX,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO;IAIlB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAS1C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assert } from '../../../../shared/src/asserts.js';
|
|
2
|
+
import { max } from '../../types/lexi-version.js';
|
|
2
3
|
import { Subscription } from '../../types/subscription.js';
|
|
3
4
|
import { ErrorType } from './change-streamer.js';
|
|
4
5
|
/**
|
|
@@ -12,16 +13,21 @@ export class Subscriber {
|
|
|
12
13
|
id;
|
|
13
14
|
#downstream;
|
|
14
15
|
#watermark;
|
|
16
|
+
#acked;
|
|
15
17
|
#backlog;
|
|
16
18
|
constructor(id, watermark, downstream) {
|
|
17
19
|
this.id = id;
|
|
18
20
|
this.#downstream = downstream;
|
|
19
21
|
this.#watermark = watermark;
|
|
22
|
+
this.#acked = watermark;
|
|
20
23
|
this.#backlog = [];
|
|
21
24
|
}
|
|
22
25
|
get watermark() {
|
|
23
26
|
return this.#watermark;
|
|
24
27
|
}
|
|
28
|
+
get acked() {
|
|
29
|
+
return this.#acked;
|
|
30
|
+
}
|
|
25
31
|
send(change) {
|
|
26
32
|
const [watermark] = change;
|
|
27
33
|
if (watermark > this.#watermark) {
|
|
@@ -51,9 +57,14 @@ export class Subscriber {
|
|
|
51
57
|
#send(change) {
|
|
52
58
|
const [watermark, downstream] = change;
|
|
53
59
|
if (watermark > this.watermark) {
|
|
54
|
-
this.#downstream.push(downstream);
|
|
60
|
+
const { result } = this.#downstream.push(downstream);
|
|
55
61
|
if (downstream[0] === 'commit') {
|
|
56
62
|
this.#watermark = watermark;
|
|
63
|
+
void result.then(val => {
|
|
64
|
+
if (val === 'consumed') {
|
|
65
|
+
this.#acked = max(this.#acked, watermark);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
57
68
|
}
|
|
58
69
|
}
|
|
59
70
|
}
|
|
@@ -62,9 +73,13 @@ export class Subscriber {
|
|
|
62
73
|
}
|
|
63
74
|
close(error, message) {
|
|
64
75
|
if (error) {
|
|
65
|
-
this.#downstream.push(['error', { type: error, message }]);
|
|
76
|
+
const { result } = this.#downstream.push(['error', { type: error, message }]);
|
|
77
|
+
// Wait for the ACK of the error message before closing the connection.
|
|
78
|
+
void result.then(() => this.#downstream.cancel());
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.#downstream.cancel();
|
|
66
82
|
}
|
|
67
|
-
this.#downstream.cancel();
|
|
68
83
|
}
|
|
69
84
|
}
|
|
70
85
|
//# sourceMappingURL=subscriber.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EAAkB,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACZ,EAAE,CAAS;IACX,WAAW,CAA2B;IAC/C,UAAU,CAAS;IACnB,QAAQ,CAA6B;IAErC,YACE,EAAU,EACV,SAAiB,EACjB,UAAoC;QAEpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAyB;QAC5B,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,OAAO,CAAC,MAAyB;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAyB;QAC7B,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC;QACvC,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import type { Worker } from '../../types/processes.js';
|
|
3
3
|
import { HttpService, type Options } from '../http-service.js';
|
|
4
|
-
export declare const CONNECT_URL_PATTERN = "/api/sync/:version/connect";
|
|
5
4
|
export type Workers = {
|
|
6
5
|
syncers: Worker[];
|
|
7
6
|
};
|
|
8
|
-
export declare const DEFAULT_PORT = 4848;
|
|
9
7
|
export declare class Dispatcher extends HttpService {
|
|
10
8
|
#private;
|
|
11
9
|
readonly id = "dispatcher";
|
|
12
|
-
constructor(lc: LogContext, workersByHostname: (hostname: string) => Workers, opts
|
|
10
|
+
constructor(lc: LogContext, workersByHostname: (hostname: string) => Workers, opts: Options);
|
|
13
11
|
}
|
|
12
|
+
export declare function parseSyncPath(url: URL): {
|
|
13
|
+
base?: string;
|
|
14
|
+
version: string;
|
|
15
|
+
} | undefined;
|
|
14
16
|
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAI5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAC,WAAW,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAU7D,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,qBAAa,UAAW,SAAQ,WAAW;;IACzC,QAAQ,CAAC,EAAE,gBAAgB;gBAIzB,EAAE,EAAE,UAAU,EACd,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAChD,IAAI,EAAE,OAAO;CAmChB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,GACP;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAG9C"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import { IncomingMessage } from 'http';
|
|
3
|
+
import UrlPattern from 'url-pattern';
|
|
3
4
|
import { h32 } from '../../../../shared/src/xxhash.js';
|
|
4
5
|
import { HttpService } from '../http-service.js';
|
|
5
6
|
import { getConnectParams } from './connect-params.js';
|
|
6
7
|
import { installWebSocketHandoff } from './websocket-handoff.js';
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
// The server allows the client to use any /:base/ path to facilitate
|
|
9
|
+
// servicing requests on the same domain as the application.
|
|
10
|
+
const CONNECT_URL_PATTERN = new UrlPattern('(/:base)/sync/:version/connect');
|
|
11
|
+
const SUPPORTED_VERSION = 'v1';
|
|
9
12
|
export class Dispatcher extends HttpService {
|
|
10
13
|
id = 'dispatcher';
|
|
11
14
|
#workersByHostname;
|
|
12
|
-
constructor(lc, workersByHostname, opts
|
|
15
|
+
constructor(lc, workersByHostname, opts) {
|
|
13
16
|
super('dispatcher', lc, opts, fastify => {
|
|
14
17
|
fastify.get('/', (_req, res) => res.send('OK'));
|
|
15
18
|
installWebSocketHandoff(fastify.server, req => this.#handoff(req));
|
|
@@ -17,8 +20,16 @@ export class Dispatcher extends HttpService {
|
|
|
17
20
|
this.#workersByHostname = workersByHostname;
|
|
18
21
|
}
|
|
19
22
|
#handoff(req) {
|
|
20
|
-
const { headers, url } = req;
|
|
21
|
-
const
|
|
23
|
+
const { headers, url: u } = req;
|
|
24
|
+
const url = new URL(u ?? '', 'http://unused/');
|
|
25
|
+
const syncPath = parseSyncPath(url);
|
|
26
|
+
if (!syncPath) {
|
|
27
|
+
throw new Error(`Invalid sync URL: ${u}`);
|
|
28
|
+
}
|
|
29
|
+
if (syncPath.version !== SUPPORTED_VERSION) {
|
|
30
|
+
throw new Error(`Unsupported sync version: ${u}`);
|
|
31
|
+
}
|
|
32
|
+
const { params, error } = getConnectParams(url, headers);
|
|
22
33
|
if (error !== null) {
|
|
23
34
|
throw new Error(error);
|
|
24
35
|
}
|
|
@@ -33,4 +44,8 @@ export class Dispatcher extends HttpService {
|
|
|
33
44
|
return { payload: params, receiver: syncers[syncer] };
|
|
34
45
|
}
|
|
35
46
|
}
|
|
47
|
+
export function parseSyncPath(url) {
|
|
48
|
+
// The match() returns both null and undefined.
|
|
49
|
+
return CONNECT_URL_PATTERN.match(url.pathname) || undefined;
|
|
50
|
+
}
|
|
36
51
|
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,kCAAkC,CAAC;AAErD,OAAO,EAAC,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,uBAAuB,EAAC,MAAM,wBAAwB,CAAC;AAE/D,
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import type { LogContext } from '@rocicorp/logger';
|
|
|
2
2
|
import type { JWTPayload } from 'jose';
|
|
3
3
|
import postgres from 'postgres';
|
|
4
4
|
import { ErrorKind } from '../../../../zero-protocol/src/mod.js';
|
|
5
|
-
import { type
|
|
5
|
+
import { type InsertOp, type Mutation, type UpsertOp } from '../../../../zero-protocol/src/push.js';
|
|
6
|
+
import type { AuthorizationConfig } from '../../../../zero-schema/src/compiled-authorization.js';
|
|
6
7
|
import { type ZeroConfig } from '../../config/zero-config.js';
|
|
7
8
|
import type { PostgresDB } from '../../types/pg.js';
|
|
8
9
|
import type { Service } from '../service.js';
|
|
@@ -17,12 +18,12 @@ export interface Mutagen {
|
|
|
17
18
|
export declare class MutagenService implements Mutagen, Service {
|
|
18
19
|
#private;
|
|
19
20
|
readonly id: string;
|
|
20
|
-
constructor(lc: LogContext, shardID: string, clientGroupID: string, upstream: PostgresDB, config: ZeroConfig);
|
|
21
|
+
constructor(lc: LogContext, shardID: string, clientGroupID: string, upstream: PostgresDB, config: ZeroConfig, authorizationConfig: AuthorizationConfig);
|
|
21
22
|
processMutation(mutation: Mutation, authData: JWTPayload, schemaVersion: number): Promise<MutationError | undefined>;
|
|
22
23
|
run(): Promise<void>;
|
|
23
24
|
stop(): Promise<void>;
|
|
24
25
|
}
|
|
25
|
-
export declare function processMutation(lc: LogContext | undefined, authData: JWTPayload, db: PostgresDB, shardID: string, clientGroupID: string, mutation: Mutation, writeAuthorizer: WriteAuthorizer, schemaVersion: number, onTxStart?: () => void): Promise<MutationError | undefined>;
|
|
26
|
-
export declare function
|
|
27
|
-
export declare function
|
|
26
|
+
export declare function processMutation(lc: LogContext | undefined, authData: JWTPayload, db: PostgresDB, shardID: string, clientGroupID: string, mutation: Mutation, writeAuthorizer: WriteAuthorizer, schemaVersion: number, onTxStart?: () => void | Promise<void>): Promise<MutationError | undefined>;
|
|
27
|
+
export declare function getInsertSQL(tx: postgres.TransactionSql, create: InsertOp): postgres.PendingQuery<postgres.Row[]>;
|
|
28
|
+
export declare function getUpsertSQL(tx: postgres.TransactionSql, set: UpsertOp): postgres.PendingQuery<postgres.Row[]>;
|
|
28
29
|
//# sourceMappingURL=mutagen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutagen.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/mutagen/mutagen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,EAAC,SAAS,EAAC,MAAM,sCAAsC,CAAC;AAK/D,OAAO,
|
|
1
|
+
{"version":3,"file":"mutagen.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/mutagen/mutagen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,EAAC,SAAS,EAAC,MAAM,sCAAsC,CAAC;AAK/D,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,uDAAuD,CAAC;AAE/F,OAAO,EAAC,KAAK,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAG5D,OAAO,KAAK,EAAC,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAsB,KAAK,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAIhF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,mBAAmB;IAC9D,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CACvC;AAED,qBAAa,cAAe,YAAW,OAAO,EAAE,OAAO;;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAUlB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,UAAU,EAClB,mBAAmB,EAAE,mBAAmB;IA4B1C,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAmBrC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAItB;AAID,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,GAAG,SAAS,EAC1B,QAAQ,EAAE,UAAU,EACpB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAyGpC;AAwED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,MAAM,EAAE,QAAQ,GACf,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAEvC;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,GAAG,EAAE,QAAQ,GACZ,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAOvC"}
|