hikoutei 0.2.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/LICENSE +21 -0
- package/README.ja.md +135 -0
- package/README.ko.md +138 -0
- package/README.md +143 -0
- package/apps-script/gateway/Code.gs +412 -0
- package/dist/adapter/persistence/contracts/index.d.ts +3 -0
- package/dist/adapter/persistence/contracts/index.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/index.js +3 -0
- package/dist/adapter/persistence/contracts/index.js.map +1 -0
- package/dist/adapter/persistence/contracts/sql.d.ts +50 -0
- package/dist/adapter/persistence/contracts/sql.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/sql.js +9 -0
- package/dist/adapter/persistence/contracts/sql.js.map +1 -0
- package/dist/adapter/persistence/index.d.ts +2 -0
- package/dist/adapter/persistence/index.d.ts.map +1 -0
- package/dist/adapter/persistence/index.js +2 -0
- package/dist/adapter/persistence/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts +53 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js +105 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +39 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js +54 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts +38 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js +55 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts +16 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js +9 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts +27 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts +19 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts +78 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js +121 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts +20 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js +125 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js +51 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +22 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js +161 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts +3 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +692 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts +29 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +538 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js +190 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts +23 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js +166 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts +50 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js +60 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts +44 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js +40 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts +7 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js +47 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js +54 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js +2 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts +10 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js +35 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts +67 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js +204 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +78 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +343 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +1 -0
- package/dist/application/index.d.ts +4 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +4 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts +71 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.js +116 -0
- package/dist/application/orm/api/TypedSheetsOrm.js.map +1 -0
- package/dist/application/orm/api/contracts.d.ts +118 -0
- package/dist/application/orm/api/contracts.d.ts.map +1 -0
- package/dist/application/orm/api/contracts.js +21 -0
- package/dist/application/orm/api/contracts.js.map +1 -0
- package/dist/application/orm/errors.d.ts +35 -0
- package/dist/application/orm/errors.d.ts.map +1 -0
- package/dist/application/orm/errors.js +35 -0
- package/dist/application/orm/errors.js.map +1 -0
- package/dist/application/orm/index.d.ts +13 -0
- package/dist/application/orm/index.d.ts.map +1 -0
- package/dist/application/orm/index.js +7 -0
- package/dist/application/orm/index.js.map +1 -0
- package/dist/application/orm/mapping/contracts.d.ts +113 -0
- package/dist/application/orm/mapping/contracts.d.ts.map +1 -0
- package/dist/application/orm/mapping/contracts.js +8 -0
- package/dist/application/orm/mapping/contracts.js.map +1 -0
- package/dist/application/orm/mapping/definition.d.ts +16 -0
- package/dist/application/orm/mapping/definition.d.ts.map +1 -0
- package/dist/application/orm/mapping/definition.js +145 -0
- package/dist/application/orm/mapping/definition.js.map +1 -0
- package/dist/application/orm/mapping/entityMapping.d.ts +13 -0
- package/dist/application/orm/mapping/entityMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/entityMapping.js +13 -0
- package/dist/application/orm/mapping/entityMapping.js.map +1 -0
- package/dist/application/orm/mapping/identity.d.ts +14 -0
- package/dist/application/orm/mapping/identity.d.ts.map +1 -0
- package/dist/application/orm/mapping/identity.js +37 -0
- package/dist/application/orm/mapping/identity.js.map +1 -0
- package/dist/application/orm/mapping/observationMapping.d.ts +42 -0
- package/dist/application/orm/mapping/observationMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/observationMapping.js +65 -0
- package/dist/application/orm/mapping/observationMapping.js.map +1 -0
- package/dist/application/orm/mapping/projection.d.ts +22 -0
- package/dist/application/orm/mapping/projection.d.ts.map +1 -0
- package/dist/application/orm/mapping/projection.js +74 -0
- package/dist/application/orm/mapping/projection.js.map +1 -0
- package/dist/application/orm/mapping/registry.d.ts +15 -0
- package/dist/application/orm/mapping/registry.d.ts.map +1 -0
- package/dist/application/orm/mapping/registry.js +38 -0
- package/dist/application/orm/mapping/registry.js.map +1 -0
- package/dist/application/orm/mapping/values.d.ts +17 -0
- package/dist/application/orm/mapping/values.d.ts.map +1 -0
- package/dist/application/orm/mapping/values.js +141 -0
- package/dist/application/orm/mapping/values.js.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +28 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js +170 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts +9 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js +8 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts +12 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js +134 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts +21 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js +203 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts +17 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.js +72 -0
- package/dist/application/orm/persistence/support/businessKeys.js.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts +22 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.js +88 -0
- package/dist/application/orm/persistence/support/canonicalState.js.map +1 -0
- package/dist/application/orm/persistence/support/contracts.d.ts +139 -0
- package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/contracts.js +93 -0
- package/dist/application/orm/persistence/support/contracts.js.map +1 -0
- package/dist/application/orm/persistence/support/helpers.d.ts +32 -0
- package/dist/application/orm/persistence/support/helpers.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/helpers.js +66 -0
- package/dist/application/orm/persistence/support/helpers.js.map +1 -0
- package/dist/application/orm/persistence/support/timing.d.ts +20 -0
- package/dist/application/orm/persistence/support/timing.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/timing.js +55 -0
- package/dist/application/orm/persistence/support/timing.js.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts +46 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js +93 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js.map +1 -0
- package/dist/application/sync/gateway/constants.d.ts +65 -0
- package/dist/application/sync/gateway/constants.d.ts.map +1 -0
- package/dist/application/sync/gateway/constants.js +57 -0
- package/dist/application/sync/gateway/constants.js.map +1 -0
- package/dist/application/sync/gateway/errors.d.ts +15 -0
- package/dist/application/sync/gateway/errors.d.ts.map +1 -0
- package/dist/application/sync/gateway/errors.js +16 -0
- package/dist/application/sync/gateway/errors.js.map +1 -0
- package/dist/application/sync/gateway/syncGateway.d.ts +313 -0
- package/dist/application/sync/gateway/syncGateway.d.ts.map +1 -0
- package/dist/application/sync/gateway/syncGateway.js +202 -0
- package/dist/application/sync/gateway/syncGateway.js.map +1 -0
- package/dist/application/sync/gateway/validation.d.ts +17 -0
- package/dist/application/sync/gateway/validation.d.ts.map +1 -0
- package/dist/application/sync/gateway/validation.js +60 -0
- package/dist/application/sync/gateway/validation.js.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +72 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js +272 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js.map +1 -0
- package/dist/application/sync/index.d.ts +16 -0
- package/dist/application/sync/index.d.ts.map +1 -0
- package/dist/application/sync/index.js +9 -0
- package/dist/application/sync/index.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +106 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +297 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +100 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js +345 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +46 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +63 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +20 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +102 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +19 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +32 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +30 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +202 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +17 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +80 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +13 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +205 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +81 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +245 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +77 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +518 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts +50 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.js +22 -0
- package/dist/application/sync/telemetry/syncTiming.js.map +1 -0
- package/dist/domain/conflict/errors.d.ts +42 -0
- package/dist/domain/conflict/errors.d.ts.map +1 -0
- package/dist/domain/conflict/errors.js +36 -0
- package/dist/domain/conflict/errors.js.map +1 -0
- package/dist/domain/conflict/index.d.ts +5 -0
- package/dist/domain/conflict/index.d.ts.map +1 -0
- package/dist/domain/conflict/index.js +3 -0
- package/dist/domain/conflict/index.js.map +1 -0
- package/dist/domain/conflict/transitions.d.ts +52 -0
- package/dist/domain/conflict/transitions.d.ts.map +1 -0
- package/dist/domain/conflict/transitions.js +115 -0
- package/dist/domain/conflict/transitions.js.map +1 -0
- package/dist/domain/errors/evaluation.d.ts +13 -0
- package/dist/domain/errors/evaluation.d.ts.map +1 -0
- package/dist/domain/errors/evaluation.js +14 -0
- package/dist/domain/errors/evaluation.js.map +1 -0
- package/dist/domain/errors/identity.d.ts +12 -0
- package/dist/domain/errors/identity.d.ts.map +1 -0
- package/dist/domain/errors/identity.js +15 -0
- package/dist/domain/errors/identity.js.map +1 -0
- package/dist/domain/errors/index.d.ts +7 -0
- package/dist/domain/errors/index.d.ts.map +1 -0
- package/dist/domain/errors/index.js +5 -0
- package/dist/domain/errors/index.js.map +1 -0
- package/dist/domain/errors/stableEncoding.d.ts +7 -0
- package/dist/domain/errors/stableEncoding.d.ts.map +1 -0
- package/dist/domain/errors/stableEncoding.js +8 -0
- package/dist/domain/errors/stableEncoding.js.map +1 -0
- package/dist/domain/errors/types.d.ts +20 -0
- package/dist/domain/errors/types.d.ts.map +1 -0
- package/dist/domain/errors/types.js +18 -0
- package/dist/domain/errors/types.js.map +1 -0
- package/dist/domain/evaluate/constants.d.ts +55 -0
- package/dist/domain/evaluate/constants.d.ts.map +1 -0
- package/dist/domain/evaluate/constants.js +41 -0
- package/dist/domain/evaluate/constants.js.map +1 -0
- package/dist/domain/evaluate/contracts.d.ts +125 -0
- package/dist/domain/evaluate/contracts.d.ts.map +1 -0
- package/dist/domain/evaluate/contracts.js +8 -0
- package/dist/domain/evaluate/contracts.js.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts +11 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.js +91 -0
- package/dist/domain/evaluate/evaluateBatch.js.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts +14 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.js +133 -0
- package/dist/domain/evaluate/fieldEvaluation.js.map +1 -0
- package/dist/domain/evaluate/identity.d.ts +21 -0
- package/dist/domain/evaluate/identity.d.ts.map +1 -0
- package/dist/domain/evaluate/identity.js +72 -0
- package/dist/domain/evaluate/identity.js.map +1 -0
- package/dist/domain/evaluate/index.d.ts +4 -0
- package/dist/domain/evaluate/index.d.ts.map +1 -0
- package/dist/domain/evaluate/index.js +3 -0
- package/dist/domain/evaluate/index.js.map +1 -0
- package/dist/domain/evaluate/preconditions.d.ts +30 -0
- package/dist/domain/evaluate/preconditions.d.ts.map +1 -0
- package/dist/domain/evaluate/preconditions.js +389 -0
- package/dist/domain/evaluate/preconditions.js.map +1 -0
- package/dist/domain/evaluate/quarantine.d.ts +15 -0
- package/dist/domain/evaluate/quarantine.d.ts.map +1 -0
- package/dist/domain/evaluate/quarantine.js +185 -0
- package/dist/domain/evaluate/quarantine.js.map +1 -0
- package/dist/domain/index.d.ts +7 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/model/constants.d.ts +73 -0
- package/dist/domain/model/constants.d.ts.map +1 -0
- package/dist/domain/model/constants.js +59 -0
- package/dist/domain/model/constants.js.map +1 -0
- package/dist/domain/model/index.d.ts +3 -0
- package/dist/domain/model/index.d.ts.map +1 -0
- package/dist/domain/model/index.js +2 -0
- package/dist/domain/model/index.js.map +1 -0
- package/dist/domain/model/types.d.ts +330 -0
- package/dist/domain/model/types.d.ts.map +1 -0
- package/dist/domain/model/types.js +8 -0
- package/dist/domain/model/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +3 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +3 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/storage/constants.d.ts +4 -0
- package/dist/infrastructure/storage/constants.d.ts.map +1 -0
- package/dist/infrastructure/storage/constants.js +4 -0
- package/dist/infrastructure/storage/constants.js.map +1 -0
- package/dist/infrastructure/storage/errors.d.ts +55 -0
- package/dist/infrastructure/storage/errors.d.ts.map +1 -0
- package/dist/infrastructure/storage/errors.js +58 -0
- package/dist/infrastructure/storage/errors.js.map +1 -0
- package/dist/infrastructure/storage/index.d.ts +23 -0
- package/dist/infrastructure/storage/index.d.ts.map +1 -0
- package/dist/infrastructure/storage/index.js +13 -0
- package/dist/infrastructure/storage/index.js.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts +64 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js +148 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts +49 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.js +529 -0
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts +5 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js +2 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts +9 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js +122 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js +14 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js +24 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts +44 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js +66 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +101 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +417 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts +16 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js +85 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +31 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js +439 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts +53 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js +41 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts +49 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js +537 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +15 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js +100 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +124 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js +13 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js +223 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js +293 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts +58 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js +195 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +31 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +563 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +118 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js +18 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +23 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +84 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +16 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +97 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +137 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +396 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +101 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +9 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +21 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +184 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +25 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +158 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +69 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js +272 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +90 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js +282 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js.map +1 -0
- package/dist/shared/constants.d.ts +8 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +8 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/encoding/constants.d.ts +45 -0
- package/dist/shared/encoding/constants.d.ts.map +1 -0
- package/dist/shared/encoding/constants.js +37 -0
- package/dist/shared/encoding/constants.js.map +1 -0
- package/dist/shared/encoding/index.d.ts +6 -0
- package/dist/shared/encoding/index.d.ts.map +1 -0
- package/dist/shared/encoding/index.js +4 -0
- package/dist/shared/encoding/index.js.map +1 -0
- package/dist/shared/encoding/stableEncode.d.ts +34 -0
- package/dist/shared/encoding/stableEncode.d.ts.map +1 -0
- package/dist/shared/encoding/stableEncode.js +210 -0
- package/dist/shared/encoding/stableEncode.js.map +1 -0
- package/dist/shared/encoding/typeGuards.d.ts +15 -0
- package/dist/shared/encoding/typeGuards.d.ts.map +1 -0
- package/dist/shared/encoding/typeGuards.js +11 -0
- package/dist/shared/encoding/typeGuards.js.map +1 -0
- package/dist/shared/encoding/types.d.ts +52 -0
- package/dist/shared/encoding/types.d.ts.map +1 -0
- package/dist/shared/encoding/types.js +8 -0
- package/dist/shared/encoding/types.js.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +6 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/state/constants.d.ts +16 -0
- package/dist/shared/state/constants.d.ts.map +1 -0
- package/dist/shared/state/constants.js +16 -0
- package/dist/shared/state/constants.js.map +1 -0
- package/dist/shared/state/index.d.ts +3 -0
- package/dist/shared/state/index.d.ts.map +1 -0
- package/dist/shared/state/index.js +2 -0
- package/dist/shared/state/index.js.map +1 -0
- package/dist/shared/state/types.d.ts +23 -0
- package/dist/shared/state/types.d.ts.map +1 -0
- package/dist/shared/state/types.js +2 -0
- package/dist/shared/state/types.js.map +1 -0
- package/dist/shared/validation.d.ts +9 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +25 -0
- package/dist/shared/validation.js.map +1 -0
- package/docs/architecture.md +72 -0
- package/docs/code-guidelines.md +256 -0
- package/docs/development.md +48 -0
- package/docs/git-workflow.md +224 -0
- package/docs/mikro-orm-adapter-spike.md +248 -0
- package/docs/quick-start.md +102 -0
- package/docs/sql-layer-plan.md +59 -0
- package/docs/sync-bulk-write-benchmark.md +1036 -0
- package/docs/sync-observability.md +71 -0
- package/docs/task-queue-write-model.md +640 -0
- package/docs/typed-sheets-mvp-scope-2026-06-29.md +490 -0
- package/docs/typed-sheets-plan.md +417 -0
- package/docs/write-and-synchronization-flow.md +71 -0
- package/package.json +68 -0
package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/** Lightweight table reads for polling user-visible Sheet values. */
|
|
2
|
+
import { NORMALIZED_CELL_KINDS } from "../../../../../../shared/encoding/constants.js";
|
|
3
|
+
import { isRecord } from "../../../../../../shared/encoding/typeGuards.js";
|
|
4
|
+
import { SYNC_GATEWAY_ERROR_CODES, } from "../../../../../../application/sync/gateway/errors.js";
|
|
5
|
+
import { requireSyncGatewayPositiveSafeInteger, requireSyncGatewayText, } from "../../../../../../application/sync/gateway/validation.js";
|
|
6
|
+
import { decodeOptionalSyncGatewayTiming } from "../../protocol/timing.js";
|
|
7
|
+
import { invalidOperationRequest, invalidOperationResponse } from "../../errors.js";
|
|
8
|
+
/** Builds a read-only operation that performs one range `getValues()` call. */
|
|
9
|
+
export function createReadTableRowsOperation(request) {
|
|
10
|
+
validateRequest(request);
|
|
11
|
+
return {
|
|
12
|
+
fn: READ_TABLE_ROWS_OPERATION_SOURCE,
|
|
13
|
+
args: request,
|
|
14
|
+
decode: (value) => decodeResult(value, request),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const READ_TABLE_ROWS_OPERATION_SOURCE = String.raw `function (spreadsheet, args) {
|
|
18
|
+
var startedAt = Date.now();
|
|
19
|
+
var phases = [];
|
|
20
|
+
var validationStartedAt = Date.now();
|
|
21
|
+
if (!args || typeof args.sheetName !== "string" || args.sheetName.length === 0) {
|
|
22
|
+
throw new Error("table read sheetName is required");
|
|
23
|
+
}
|
|
24
|
+
if (!Array.isArray(args.headers) || args.headers.length === 0) {
|
|
25
|
+
throw new Error("table read headers are required");
|
|
26
|
+
}
|
|
27
|
+
phase_("validate_input", validationStartedAt);
|
|
28
|
+
|
|
29
|
+
var sheetLookupStartedAt = Date.now();
|
|
30
|
+
var sheet = spreadsheet.getSheetByName(args.sheetName);
|
|
31
|
+
if (sheet === null) throw new Error("table read sheet was not found: " + args.sheetName);
|
|
32
|
+
phase_("sheet_lookup", sheetLookupStartedAt);
|
|
33
|
+
|
|
34
|
+
var rangeStartedAt = Date.now();
|
|
35
|
+
var parsed = parseRange_(args.registeredRange);
|
|
36
|
+
var lastRow = Math.max(sheet.getLastRow(), 1);
|
|
37
|
+
phase_("range_lookup", rangeStartedAt);
|
|
38
|
+
|
|
39
|
+
var valuesStartedAt = Date.now();
|
|
40
|
+
var values = lastRow > 1
|
|
41
|
+
? sheet.getRange(2, parsed.startColumn, lastRow - 1, parsed.columnCount).getValues()
|
|
42
|
+
: [];
|
|
43
|
+
phase_("values_read", valuesStartedAt);
|
|
44
|
+
|
|
45
|
+
var rowsStartedAt = Date.now();
|
|
46
|
+
var rows = [];
|
|
47
|
+
values.forEach(function (row, offset) {
|
|
48
|
+
if (isBlankRow_(row)) return;
|
|
49
|
+
var fields = Object.create(null);
|
|
50
|
+
args.headers.forEach(function (header, columnIndex) {
|
|
51
|
+
fields[header] = toNormalizedCell_(row[columnIndex]);
|
|
52
|
+
});
|
|
53
|
+
rows.push({ rowNumber: offset + 2, fields: fields });
|
|
54
|
+
});
|
|
55
|
+
phase_("row_normalization", rowsStartedAt);
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
sheetName: args.sheetName,
|
|
59
|
+
registeredRange: args.registeredRange,
|
|
60
|
+
headers: args.headers,
|
|
61
|
+
rows: rows,
|
|
62
|
+
timing: {
|
|
63
|
+
operationKinds: [],
|
|
64
|
+
operationCounts: { append: 0, update: 0, delete: 0 },
|
|
65
|
+
durationMs: Date.now() - startedAt,
|
|
66
|
+
phases: phases,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
function parseRange_(value) {
|
|
71
|
+
if (typeof value !== "string" || !/^[A-Z]+:[A-Z]+$/.test(value)) {
|
|
72
|
+
throw new Error("table read registeredRange must be an uppercase whole-column range");
|
|
73
|
+
}
|
|
74
|
+
var parts = value.split(":");
|
|
75
|
+
var startColumn = columnNumber_(parts[0]);
|
|
76
|
+
var endColumn = columnNumber_(parts[1]);
|
|
77
|
+
if (endColumn < startColumn) throw new Error("table read range end precedes start");
|
|
78
|
+
return { startColumn: startColumn, columnCount: endColumn - startColumn + 1 };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function columnNumber_(letters) {
|
|
82
|
+
var value = 0;
|
|
83
|
+
for (var index = 0; index < letters.length; index += 1) {
|
|
84
|
+
value = value * 26 + letters.charCodeAt(index) - 64;
|
|
85
|
+
}
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function isBlankRow_(row) {
|
|
90
|
+
return row.every(function (cell) { return cell === "" || cell === null; });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function toNormalizedCell_(value) {
|
|
94
|
+
if (value === "" || value === null || value === undefined) return null;
|
|
95
|
+
if (Object.prototype.toString.call(value) === "[object Date]") {
|
|
96
|
+
if (isNaN(value.getTime())) throw new Error("table read date value is invalid");
|
|
97
|
+
return { kind: "date", value: value.toISOString() };
|
|
98
|
+
}
|
|
99
|
+
if (typeof value === "string") return { kind: "string", value: value.normalize("NFC") };
|
|
100
|
+
if (typeof value === "number" && isFinite(value)) return { kind: "number", value: value };
|
|
101
|
+
if (typeof value === "boolean") return { kind: "boolean", value: value };
|
|
102
|
+
throw new Error("table read cell value is unsupported");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function phase_(name, phaseStartedAt) {
|
|
106
|
+
phases.push({ phase: name, durationMs: Date.now() - phaseStartedAt });
|
|
107
|
+
}
|
|
108
|
+
}`;
|
|
109
|
+
function validateRequest(request) {
|
|
110
|
+
if (request.sheetName.trim().length === 0) {
|
|
111
|
+
invalidOperationRequest("Apps Script table read", "sheetName is required");
|
|
112
|
+
}
|
|
113
|
+
if (!/^[A-Z]+:[A-Z]+$/.test(request.registeredRange)) {
|
|
114
|
+
invalidOperationRequest("Apps Script table read", "registeredRange must be an uppercase whole-column range");
|
|
115
|
+
}
|
|
116
|
+
if (request.headers.length === 0 || request.headers.some((header) => header.trim().length === 0)) {
|
|
117
|
+
invalidOperationRequest("Apps Script table read", "headers must contain non-empty names");
|
|
118
|
+
}
|
|
119
|
+
if (new Set(request.headers).size !== request.headers.length) {
|
|
120
|
+
invalidOperationRequest("Apps Script table read", "headers must not contain duplicates");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function decodeResult(value, request) {
|
|
124
|
+
const record = requireRecord(value, "table read result");
|
|
125
|
+
const headers = decodeHeaders(record.headers);
|
|
126
|
+
if (headers.length !== request.headers.length || headers.some((header, index) => header !== request.headers[index])) {
|
|
127
|
+
invalidOperationResponse("Apps Script table read", "headers do not match the registered route");
|
|
128
|
+
}
|
|
129
|
+
if (!Array.isArray(record.rows)) {
|
|
130
|
+
invalidOperationResponse("Apps Script table read", "rows must be an array");
|
|
131
|
+
}
|
|
132
|
+
const timing = decodeOptionalSyncGatewayTiming(record.timing, "table read timing");
|
|
133
|
+
const result = {
|
|
134
|
+
sheetName: requireSyncGatewayText(record.sheetName, "table read result sheetName", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE),
|
|
135
|
+
registeredRange: requireSyncGatewayText(record.registeredRange, "table read result registeredRange", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE),
|
|
136
|
+
headers,
|
|
137
|
+
rows: record.rows.map((row, index) => decodeRow(row, index, headers)),
|
|
138
|
+
};
|
|
139
|
+
return timing === undefined ? result : { ...result, timing };
|
|
140
|
+
}
|
|
141
|
+
function decodeRow(value, index, headers) {
|
|
142
|
+
const record = requireRecord(value, "table read row[" + index + "]");
|
|
143
|
+
const fields = requireRecord(record.fields, "table read row[" + index + "].fields");
|
|
144
|
+
const decoded = {};
|
|
145
|
+
for (const header of headers)
|
|
146
|
+
decoded[header] = decodeCell(fields[header], header, index);
|
|
147
|
+
return {
|
|
148
|
+
rowNumber: requireSyncGatewayPositiveSafeInteger(record.rowNumber, "table read row[" + index + "].rowNumber", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE),
|
|
149
|
+
fields: decoded,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function decodeCell(value, header, rowIndex) {
|
|
153
|
+
if (value === null)
|
|
154
|
+
return null;
|
|
155
|
+
const record = requireRecord(value, "table read row[" + rowIndex + "]." + header);
|
|
156
|
+
const kind = requireSyncGatewayText(record.kind, "table read cell kind", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE);
|
|
157
|
+
if (kind === NORMALIZED_CELL_KINDS.STRING || kind === NORMALIZED_CELL_KINDS.DATE) {
|
|
158
|
+
const textValue = requireSyncGatewayText(record.value, "table read cell value", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE);
|
|
159
|
+
return kind === NORMALIZED_CELL_KINDS.STRING
|
|
160
|
+
? { kind: NORMALIZED_CELL_KINDS.STRING, value: textValue }
|
|
161
|
+
: { kind: NORMALIZED_CELL_KINDS.DATE, value: textValue };
|
|
162
|
+
}
|
|
163
|
+
if (kind === NORMALIZED_CELL_KINDS.NUMBER) {
|
|
164
|
+
const number = record.value;
|
|
165
|
+
if (typeof number !== "number" || !Number.isFinite(number)) {
|
|
166
|
+
return invalidOperationResponse("Apps Script table read", "table read number cell is invalid");
|
|
167
|
+
}
|
|
168
|
+
return { kind, value: number };
|
|
169
|
+
}
|
|
170
|
+
if (kind === NORMALIZED_CELL_KINDS.BOOLEAN) {
|
|
171
|
+
if (typeof record.value !== "boolean") {
|
|
172
|
+
return invalidOperationResponse("Apps Script table read", "table read boolean cell is invalid");
|
|
173
|
+
}
|
|
174
|
+
return { kind, value: record.value };
|
|
175
|
+
}
|
|
176
|
+
return invalidOperationResponse("Apps Script table read", "table read cell kind is unsupported");
|
|
177
|
+
}
|
|
178
|
+
function decodeHeaders(value) {
|
|
179
|
+
if (!Array.isArray(value)) {
|
|
180
|
+
return invalidOperationResponse("Apps Script table read", "headers must be an array");
|
|
181
|
+
}
|
|
182
|
+
return value.map((header, index) => requireSyncGatewayText(header, "table read headers[" + index + "]", SYNC_GATEWAY_ERROR_CODES.INVALID_GATEWAY_RESPONSE));
|
|
183
|
+
}
|
|
184
|
+
function requireRecord(value, label) {
|
|
185
|
+
if (!isRecord(value)) {
|
|
186
|
+
return invalidOperationResponse("Apps Script table read", label + " must be an object");
|
|
187
|
+
}
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=tableReadOperation.js.map
|
package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableReadOperation.js","sourceRoot":"","sources":["../../../../../../../src/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Typed fast-append operation executed by the current thin `Code.gs`. */
|
|
2
|
+
import { type FastAppendRowsResult, type FastAppendRow } from "../../../../../../application/sync/gateway/syncGateway.js";
|
|
3
|
+
import type { AppsScriptOperationDefinition } from "../../transport/operationClient.js";
|
|
4
|
+
/** Arguments sent to the self-contained fast-append function in `Code.gs`. */
|
|
5
|
+
export type AppsScriptFastAppendOperationArgs = {
|
|
6
|
+
readonly sheetName: string;
|
|
7
|
+
readonly headers: readonly string[];
|
|
8
|
+
readonly rows: readonly FastAppendRow[];
|
|
9
|
+
};
|
|
10
|
+
/** Input required to create one thin-Gateway fast-append operation. */
|
|
11
|
+
export interface AppsScriptFastAppendOperationRequest extends AppsScriptFastAppendOperationArgs {
|
|
12
|
+
}
|
|
13
|
+
/** A typed operation definition for one contiguous Sheet range write. */
|
|
14
|
+
export type AppsScriptFastAppendOperation = AppsScriptOperationDefinition<AppsScriptFastAppendOperationArgs, FastAppendRowsResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Builds one operation that appends all supplied rows with one `setValues()`.
|
|
17
|
+
*
|
|
18
|
+
* The remote function intentionally does not read or write Developer Metadata,
|
|
19
|
+
* receipts, snapshots, or CAS state. `Code.gs` performs one final `flush()` for
|
|
20
|
+
* the whole request; reconciliation remains responsible for later drift repair.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createFastAppendRowsOperation(request: AppsScriptFastAppendOperationRequest): AppsScriptFastAppendOperation;
|
|
23
|
+
//# sourceMappingURL=fastAppendOperation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastAppendOperation.d.ts","sourceRoot":"","sources":["../../../../../../../src/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,2DAA2D,CAAC;AAEnE,OAAO,KAAK,EACV,6BAA6B,EAC9B,MAAM,oCAAoC,CAAC;AAU5C,8EAA8E;AAC9E,MAAM,MAAM,iCAAiC,GAAG;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;CACzC,CAAC;AAEF,uEAAuE;AACvE,MAAM,WAAW,oCACf,SAAQ,iCAAiC;CAAG;AAE9C,yEAAyE;AACzE,MAAM,MAAM,6BAA6B,GAAG,6BAA6B,CACvE,iCAAiC,EACjC,oBAAoB,CACrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,oCAAoC,GAC5C,6BAA6B,CAO/B"}
|
package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** Typed fast-append operation executed by the current thin `Code.gs`. */
|
|
2
|
+
import { SYNC_GATEWAY_FAST_APPEND_STATUSES } from "../../../../../../application/sync/gateway/constants.js";
|
|
3
|
+
import { decodeOptionalSyncGatewayTiming } from "../../protocol/timing.js";
|
|
4
|
+
import { invalidOperationRequest, invalidOperationResponse, } from "../../errors.js";
|
|
5
|
+
import { NORMALIZED_CELL_KINDS } from "../../../../../../shared/encoding/constants.js";
|
|
6
|
+
import { isRecord } from "../../../../../../shared/encoding/typeGuards.js";
|
|
7
|
+
/**
|
|
8
|
+
* Builds one operation that appends all supplied rows with one `setValues()`.
|
|
9
|
+
*
|
|
10
|
+
* The remote function intentionally does not read or write Developer Metadata,
|
|
11
|
+
* receipts, snapshots, or CAS state. `Code.gs` performs one final `flush()` for
|
|
12
|
+
* the whole request; reconciliation remains responsible for later drift repair.
|
|
13
|
+
*/
|
|
14
|
+
export function createFastAppendRowsOperation(request) {
|
|
15
|
+
validateFastAppendRequest(request);
|
|
16
|
+
return {
|
|
17
|
+
fn: FAST_APPEND_OPERATION_SOURCE,
|
|
18
|
+
args: request,
|
|
19
|
+
decode: (value) => decodeFastAppendResult(value, request.rows.length),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Self-contained V8 function source restored by `Code.gs` with `eval`. */
|
|
23
|
+
const FAST_APPEND_OPERATION_SOURCE = `function (spreadsheet, args) {
|
|
24
|
+
var startedAt = Date.now();
|
|
25
|
+
var phases = [];
|
|
26
|
+
var validationStartedAt = Date.now();
|
|
27
|
+
if (!args || typeof args.sheetName !== "string" || args.sheetName.length === 0) {
|
|
28
|
+
throw new Error("fast append sheetName is required");
|
|
29
|
+
}
|
|
30
|
+
if (!Array.isArray(args.headers) || args.headers.length === 0) {
|
|
31
|
+
throw new Error("fast append headers are required");
|
|
32
|
+
}
|
|
33
|
+
if (!Array.isArray(args.rows)) {
|
|
34
|
+
throw new Error("fast append rows must be an array");
|
|
35
|
+
}
|
|
36
|
+
phase_("validate_input", validationStartedAt);
|
|
37
|
+
|
|
38
|
+
var sheetLookupStartedAt = Date.now();
|
|
39
|
+
var sheet = spreadsheet.getSheetByName(args.sheetName);
|
|
40
|
+
if (sheet === null) throw new Error("fast append sheet was not found: " + args.sheetName);
|
|
41
|
+
phase_("sheet_lookup", sheetLookupStartedAt);
|
|
42
|
+
if (args.rows.length === 0) return result_([], false);
|
|
43
|
+
|
|
44
|
+
var encodeStartedAt = Date.now();
|
|
45
|
+
var values = args.rows.map(function (row) {
|
|
46
|
+
if (!row || typeof row.effectId !== "string" || row.effectId.length === 0) {
|
|
47
|
+
throw new Error("fast append effectId is required");
|
|
48
|
+
}
|
|
49
|
+
if (!row.fields || typeof row.fields !== "object") {
|
|
50
|
+
throw new Error("fast append fields are required");
|
|
51
|
+
}
|
|
52
|
+
return args.headers.map(function (header) {
|
|
53
|
+
return toSheetValue_(row.fields[header]);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
phase_("encode_values", encodeStartedAt);
|
|
57
|
+
|
|
58
|
+
var rangeStartedAt = Date.now();
|
|
59
|
+
var startRow = Math.max(sheet.getLastRow() + 1, 2);
|
|
60
|
+
phase_("append_range_lookup", rangeStartedAt);
|
|
61
|
+
var writeStartedAt = Date.now();
|
|
62
|
+
sheet.getRange(startRow, 1, values.length, args.headers.length).setValues(values);
|
|
63
|
+
phase_("set_values", writeStartedAt);
|
|
64
|
+
return result_(args.rows.map(function (row) {
|
|
65
|
+
return { effectId: row.effectId, status: "applied" };
|
|
66
|
+
}), false, startRow);
|
|
67
|
+
|
|
68
|
+
function result_(results, hasMore, startRowValue) {
|
|
69
|
+
var result = {
|
|
70
|
+
results: results,
|
|
71
|
+
hasMore: hasMore,
|
|
72
|
+
timing: {
|
|
73
|
+
operationKinds: ["append"],
|
|
74
|
+
operationCounts: { append: results.length, update: 0, delete: 0 },
|
|
75
|
+
durationMs: Date.now() - startedAt,
|
|
76
|
+
phases: phases,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
if (startRowValue !== undefined) result.startRow = startRowValue;
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function phase_(name, phaseStartedAt) {
|
|
84
|
+
phases.push({ phase: name, durationMs: Date.now() - phaseStartedAt });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function toSheetValue_(cell) {
|
|
88
|
+
if (cell === null || cell === undefined) return "";
|
|
89
|
+
if (typeof cell !== "object" || typeof cell.kind !== "string") {
|
|
90
|
+
throw new Error("fast append cell is invalid");
|
|
91
|
+
}
|
|
92
|
+
if (cell.kind === "string" || cell.kind === "date") {
|
|
93
|
+
if (typeof cell.value !== "string") throw new Error("fast append text cell is invalid");
|
|
94
|
+
return cell.value;
|
|
95
|
+
}
|
|
96
|
+
if (cell.kind === "number") {
|
|
97
|
+
if (typeof cell.value !== "number" || !isFinite(cell.value)) {
|
|
98
|
+
throw new Error("fast append number cell is invalid");
|
|
99
|
+
}
|
|
100
|
+
return cell.value;
|
|
101
|
+
}
|
|
102
|
+
if (cell.kind === "boolean") {
|
|
103
|
+
if (typeof cell.value !== "boolean") throw new Error("fast append boolean cell is invalid");
|
|
104
|
+
return cell.value;
|
|
105
|
+
}
|
|
106
|
+
throw new Error("fast append cell kind is unsupported");
|
|
107
|
+
}
|
|
108
|
+
}`;
|
|
109
|
+
function validateFastAppendRequest(request) {
|
|
110
|
+
if (request.sheetName.trim().length === 0) {
|
|
111
|
+
invalidOperationRequest("fast append operation", "sheetName is required");
|
|
112
|
+
}
|
|
113
|
+
if (request.headers.length === 0 || request.headers.some((header) => header.trim().length === 0)) {
|
|
114
|
+
invalidOperationRequest("fast append operation", "headers must contain non-empty names");
|
|
115
|
+
}
|
|
116
|
+
if (new Set(request.headers).size !== request.headers.length) {
|
|
117
|
+
invalidOperationRequest("fast append operation", "headers must not contain duplicates");
|
|
118
|
+
}
|
|
119
|
+
for (const row of request.rows) {
|
|
120
|
+
if (row.effectId.trim().length === 0) {
|
|
121
|
+
invalidOperationRequest("fast append operation", "every row needs an effectId");
|
|
122
|
+
}
|
|
123
|
+
for (const cell of Object.values(row.fields)) {
|
|
124
|
+
if (!isSupportedNormalizedCell(cell)) {
|
|
125
|
+
invalidOperationRequest("fast append operation", "rows contain an unsupported normalized cell");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function decodeFastAppendResult(value, expectedCount) {
|
|
131
|
+
if (!isRecord(value) ||
|
|
132
|
+
!Array.isArray(value.results) ||
|
|
133
|
+
value.results.length !== expectedCount ||
|
|
134
|
+
value.hasMore !== false) {
|
|
135
|
+
invalidOperationResponse("fast append operation", "result must contain results and hasMore=false");
|
|
136
|
+
}
|
|
137
|
+
const timing = decodeOptionalSyncGatewayTiming(value.timing, "fast append timing");
|
|
138
|
+
const result = {
|
|
139
|
+
results: value.results.map(decodeFastAppendRowResult),
|
|
140
|
+
hasMore: false,
|
|
141
|
+
};
|
|
142
|
+
return timing === undefined ? result : { ...result, timing };
|
|
143
|
+
}
|
|
144
|
+
function decodeFastAppendRowResult(value) {
|
|
145
|
+
if (!isRecord(value) ||
|
|
146
|
+
typeof value.effectId !== "string" ||
|
|
147
|
+
value.status !== SYNC_GATEWAY_FAST_APPEND_STATUSES.APPLIED) {
|
|
148
|
+
invalidOperationResponse("fast append operation", "result contains an invalid fast-append row");
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
effectId: value.effectId,
|
|
152
|
+
status: SYNC_GATEWAY_FAST_APPEND_STATUSES.APPLIED,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function isSupportedNormalizedCell(value) {
|
|
156
|
+
if (value === null)
|
|
157
|
+
return true;
|
|
158
|
+
if (value.kind === NORMALIZED_CELL_KINDS.STRING || value.kind === NORMALIZED_CELL_KINDS.DATE) {
|
|
159
|
+
return typeof value.value === "string";
|
|
160
|
+
}
|
|
161
|
+
if (value.kind === NORMALIZED_CELL_KINDS.NUMBER) {
|
|
162
|
+
return Number.isFinite(value.value);
|
|
163
|
+
}
|
|
164
|
+
return value.kind === NORMALIZED_CELL_KINDS.BOOLEAN && typeof value.value === "boolean";
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=fastAppendOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastAppendOperation.js","sourceRoot":"","sources":["../../../../../../../src/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Signed request protocol implemented by the current thin `Code.gs` file. */
|
|
2
|
+
import { type AppsScriptOperationName } from "./constants.js";
|
|
3
|
+
import type { SyncJsonValue } from "./types.js";
|
|
4
|
+
/** The thin dispatcher reuses the data-plane protocol version. */
|
|
5
|
+
export declare const APPS_SCRIPT_OPERATION_PROTOCOL_VERSION: "typed-sheets-sync-v1";
|
|
6
|
+
/** One function call that `Code.gs` restores and invokes with `(spreadsheet, args)`. */
|
|
7
|
+
export interface AppsScriptOperationWire {
|
|
8
|
+
readonly fn: string;
|
|
9
|
+
readonly args: SyncJsonValue;
|
|
10
|
+
}
|
|
11
|
+
/** Payload accepted by `Code.gs`'s `applyOperations` handler. */
|
|
12
|
+
export interface AppsScriptOperationPayload {
|
|
13
|
+
readonly operations: readonly AppsScriptOperationWire[];
|
|
14
|
+
}
|
|
15
|
+
/** Fields authenticated by the current `Code.gs` implementation. */
|
|
16
|
+
export interface AppsScriptOperationSigningFields {
|
|
17
|
+
readonly protocolVersion: typeof APPS_SCRIPT_OPERATION_PROTOCOL_VERSION;
|
|
18
|
+
readonly requestId: string;
|
|
19
|
+
readonly operation: AppsScriptOperationName;
|
|
20
|
+
readonly keyId: string;
|
|
21
|
+
readonly issuedAt: number;
|
|
22
|
+
readonly expiresAt: number;
|
|
23
|
+
readonly sheetId: string;
|
|
24
|
+
readonly actorId: string;
|
|
25
|
+
readonly bodyHash: string;
|
|
26
|
+
}
|
|
27
|
+
/** Signed envelope accepted by the current thin `Code.gs` handler. */
|
|
28
|
+
export interface AppsScriptOperationEnvelope extends AppsScriptOperationSigningFields {
|
|
29
|
+
readonly signature: string;
|
|
30
|
+
readonly payload: AppsScriptOperationPayload;
|
|
31
|
+
}
|
|
32
|
+
/** Inputs for deterministic operation-envelope creation and protocol tests. */
|
|
33
|
+
export interface CreateAppsScriptOperationEnvelopeOptions {
|
|
34
|
+
readonly operation: AppsScriptOperationName;
|
|
35
|
+
readonly payload: AppsScriptOperationPayload;
|
|
36
|
+
readonly sheetId: string;
|
|
37
|
+
readonly secret: string;
|
|
38
|
+
readonly keyId?: string;
|
|
39
|
+
readonly actorId?: string;
|
|
40
|
+
readonly requestId?: string;
|
|
41
|
+
readonly issuedAt?: number;
|
|
42
|
+
readonly expiresInMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/** Exact signing input used by `Code.gs` (there is no registered range field). */
|
|
45
|
+
export declare function appsScriptOperationSigningInput(input: AppsScriptOperationSigningFields): string;
|
|
46
|
+
/** Computes the URL-safe HMAC signature verified by `Code.gs`. */
|
|
47
|
+
export declare function signAppsScriptOperationEnvelope(input: AppsScriptOperationSigningFields, secret: string): string;
|
|
48
|
+
/** Creates a signed request matching the current `Code.gs` wire contract. */
|
|
49
|
+
export declare function createAppsScriptOperationEnvelope(options: CreateAppsScriptOperationEnvelopeOptions): AppsScriptOperationEnvelope;
|
|
50
|
+
//# sourceMappingURL=codeGsProtocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeGsProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAG9E,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAYxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,kEAAkE;AAClE,eAAO,MAAM,sCAAsC,wBAAsC,CAAC;AAE1F,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACzD;AAED,oEAAoE;AACpE,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,eAAe,EAAE,OAAO,sCAAsC,CAAC;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,sEAAsE;AACtE,MAAM,WAAW,2BAA4B,SAAQ,gCAAgC;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED,+EAA+E;AAC/E,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,kFAAkF;AAClF,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,gCAAgC,GACtC,MAAM,CAYR;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,gCAAgC,EACvC,MAAM,EAAE,MAAM,GACb,MAAM,CASR;AAED,6EAA6E;AAC7E,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,2BAA2B,CA+C7B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Signed request protocol implemented by the current thin `Code.gs` file. */
|
|
2
|
+
import { createHmac, randomUUID } from "node:crypto";
|
|
3
|
+
import { APPS_SCRIPT_OPERATION_NAMES, SYNC_GATEWAY_DEFAULTS, SYNC_GATEWAY_ENCODINGS, SYNC_GATEWAY_HASH_ALGORITHMS, SYNC_GATEWAY_PROTOCOL_VERSIONS, } from "./constants.js";
|
|
4
|
+
import { SYNC_GATEWAY_PROTOCOL_ERROR_CODES, SyncGatewayProtocolError, } from "../errors.js";
|
|
5
|
+
import { requireSyncGatewayExpiry, requireSyncGatewayIssuedAt, requireSyncGatewayRequestId, requireSyncGatewayText, } from "./validation.js";
|
|
6
|
+
import { canonicalSyncJson, syncSha256Hex } from "./syncProtocol.js";
|
|
7
|
+
/** The thin dispatcher reuses the data-plane protocol version. */
|
|
8
|
+
export const APPS_SCRIPT_OPERATION_PROTOCOL_VERSION = SYNC_GATEWAY_PROTOCOL_VERSIONS.DATA;
|
|
9
|
+
/** Exact signing input used by `Code.gs` (there is no registered range field). */
|
|
10
|
+
export function appsScriptOperationSigningInput(input) {
|
|
11
|
+
return [
|
|
12
|
+
input.protocolVersion,
|
|
13
|
+
input.requestId,
|
|
14
|
+
input.operation,
|
|
15
|
+
input.keyId,
|
|
16
|
+
String(input.issuedAt),
|
|
17
|
+
String(input.expiresAt),
|
|
18
|
+
input.sheetId,
|
|
19
|
+
input.actorId,
|
|
20
|
+
input.bodyHash,
|
|
21
|
+
].join("\n");
|
|
22
|
+
}
|
|
23
|
+
/** Computes the URL-safe HMAC signature verified by `Code.gs`. */
|
|
24
|
+
export function signAppsScriptOperationEnvelope(input, secret) {
|
|
25
|
+
const validSecret = requireSyncGatewayText(secret, "Apps Script operation secret", SYNC_GATEWAY_PROTOCOL_ERROR_CODES.INVALID_SECRET);
|
|
26
|
+
return createHmac(SYNC_GATEWAY_HASH_ALGORITHMS.SHA256, validSecret)
|
|
27
|
+
.update(appsScriptOperationSigningInput(input), SYNC_GATEWAY_ENCODINGS.UTF8)
|
|
28
|
+
.digest(SYNC_GATEWAY_ENCODINGS.BASE64URL);
|
|
29
|
+
}
|
|
30
|
+
/** Creates a signed request matching the current `Code.gs` wire contract. */
|
|
31
|
+
export function createAppsScriptOperationEnvelope(options) {
|
|
32
|
+
const issuedAt = requireSyncGatewayIssuedAt(options.issuedAt ?? Date.now());
|
|
33
|
+
const expiresInMs = requireSyncGatewayExpiry(options.expiresInMs ?? SYNC_GATEWAY_DEFAULTS.EXPIRY_MS);
|
|
34
|
+
const sheetId = requireSyncGatewayText(options.sheetId, "Apps Script operation sheetId", SYNC_GATEWAY_PROTOCOL_ERROR_CODES.INVALID_SHEET_ID);
|
|
35
|
+
const actorId = requireSyncGatewayText(options.actorId ?? SYNC_GATEWAY_DEFAULTS.DATA_ACTOR_ID, "Apps Script operation actorId", SYNC_GATEWAY_PROTOCOL_ERROR_CODES.INVALID_ACTOR_ID);
|
|
36
|
+
const keyId = requireSyncGatewayText(options.keyId ?? SYNC_GATEWAY_DEFAULTS.KEY_ID, "Apps Script operation keyId", SYNC_GATEWAY_PROTOCOL_ERROR_CODES.INVALID_KEY_ID);
|
|
37
|
+
const requestId = requireSyncGatewayRequestId(options.requestId ?? randomUUID());
|
|
38
|
+
if (options.operation !== APPS_SCRIPT_OPERATION_NAMES.APPLY_OPERATIONS) {
|
|
39
|
+
throw new SyncGatewayProtocolError(SYNC_GATEWAY_PROTOCOL_ERROR_CODES.INVALID_OPERATION, "Apps Script operation is not supported by Code.gs");
|
|
40
|
+
}
|
|
41
|
+
// canonicalSyncJson validates every args value before the request is sent.
|
|
42
|
+
const bodyHash = syncSha256Hex(canonicalSyncJson(options.payload));
|
|
43
|
+
const unsigned = {
|
|
44
|
+
protocolVersion: APPS_SCRIPT_OPERATION_PROTOCOL_VERSION,
|
|
45
|
+
requestId,
|
|
46
|
+
operation: options.operation,
|
|
47
|
+
keyId,
|
|
48
|
+
issuedAt,
|
|
49
|
+
expiresAt: issuedAt + expiresInMs,
|
|
50
|
+
sheetId,
|
|
51
|
+
actorId,
|
|
52
|
+
bodyHash,
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
...unsigned,
|
|
56
|
+
signature: signAppsScriptOperationEnvelope(unsigned, options.secret),
|
|
57
|
+
payload: options.payload,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=codeGsProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeGsProtocol.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Protocol version used by the thin Apps Script operation dispatcher. */
|
|
2
|
+
export declare const SYNC_GATEWAY_PROTOCOL_VERSIONS: {
|
|
3
|
+
readonly DATA: "typed-sheets-sync-v1";
|
|
4
|
+
};
|
|
5
|
+
export type SyncGatewayProtocolVersion = (typeof SYNC_GATEWAY_PROTOCOL_VERSIONS)[keyof typeof SYNC_GATEWAY_PROTOCOL_VERSIONS];
|
|
6
|
+
/** Data-plane protocol version used by signed sync requests. */
|
|
7
|
+
export type SyncGatewayDataProtocolVersion = (typeof SYNC_GATEWAY_PROTOCOL_VERSIONS)["DATA"];
|
|
8
|
+
/** Operation names accepted by the thin Code.gs function dispatcher. */
|
|
9
|
+
export declare const APPS_SCRIPT_OPERATION_NAMES: {
|
|
10
|
+
readonly APPLY_OPERATIONS: "applyOperations";
|
|
11
|
+
};
|
|
12
|
+
export type AppsScriptOperationName = (typeof APPS_SCRIPT_OPERATION_NAMES)[keyof typeof APPS_SCRIPT_OPERATION_NAMES];
|
|
13
|
+
/** Shared defaults for signed gateway envelopes. */
|
|
14
|
+
export declare const SYNC_GATEWAY_DEFAULTS: {
|
|
15
|
+
readonly DATA_ACTOR_ID: "typed-sheets-sync-worker";
|
|
16
|
+
readonly KEY_ID: "typed-sheets-shared-secret-v1";
|
|
17
|
+
readonly EXPIRY_MS: 60000;
|
|
18
|
+
readonly MIN_EXPIRY_MS: 1000;
|
|
19
|
+
readonly MAX_EXPIRY_MS: number;
|
|
20
|
+
};
|
|
21
|
+
/** Request timeout bounds for the Node-side Apps Script client. */
|
|
22
|
+
export declare const SYNC_GATEWAY_CLIENT_DEFAULTS: {
|
|
23
|
+
readonly REQUEST_TIMEOUT_MS: 30000;
|
|
24
|
+
readonly MIN_REQUEST_TIMEOUT_MS: 1000;
|
|
25
|
+
readonly MAX_REQUEST_TIMEOUT_MS: 120000;
|
|
26
|
+
};
|
|
27
|
+
/** Cryptographic algorithm used by both gateway envelope types. */
|
|
28
|
+
export declare const SYNC_GATEWAY_HASH_ALGORITHMS: {
|
|
29
|
+
readonly SHA256: "sha256";
|
|
30
|
+
};
|
|
31
|
+
/** Encodings used by the Node crypto boundary. */
|
|
32
|
+
export declare const SYNC_GATEWAY_ENCODINGS: {
|
|
33
|
+
readonly UTF8: "utf8";
|
|
34
|
+
readonly BASE64URL: "base64url";
|
|
35
|
+
};
|
|
36
|
+
/** Canonical JSON tokens emitted for primitive literal values. */
|
|
37
|
+
export declare const SYNC_JSON_LITERAL_TOKENS: {
|
|
38
|
+
readonly NULL: "null";
|
|
39
|
+
readonly TRUE: "true";
|
|
40
|
+
readonly FALSE: "false";
|
|
41
|
+
};
|
|
42
|
+
/** Request IDs must remain short and safe to carry through the gateway. */
|
|
43
|
+
export declare const SYNC_GATEWAY_REQUEST_ID_PATTERN: RegExp;
|
|
44
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/apps-script-gateway/protocol/constants.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,eAAO,MAAM,8BAA8B;;CAEjC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,OAAO,8BAA8B,CAAC,CAAC;AAEvF,gEAAgE;AAChE,MAAM,MAAM,8BAA8B,GACxC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,wEAAwE;AACxE,eAAO,MAAM,2BAA2B;;CAE9B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,OAAO,2BAA2B,CAAC,CAAC;AAEjF,oDAAoD;AACpD,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,4BAA4B;;;;CAI/B,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,4BAA4B;;CAE/B,CAAC;AAEX,kDAAkD;AAClD,eAAO,MAAM,sBAAsB;;;CAGzB,CAAC;AAEX,kEAAkE;AAClE,eAAO,MAAM,wBAAwB;;;;CAI3B,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,+BAA+B,QAA6B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Protocol version used by the thin Apps Script operation dispatcher. */
|
|
2
|
+
export const SYNC_GATEWAY_PROTOCOL_VERSIONS = {
|
|
3
|
+
DATA: "typed-sheets-sync-v1",
|
|
4
|
+
};
|
|
5
|
+
/** Operation names accepted by the thin Code.gs function dispatcher. */
|
|
6
|
+
export const APPS_SCRIPT_OPERATION_NAMES = {
|
|
7
|
+
APPLY_OPERATIONS: "applyOperations",
|
|
8
|
+
};
|
|
9
|
+
/** Shared defaults for signed gateway envelopes. */
|
|
10
|
+
export const SYNC_GATEWAY_DEFAULTS = {
|
|
11
|
+
DATA_ACTOR_ID: "typed-sheets-sync-worker",
|
|
12
|
+
KEY_ID: "typed-sheets-shared-secret-v1",
|
|
13
|
+
EXPIRY_MS: 60_000,
|
|
14
|
+
MIN_EXPIRY_MS: 1_000,
|
|
15
|
+
MAX_EXPIRY_MS: 10 * 60_000,
|
|
16
|
+
};
|
|
17
|
+
/** Request timeout bounds for the Node-side Apps Script client. */
|
|
18
|
+
export const SYNC_GATEWAY_CLIENT_DEFAULTS = {
|
|
19
|
+
REQUEST_TIMEOUT_MS: 30_000,
|
|
20
|
+
MIN_REQUEST_TIMEOUT_MS: 1_000,
|
|
21
|
+
MAX_REQUEST_TIMEOUT_MS: 120_000,
|
|
22
|
+
};
|
|
23
|
+
/** Cryptographic algorithm used by both gateway envelope types. */
|
|
24
|
+
export const SYNC_GATEWAY_HASH_ALGORITHMS = {
|
|
25
|
+
SHA256: "sha256",
|
|
26
|
+
};
|
|
27
|
+
/** Encodings used by the Node crypto boundary. */
|
|
28
|
+
export const SYNC_GATEWAY_ENCODINGS = {
|
|
29
|
+
UTF8: "utf8",
|
|
30
|
+
BASE64URL: "base64url",
|
|
31
|
+
};
|
|
32
|
+
/** Canonical JSON tokens emitted for primitive literal values. */
|
|
33
|
+
export const SYNC_JSON_LITERAL_TOKENS = {
|
|
34
|
+
NULL: "null",
|
|
35
|
+
TRUE: "true",
|
|
36
|
+
FALSE: "false",
|
|
37
|
+
};
|
|
38
|
+
/** Request IDs must remain short and safe to carry through the gateway. */
|
|
39
|
+
export const SYNC_GATEWAY_REQUEST_ID_PATTERN = /^[A-Za-z0-9._:-]{8,128}$/;
|
|
40
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/apps-script-gateway/protocol/constants.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,IAAI,EAAE,sBAAsB;CACpB,CAAC;AASX,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,gBAAgB,EAAE,iBAAiB;CAC3B,CAAC;AAKX,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,aAAa,EAAE,0BAA0B;IACzC,MAAM,EAAE,+BAA+B;IACvC,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,EAAE,GAAG,MAAM;CAClB,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,kBAAkB,EAAE,MAAM;IAC1B,sBAAsB,EAAE,KAAK;IAC7B,sBAAsB,EAAE,OAAO;CACvB,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,kDAAkD;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;CACd,CAAC;AAEX,kEAAkE;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,2EAA2E;AAC3E,MAAM,CAAC,MAAM,+BAA+B,GAAG,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Canonical JSON and hashing helpers shared by the thin operation protocol. */
|
|
2
|
+
export type { SyncJsonValue } from "./types.js";
|
|
3
|
+
/** Canonical JSON used for payload hashes and cross-runtime HMAC inputs. */
|
|
4
|
+
export declare function canonicalSyncJson(value: unknown): string;
|
|
5
|
+
/** SHA-256 helper shared by envelope and effect payload verification. */
|
|
6
|
+
export declare function syncSha256Hex(value: string): string;
|
|
7
|
+
//# sourceMappingURL=syncProtocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAchF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqBxD;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAInD"}
|