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/effect/effectOperationScript.js
ADDED
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
/** Self-contained V8 source executed by Code.gs for effect application and read-back. */
|
|
2
|
+
export const EFFECT_OPERATION_SOURCE = String.raw `function (spreadsheet, args) {
|
|
3
|
+
var MAX_EFFECTS = 20;
|
|
4
|
+
var RECEIPT_SHEET_NAME = "__typed_sheets_internal_effect_receipts";
|
|
5
|
+
var RECEIPT_HEADERS = ["effectId", "payloadHash", "status", "visibleHash", "visibleRevision", "updatedAt"];
|
|
6
|
+
var ANCHOR_KEY = "typed_sheets_sync_anchor";
|
|
7
|
+
var EFFECT_KINDS = {
|
|
8
|
+
SYSTEM_PROJECTION: "system_projection",
|
|
9
|
+
CANDIDATE_RECONCILE: "candidate_reconcile",
|
|
10
|
+
SYSTEM_REPAIR: "system_repair",
|
|
11
|
+
RESOLUTION_PROJECTION: "resolution_projection",
|
|
12
|
+
RESOLUTION_DELETE: "resolution_delete",
|
|
13
|
+
USER_INPUT_DELETE: "user_input_delete"
|
|
14
|
+
};
|
|
15
|
+
var DEFERRED = "deferred";
|
|
16
|
+
|
|
17
|
+
var phases = [];
|
|
18
|
+
var effectLockStartedAt = Date.now();
|
|
19
|
+
var effectLock = LockService.getScriptLock();
|
|
20
|
+
if (!effectLock.tryLock(20000)) throw new Error("Could not acquire the sync effect gateway lock");
|
|
21
|
+
try {
|
|
22
|
+
var operationResult = run_();
|
|
23
|
+
appendTimingPhase_(operationResult, "script_lock", Date.now() - effectLockStartedAt);
|
|
24
|
+
return operationResult;
|
|
25
|
+
} finally {
|
|
26
|
+
effectLock.releaseLock();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function run_() {
|
|
30
|
+
var startedAt = Date.now();
|
|
31
|
+
requireObject_(args, "effect operation args");
|
|
32
|
+
var validationStartedAt = Date.now();
|
|
33
|
+
if (!Array.isArray(args.effects) && args.mode === "applyEffects") {
|
|
34
|
+
throw new Error("applyEffects effects 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("Registered sync sheet does not exist: " + args.sheetName);
|
|
41
|
+
phase_("sheet_lookup", sheetLookupStartedAt);
|
|
42
|
+
var layoutStartedAt = Date.now();
|
|
43
|
+
var layout = readLayout_(sheet, args.registeredRange);
|
|
44
|
+
phase_("layout_read", layoutStartedAt);
|
|
45
|
+
var contextStartedAt = Date.now();
|
|
46
|
+
var context = readContext_(sheet, layout, args.identityField);
|
|
47
|
+
phase_("context_read", contextStartedAt);
|
|
48
|
+
|
|
49
|
+
if (args.mode === "readEffectPostcondition") {
|
|
50
|
+
return classifyPostcondition_(context, args.effect, readPostconditionReceipts_());
|
|
51
|
+
}
|
|
52
|
+
if (args.mode === "readEffectPostconditions") {
|
|
53
|
+
if (!Array.isArray(args.effects) || args.effects.length === 0) {
|
|
54
|
+
throw new Error("postcondition effects must be a non-empty array");
|
|
55
|
+
}
|
|
56
|
+
var postconditionReceipts = readPostconditionReceipts_();
|
|
57
|
+
return {
|
|
58
|
+
results: args.effects.map(function (effect) {
|
|
59
|
+
return {
|
|
60
|
+
effectId: String(effect.effectId),
|
|
61
|
+
payloadHash: String(effect.payloadHash),
|
|
62
|
+
postcondition: classifyPostcondition_(context, effect, postconditionReceipts)
|
|
63
|
+
};
|
|
64
|
+
})
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (args.mode !== "applyEffects") throw new Error("unsupported effect operation mode");
|
|
68
|
+
|
|
69
|
+
var receiptEnsureStartedAt = Date.now();
|
|
70
|
+
var receiptSheet = ensureReceiptSheet_(spreadsheet);
|
|
71
|
+
phase_("receipt_sheet_ensure", receiptEnsureStartedAt);
|
|
72
|
+
var receiptReadStartedAt = Date.now();
|
|
73
|
+
var receipts = readReceipts_(receiptSheet);
|
|
74
|
+
phase_("receipt_read", receiptReadStartedAt);
|
|
75
|
+
var pendingReceipts = [];
|
|
76
|
+
var pendingReceiptsById = Object.create(null);
|
|
77
|
+
var appendRows = [];
|
|
78
|
+
var deleteRows = [];
|
|
79
|
+
var deferred = [];
|
|
80
|
+
var results = [];
|
|
81
|
+
var count = Math.min(args.effects.length, MAX_EFFECTS);
|
|
82
|
+
var postconditionMode = args.postconditionMode === undefined ? "inline" : args.postconditionMode;
|
|
83
|
+
if (postconditionMode !== "inline" && postconditionMode !== DEFERRED) {
|
|
84
|
+
throw new Error("applyEffects postconditionMode must be inline or deferred");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
var planStartedAt = Date.now();
|
|
88
|
+
for (var index = 0; index < count; index += 1) {
|
|
89
|
+
var checked = requireEffect_(args.effects[index], args);
|
|
90
|
+
var existingReceipt = receipts[checked.effectId] || pendingReceiptsById[checked.effectId] || null;
|
|
91
|
+
if (existingReceipt !== null) {
|
|
92
|
+
if (existingReceipt.payloadHash !== checked.payloadHash) {
|
|
93
|
+
results[index] = result_(checked, "schema_error", null, "effect_id_reused_with_different_payload", null);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
var receiptRow = findRow_(context, checked.payload.targetAnchor, checked.targetId);
|
|
97
|
+
if (isDeletion_(checked.effectKind)) {
|
|
98
|
+
results[index] = receiptRow === null
|
|
99
|
+
? result_(checked, "already_applied", null, null, existingReceipt)
|
|
100
|
+
: result_(checked, "guard_mismatch", receiptRow.rowNumber, "receipt_target_reappeared", null);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (receiptRow === null) {
|
|
104
|
+
results[index] = result_(
|
|
105
|
+
checked,
|
|
106
|
+
checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
|
|
107
|
+
null,
|
|
108
|
+
"receipt_target_missing",
|
|
109
|
+
null,
|
|
110
|
+
);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
var receiptCurrentHash = currentHash_(receiptRow, checked.payload.fields);
|
|
114
|
+
results[index] = receiptCurrentHash === checked.payload.targetVisibleHash
|
|
115
|
+
? result_(checked, "already_applied", receiptRow.rowNumber, null, existingReceipt)
|
|
116
|
+
: result_(
|
|
117
|
+
checked,
|
|
118
|
+
checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
|
|
119
|
+
receiptRow.rowNumber,
|
|
120
|
+
"receipt_postcondition_changed",
|
|
121
|
+
null,
|
|
122
|
+
);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
var row = findRow_(context, checked.payload.targetAnchor, checked.targetId);
|
|
127
|
+
var created = false;
|
|
128
|
+
if (row === null) {
|
|
129
|
+
if (!checked.payload.createIfMissing) {
|
|
130
|
+
results[index] = result_(checked, "guard_mismatch", null, "target_anchor_missing", null);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (checked.expectedVisibleRevision !== 0 || checked.expectedVisibleHash !== "") {
|
|
134
|
+
results[index] = result_(checked, "guard_mismatch", null, "insert_requires_empty_visible_baseline", null);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
row = createRow_(context, checked.payload.targetAnchor, checked.targetId);
|
|
138
|
+
appendRows.push(row);
|
|
139
|
+
created = true;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (isDeletion_(checked.effectKind)) {
|
|
143
|
+
var deletionSchemaError = validateDeletion_(layout, checked);
|
|
144
|
+
if (deletionSchemaError !== null) {
|
|
145
|
+
results[index] = result_(checked, "schema_error", row.rowNumber, deletionSchemaError, null);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
var deletionHash = currentHash_(row, checked.payload.fields);
|
|
149
|
+
if (deletionHash !== checked.expectedVisibleHash) {
|
|
150
|
+
results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
var deletionReceipt = makeReceipt_(checked, deletionHash, checked.expectedVisibleRevision);
|
|
154
|
+
row.deleted = true;
|
|
155
|
+
deleteRows.push(row);
|
|
156
|
+
queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, deletionReceipt);
|
|
157
|
+
deferred.push({ index: index, checked: checked, row: row, receipt: deletionReceipt, deletion: true });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
var currentHash = currentHash_(row, checked.payload.fields);
|
|
162
|
+
var expectedCandidateHash = optionalWireText_(checked.payload.expectedCandidateHash);
|
|
163
|
+
if (checked.effectKind === EFFECT_KINDS.CANDIDATE_RECONCILE &&
|
|
164
|
+
expectedCandidateHash !== null && currentHash !== checked.expectedVisibleHash) {
|
|
165
|
+
results[index] = result_(checked, "guard_mismatch", row.rowNumber, "candidate_guard_mismatch", null);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (currentHash === checked.payload.targetVisibleHash) {
|
|
169
|
+
var alreadyReceipt = makeReceipt_(checked, currentHash, checked.expectedVisibleRevision + 1);
|
|
170
|
+
queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, alreadyReceipt);
|
|
171
|
+
results[index] = result_(checked, created ? "applied" : "already_applied", row.rowNumber, null, alreadyReceipt);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
var repairGuardHash = optionalWireText_(checked.repairGuardHash);
|
|
175
|
+
if (checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR) {
|
|
176
|
+
if (repairGuardHash === null || currentHash !== repairGuardHash) {
|
|
177
|
+
results[index] = result_(checked, "repair_reobserve", row.rowNumber, "repair_guard_mismatch", null);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
} else if (currentHash !== checked.expectedVisibleHash) {
|
|
181
|
+
results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
Object.keys(checked.payload.fields).forEach(function (fieldName) {
|
|
186
|
+
row.cells[fieldName] = checked.payload.fields[fieldName];
|
|
187
|
+
if (!row.appended) {
|
|
188
|
+
row.writeFields[fieldName] = checked.payload.fields[fieldName];
|
|
189
|
+
context.updatedRows[row.rowNumber] = row;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
deferred.push({
|
|
193
|
+
index: index,
|
|
194
|
+
checked: checked,
|
|
195
|
+
row: row,
|
|
196
|
+
receipt: makeReceipt_(checked, checked.payload.targetVisibleHash, checked.expectedVisibleRevision + 1),
|
|
197
|
+
deletion: false,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
phase_("effect_plan", planStartedAt);
|
|
201
|
+
|
|
202
|
+
var appendWriteStartedAt = Date.now();
|
|
203
|
+
writeAppendRows_(sheet, layout, appendRows, args.checkboxHeaders);
|
|
204
|
+
phase_("append_write", appendWriteStartedAt);
|
|
205
|
+
var fieldWriteStartedAt = Date.now();
|
|
206
|
+
writeFieldUpdates_(sheet, layout, context.rows);
|
|
207
|
+
phase_("field_update_write", fieldWriteStartedAt);
|
|
208
|
+
var writeFlushStartedAt = Date.now();
|
|
209
|
+
if (appendRows.length > 0 || Object.keys(context.updatedRows).length > 0) SpreadsheetApp.flush();
|
|
210
|
+
phase_("write_flush", writeFlushStartedAt);
|
|
211
|
+
|
|
212
|
+
var postconditionStartedAt = Date.now();
|
|
213
|
+
deferred.forEach(function (planned) {
|
|
214
|
+
if (planned.deletion) {
|
|
215
|
+
results[planned.index] = result_(planned.checked, "applied", null, null, planned.receipt);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (postconditionMode !== DEFERRED &&
|
|
219
|
+
physicalHash_(sheet, layout, planned.row.rowNumber, planned.checked.payload.fields) !== planned.checked.payload.targetVisibleHash) {
|
|
220
|
+
results[planned.index] = result_(planned.checked, "retryable_error", planned.row.rowNumber, "postcondition_hash_mismatch", null);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, planned.receipt);
|
|
224
|
+
results[planned.index] = result_(planned.checked, "applied", planned.row.rowNumber, null, planned.receipt);
|
|
225
|
+
});
|
|
226
|
+
phase_("postcondition", postconditionStartedAt);
|
|
227
|
+
|
|
228
|
+
var deleteStartedAt = Date.now();
|
|
229
|
+
deleteRows.slice().sort(function (left, right) { return right.rowNumber - left.rowNumber; }).forEach(function (row) {
|
|
230
|
+
sheet.deleteRow(row.rowNumber);
|
|
231
|
+
});
|
|
232
|
+
phase_("delete_rows", deleteStartedAt);
|
|
233
|
+
var deleteFlushStartedAt = Date.now();
|
|
234
|
+
if (deleteRows.length > 0) SpreadsheetApp.flush();
|
|
235
|
+
phase_("delete_flush", deleteFlushStartedAt);
|
|
236
|
+
var receiptWriteStartedAt = Date.now();
|
|
237
|
+
writeReceipts_(receiptSheet, pendingReceipts);
|
|
238
|
+
phase_("receipt_write", receiptWriteStartedAt);
|
|
239
|
+
results.forEach(function (entry) {
|
|
240
|
+
if (entry === null || entry === undefined) throw new Error("effect result was not produced");
|
|
241
|
+
if (postconditionMode === DEFERRED &&
|
|
242
|
+
(entry.status === "applied" || entry.status === "already_applied")) {
|
|
243
|
+
entry.postcondition = "acknowledged";
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
var operationCounts = countOperationKinds_(args.effects);
|
|
247
|
+
return {
|
|
248
|
+
results: results,
|
|
249
|
+
snapshotHash: null,
|
|
250
|
+
hasMore: args.effects.length > count,
|
|
251
|
+
timing: {
|
|
252
|
+
operationKinds: operationKinds_(operationCounts),
|
|
253
|
+
operationCounts: operationCounts,
|
|
254
|
+
durationMs: Date.now() - startedAt,
|
|
255
|
+
phases: phases,
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function readLayout_(targetSheet, registeredRange) {
|
|
261
|
+
var parsed = parseRange_(registeredRange);
|
|
262
|
+
var headerValues = targetSheet.getRange(1, parsed.startColumn, 1, parsed.columnCount).getValues()[0];
|
|
263
|
+
var headers = [];
|
|
264
|
+
var positions = Object.create(null);
|
|
265
|
+
headerValues.forEach(function (header, headerIndex) {
|
|
266
|
+
if (typeof header !== "string" || header.trim() === "") throw new Error("registered header is invalid");
|
|
267
|
+
if (positions[header] !== undefined) throw new Error("registered headers contain a duplicate");
|
|
268
|
+
headers.push(header);
|
|
269
|
+
positions[header] = parsed.startColumn + headerIndex;
|
|
270
|
+
});
|
|
271
|
+
return { startColumn: parsed.startColumn, columnCount: parsed.columnCount, headers: headers, positions: positions };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function readContext_(targetSheet, layout, identityField) {
|
|
275
|
+
var rows = [];
|
|
276
|
+
var byAnchor = Object.create(null);
|
|
277
|
+
var byIdentity = Object.create(null);
|
|
278
|
+
var lastRow = targetSheet.getLastRow();
|
|
279
|
+
var rawRows = lastRow < 2 ? [] : targetSheet.getRange(2, layout.startColumn, lastRow - 1, layout.columnCount).getValues();
|
|
280
|
+
rawRows.forEach(function (raw, offset) {
|
|
281
|
+
if (isBlankRow_(raw)) return;
|
|
282
|
+
var rowNumber = offset + 2;
|
|
283
|
+
var cells = Object.create(null);
|
|
284
|
+
layout.headers.forEach(function (header, headerIndex) {
|
|
285
|
+
cells[header] = normalizedCellFromSheetValue_(raw[headerIndex]);
|
|
286
|
+
});
|
|
287
|
+
var anchors = readAnchors_(targetSheet, rowNumber);
|
|
288
|
+
if (anchors.length > 1) throw new Error("row has multiple sync anchors: " + rowNumber);
|
|
289
|
+
var anchor = anchors.length === 1 ? anchors[0] : null;
|
|
290
|
+
var identity = identityField === undefined ? null : identityFromCell_(cells[identityField]);
|
|
291
|
+
var row = {
|
|
292
|
+
rowNumber: rowNumber,
|
|
293
|
+
physicalAnchor: anchor,
|
|
294
|
+
targetId: identity,
|
|
295
|
+
cells: cells,
|
|
296
|
+
writeFields: Object.create(null),
|
|
297
|
+
appended: false,
|
|
298
|
+
deleted: false,
|
|
299
|
+
};
|
|
300
|
+
if (anchor !== null) {
|
|
301
|
+
if (byAnchor[anchor] !== undefined) throw new Error("sync anchor is duplicated: " + anchor);
|
|
302
|
+
byAnchor[anchor] = row;
|
|
303
|
+
}
|
|
304
|
+
if (identity !== null) {
|
|
305
|
+
if (byIdentity[identity] !== undefined) throw new Error("sync identity is duplicated: " + identity);
|
|
306
|
+
byIdentity[identity] = row;
|
|
307
|
+
}
|
|
308
|
+
rows.push(row);
|
|
309
|
+
});
|
|
310
|
+
return {
|
|
311
|
+
rows: rows,
|
|
312
|
+
updatedRows: Object.create(null),
|
|
313
|
+
byAnchor: byAnchor,
|
|
314
|
+
byIdentity: byIdentity,
|
|
315
|
+
nextAppendRow: Math.max(lastRow + 1, 2),
|
|
316
|
+
layout: layout,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function createRow_(targetContext, anchor, targetId) {
|
|
321
|
+
var cells = Object.create(null);
|
|
322
|
+
targetContext.layout.headers.forEach(function (header) { cells[header] = null; });
|
|
323
|
+
var row = {
|
|
324
|
+
rowNumber: targetContext.nextAppendRow++,
|
|
325
|
+
physicalAnchor: anchor,
|
|
326
|
+
targetId: targetId,
|
|
327
|
+
cells: cells,
|
|
328
|
+
writeFields: Object.create(null),
|
|
329
|
+
appended: true,
|
|
330
|
+
deleted: false,
|
|
331
|
+
};
|
|
332
|
+
targetContext.rows.push(row);
|
|
333
|
+
targetContext.byAnchor[anchor] = row;
|
|
334
|
+
if (targetId !== null) targetContext.byIdentity[targetId] = row;
|
|
335
|
+
return row;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function findRow_(targetContext, anchor, targetId) {
|
|
339
|
+
var row = targetContext.byAnchor[anchor] || null;
|
|
340
|
+
if (row === null && targetId !== null && targetId !== undefined) row = targetContext.byIdentity[targetId] || null;
|
|
341
|
+
return row !== null && row.deleted ? null : row;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function currentHash_(row, fields) {
|
|
345
|
+
var values = Object.create(null);
|
|
346
|
+
Object.keys(fields).forEach(function (fieldName) {
|
|
347
|
+
if (!Object.prototype.hasOwnProperty.call(row.cells, fieldName)) throw new Error("effect field is not a registered header: " + fieldName);
|
|
348
|
+
values[fieldName] = row.cells[fieldName];
|
|
349
|
+
});
|
|
350
|
+
return visibleHash_(values);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function physicalHash_(targetSheet, targetLayout, rowNumber, fields) {
|
|
354
|
+
var values = Object.create(null);
|
|
355
|
+
Object.keys(fields).forEach(function (fieldName) {
|
|
356
|
+
if (targetLayout.positions[fieldName] === undefined) throw new Error("effect field is not a registered header: " + fieldName);
|
|
357
|
+
values[fieldName] = normalizedCellFromSheetValue_(
|
|
358
|
+
targetSheet.getRange(rowNumber, targetLayout.positions[fieldName], 1, 1).getValues()[0][0],
|
|
359
|
+
);
|
|
360
|
+
});
|
|
361
|
+
return visibleHash_(values);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function readPostconditionReceipts_() {
|
|
365
|
+
var receiptSheetForRead = spreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
|
|
366
|
+
return receiptSheetForRead === null ? Object.create(null) : readReceipts_(receiptSheetForRead);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function classifyPostcondition_(targetContext, rawEffect, receiptsForRead) {
|
|
370
|
+
var checked = requireEffect_(rawEffect, args);
|
|
371
|
+
var receipt = receiptsForRead[checked.effectId] || null;
|
|
372
|
+
var row = findRow_(targetContext, checked.payload.targetAnchor, checked.targetId);
|
|
373
|
+
if (isDeletion_(checked.effectKind)) {
|
|
374
|
+
if (receipt !== null && row === null) return postcondition_("applied", receipt.visibleRevision, receipt.visibleHash);
|
|
375
|
+
if (row === null) return postcondition_("unavailable", null, null);
|
|
376
|
+
var deleteHash = currentHash_(row, checked.payload.fields);
|
|
377
|
+
if (receipt !== null) return postcondition_("changed", null, deleteHash);
|
|
378
|
+
return deleteHash === checked.expectedVisibleHash
|
|
379
|
+
? postcondition_("unapplied", checked.expectedVisibleRevision, deleteHash)
|
|
380
|
+
: postcondition_("changed", null, deleteHash);
|
|
381
|
+
}
|
|
382
|
+
if (row === null) return postcondition_(checked.payload.createIfMissing ? "unapplied" : "changed", null, null);
|
|
383
|
+
var current = currentHash_(row, checked.payload.fields);
|
|
384
|
+
if (current === checked.payload.targetVisibleHash) {
|
|
385
|
+
return postcondition_("applied", receipt === null ? checked.expectedVisibleRevision + 1 : receipt.visibleRevision, current);
|
|
386
|
+
}
|
|
387
|
+
var repairGuard = optionalWireText_(checked.repairGuardHash);
|
|
388
|
+
if (current === checked.expectedVisibleHash || (repairGuard !== null && current === repairGuard)) {
|
|
389
|
+
return postcondition_("unapplied", checked.expectedVisibleRevision, current);
|
|
390
|
+
}
|
|
391
|
+
return postcondition_("changed", null, current);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function postcondition_(disposition, revision, hash) {
|
|
395
|
+
return { disposition: disposition, visibleRevision: revision, visibleHash: hash, snapshotHash: null };
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function requireEffect_(rawEffect, request) {
|
|
399
|
+
requireObject_(rawEffect, "effect");
|
|
400
|
+
var effectKind = string_(rawEffect.effectKind, "effectKind");
|
|
401
|
+
if ([
|
|
402
|
+
EFFECT_KINDS.SYSTEM_PROJECTION,
|
|
403
|
+
EFFECT_KINDS.CANDIDATE_RECONCILE,
|
|
404
|
+
EFFECT_KINDS.SYSTEM_REPAIR,
|
|
405
|
+
EFFECT_KINDS.RESOLUTION_PROJECTION,
|
|
406
|
+
EFFECT_KINDS.RESOLUTION_DELETE,
|
|
407
|
+
EFFECT_KINDS.USER_INPUT_DELETE,
|
|
408
|
+
].indexOf(effectKind) < 0) throw new Error("unsupported sync effect kind: " + effectKind);
|
|
409
|
+
if (rawEffect.projection !== request.projection) throw new Error("effect projection is not registered for this request");
|
|
410
|
+
if (effectKind === EFFECT_KINDS.RESOLUTION_DELETE && request.projection !== "sync_conflicts") {
|
|
411
|
+
throw new Error("resolution_delete is only allowed on sync_conflicts");
|
|
412
|
+
}
|
|
413
|
+
if (effectKind === EFFECT_KINDS.USER_INPUT_DELETE && request.projection !== "user_input") {
|
|
414
|
+
throw new Error("user_input_delete is only allowed on user_input");
|
|
415
|
+
}
|
|
416
|
+
var payload = rawEffect.payload;
|
|
417
|
+
requireObject_(payload, "effect payload");
|
|
418
|
+
if (payload.sheetName !== request.sheetName || payload.registeredRange !== request.registeredRange ||
|
|
419
|
+
payload.schemaVersion !== request.schemaVersion) throw new Error("effect payload does not match the registered projection");
|
|
420
|
+
var fields = Object.create(null);
|
|
421
|
+
requireObject_(payload.fields, "effect fields");
|
|
422
|
+
Object.keys(payload.fields).forEach(function (fieldName) { fields[fieldName] = normalizeCell_(payload.fields[fieldName]); });
|
|
423
|
+
if (Object.keys(fields).length === 0) throw new Error("effect fields must contain a field");
|
|
424
|
+
if (visibleHash_(fields) !== string_(payload.targetVisibleHash, "targetVisibleHash")) {
|
|
425
|
+
throw new Error("effect targetVisibleHash does not match fields");
|
|
426
|
+
}
|
|
427
|
+
if (typeof payload.createIfMissing !== "boolean") throw new Error("effect createIfMissing must be boolean");
|
|
428
|
+
var expectedVisibleRevision = nonNegativeInteger_(rawEffect.expectedVisibleRevision, "expectedVisibleRevision");
|
|
429
|
+
var expectedVisibleHash = stringAllowEmpty_(rawEffect.expectedVisibleHash, "expectedVisibleHash");
|
|
430
|
+
if (
|
|
431
|
+
expectedVisibleHash.length === 0 &&
|
|
432
|
+
!(expectedVisibleRevision === 0 && payload.createIfMissing === true)
|
|
433
|
+
) {
|
|
434
|
+
throw new Error("empty expectedVisibleHash is only valid for a new row");
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
effectId: string_(rawEffect.effectId, "effectId"),
|
|
438
|
+
payloadHash: string_(rawEffect.payloadHash, "payloadHash"),
|
|
439
|
+
effectKind: effectKind,
|
|
440
|
+
targetId: typeof rawEffect.targetId === "string" && rawEffect.targetId.length > 0 ? rawEffect.targetId : null,
|
|
441
|
+
expectedVisibleRevision: expectedVisibleRevision,
|
|
442
|
+
expectedVisibleHash: expectedVisibleHash,
|
|
443
|
+
repairGuardHash: rawEffect.repairGuardHash,
|
|
444
|
+
payload: {
|
|
445
|
+
targetAnchor: string_(payload.targetAnchor, "targetAnchor"),
|
|
446
|
+
targetVisibleHash: payload.targetVisibleHash,
|
|
447
|
+
createIfMissing: payload.createIfMissing,
|
|
448
|
+
expectedCandidateHash: payload.expectedCandidateHash,
|
|
449
|
+
fields: fields,
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
function validateDeletion_(targetLayout, checked) {
|
|
455
|
+
if (checked.payload.createIfMissing || checked.expectedVisibleRevision < 1 ||
|
|
456
|
+
checked.payload.targetVisibleHash !== checked.expectedVisibleHash) return "invalid_deletion_guard";
|
|
457
|
+
var names = Object.keys(checked.payload.fields).sort();
|
|
458
|
+
var headers = targetLayout.headers.slice().sort();
|
|
459
|
+
if (names.length !== headers.length) return checked.effectKind + "_requires_full_row";
|
|
460
|
+
for (var index = 0; index < headers.length; index += 1) if (names[index] !== headers[index]) return checked.effectKind + "_requires_full_row";
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function result_(checked, status, rowNumber, reason, receipt) {
|
|
465
|
+
return {
|
|
466
|
+
effectId: checked.effectId,
|
|
467
|
+
payloadHash: checked.payloadHash,
|
|
468
|
+
status: status,
|
|
469
|
+
visibleRevision: receipt === null ? null : receipt.visibleRevision,
|
|
470
|
+
visibleHash: receipt === null ? null : receipt.visibleHash,
|
|
471
|
+
snapshotHash: null,
|
|
472
|
+
reason: reason === null ? null : reason,
|
|
473
|
+
postcondition: receipt === null ? "unavailable" : "verified",
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function makeReceipt_(checked, visibleHash, visibleRevision) {
|
|
478
|
+
return { effectId: checked.effectId, payloadHash: checked.payloadHash, status: "applied", visibleHash: visibleHash, visibleRevision: visibleRevision };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function ensureReceiptSheet_(targetSpreadsheet) {
|
|
482
|
+
var target = targetSpreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
|
|
483
|
+
if (target === null) target = targetSpreadsheet.insertSheet(RECEIPT_SHEET_NAME);
|
|
484
|
+
if (target.getLastRow() === 0 && target.getLastColumn() === 0) target.getRange(1, 1, 1, RECEIPT_HEADERS.length).setValues([RECEIPT_HEADERS]);
|
|
485
|
+
var actual = target.getRange(1, 1, 1, RECEIPT_HEADERS.length).getValues()[0];
|
|
486
|
+
RECEIPT_HEADERS.forEach(function (header, index) { if (String(actual[index]) !== header) throw new Error("receipt sheet headers do not match"); });
|
|
487
|
+
try { if (!target.isSheetHidden()) target.hideSheet(); } catch (error) {}
|
|
488
|
+
return target;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function readReceipts_(target) {
|
|
492
|
+
var parsed = Object.create(null);
|
|
493
|
+
var lastRow = target.getLastRow();
|
|
494
|
+
if (lastRow < 2) return parsed;
|
|
495
|
+
target.getRange(2, 1, lastRow - 1, RECEIPT_HEADERS.length).getValues().forEach(function (row, index) {
|
|
496
|
+
if (row[0] === "" || row[0] === null) return;
|
|
497
|
+
var effectId = String(row[0]);
|
|
498
|
+
if (parsed[effectId] !== undefined) throw new Error("receipt sheet contains duplicate effectId: " + effectId);
|
|
499
|
+
parsed[effectId] = {
|
|
500
|
+
effectId: effectId,
|
|
501
|
+
payloadHash: string_(row[1], "receipt payloadHash"),
|
|
502
|
+
status: string_(row[2], "receipt status"),
|
|
503
|
+
visibleHash: string_(row[3], "receipt visibleHash"),
|
|
504
|
+
visibleRevision: nonNegativeInteger_(row[4], "receipt visibleRevision"),
|
|
505
|
+
rowNumber: index + 2,
|
|
506
|
+
};
|
|
507
|
+
});
|
|
508
|
+
return parsed;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function queueReceipt_(stored, pending, pendingById, receipt) {
|
|
512
|
+
var existing = stored[receipt.effectId] || pendingById[receipt.effectId] || null;
|
|
513
|
+
if (existing !== null) {
|
|
514
|
+
if (existing.payloadHash !== receipt.payloadHash) throw new Error("effect ID cannot be reused with another payload");
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
pendingById[receipt.effectId] = receipt;
|
|
518
|
+
pending.push(receipt);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function writeReceipts_(target, values) {
|
|
522
|
+
if (values.length === 0) return;
|
|
523
|
+
var startRow = Math.max(target.getLastRow() + 1, 2);
|
|
524
|
+
var updatedAt = new Date().toISOString();
|
|
525
|
+
target.getRange(startRow, 1, values.length, RECEIPT_HEADERS.length).setValues(values.map(function (receipt) {
|
|
526
|
+
return [receipt.effectId, receipt.payloadHash, receipt.status, receipt.visibleHash, receipt.visibleRevision, updatedAt];
|
|
527
|
+
}));
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function writeAppendRows_(target, targetLayout, rows, checkboxHeaders) {
|
|
531
|
+
if (rows.length === 0) return;
|
|
532
|
+
rows.sort(function (left, right) { return left.rowNumber - right.rowNumber; });
|
|
533
|
+
target.getRange(rows[0].rowNumber, targetLayout.startColumn, rows.length, targetLayout.columnCount).setValues(rows.map(function (row) {
|
|
534
|
+
return targetLayout.headers.map(function (header) { return toSheetValue_(row.cells[header]); });
|
|
535
|
+
}));
|
|
536
|
+
rows.forEach(function (row) {
|
|
537
|
+
target.getRange(row.rowNumber + ":" + row.rowNumber).addDeveloperMetadata(ANCHOR_KEY, row.physicalAnchor, SpreadsheetApp.DeveloperMetadataVisibility.PROJECT);
|
|
538
|
+
});
|
|
539
|
+
if (Array.isArray(checkboxHeaders)) checkboxHeaders.forEach(function (header) {
|
|
540
|
+
var position = targetLayout.positions[header];
|
|
541
|
+
if (position === undefined) throw new Error("checkbox header is not registered: " + header);
|
|
542
|
+
target.getRange(rows[0].rowNumber, position, rows.length, 1).setDataValidation(
|
|
543
|
+
SpreadsheetApp.newDataValidation().requireCheckbox().setAllowInvalid(false).build(),
|
|
544
|
+
);
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
function writeFieldUpdates_(target, targetLayout, rows) {
|
|
549
|
+
rows.filter(function (row) { return !row.appended && Object.keys(row.writeFields).length > 0; }).forEach(function (row) {
|
|
550
|
+
var fields = Object.keys(row.writeFields).sort(function (left, right) { return targetLayout.positions[left] - targetLayout.positions[right]; });
|
|
551
|
+
var run = [];
|
|
552
|
+
fields.forEach(function (fieldName) {
|
|
553
|
+
if (run.length > 0 && targetLayout.positions[fieldName] !== targetLayout.positions[run[run.length - 1]] + 1) {
|
|
554
|
+
writeFieldRun_(target, targetLayout, row, run);
|
|
555
|
+
run = [];
|
|
556
|
+
}
|
|
557
|
+
run.push(fieldName);
|
|
558
|
+
});
|
|
559
|
+
if (run.length > 0) writeFieldRun_(target, targetLayout, row, run);
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function writeFieldRun_(target, targetLayout, row, fields) {
|
|
564
|
+
target.getRange(row.rowNumber, targetLayout.positions[fields[0]], 1, fields.length).setValues([
|
|
565
|
+
fields.map(function (fieldName) { return toSheetValue_(row.writeFields[fieldName]); }),
|
|
566
|
+
]);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
function readAnchors_(target, rowNumber) {
|
|
570
|
+
return target.getRange(rowNumber + ":" + rowNumber).getDeveloperMetadata().filter(function (metadata) {
|
|
571
|
+
return metadata.getKey() === ANCHOR_KEY;
|
|
572
|
+
}).map(function (metadata) { return String(metadata.getValue()); });
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function parseRange_(value) {
|
|
576
|
+
if (typeof value !== "string" || !/^[A-Z]+:[A-Z]+$/.test(value)) throw new Error("registeredRange must be an uppercase whole-column range");
|
|
577
|
+
var parts = value.split(":");
|
|
578
|
+
var startColumn = columnNumber_(parts[0]);
|
|
579
|
+
var endColumn = columnNumber_(parts[1]);
|
|
580
|
+
if (endColumn < startColumn) throw new Error("registeredRange end precedes start");
|
|
581
|
+
return { startColumn: startColumn, columnCount: endColumn - startColumn + 1 };
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function columnNumber_(letters) {
|
|
585
|
+
var value = 0;
|
|
586
|
+
for (var index = 0; index < letters.length; index += 1) value = value * 26 + letters.charCodeAt(index) - 64;
|
|
587
|
+
return value;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
function normalizeCell_(value) {
|
|
591
|
+
if (value === null) return null;
|
|
592
|
+
requireObject_(value, "normalized cell");
|
|
593
|
+
if (value.kind === "string" && typeof value.value === "string") return { kind: "string", value: normalizeScalarString_(value.value) };
|
|
594
|
+
if (value.kind === "date" && typeof value.value === "string") return { kind: "date", value: value.value };
|
|
595
|
+
if (value.kind === "number" && typeof value.value === "number" && isFinite(value.value)) return { kind: "number", value: value.value };
|
|
596
|
+
if (value.kind === "boolean" && typeof value.value === "boolean") return { kind: "boolean", value: value.value };
|
|
597
|
+
throw new Error("normalized cell is invalid");
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
function normalizedCellFromSheetValue_(value) {
|
|
601
|
+
if (value === "" || value === null) return null;
|
|
602
|
+
if (isDate_(value)) return { kind: "date", value: value.toISOString() };
|
|
603
|
+
if (typeof value === "string") return { kind: "string", value: normalizeScalarString_(value) };
|
|
604
|
+
if (typeof value === "number" && isFinite(value)) return { kind: "number", value: value };
|
|
605
|
+
if (typeof value === "boolean") return { kind: "boolean", value: value };
|
|
606
|
+
throw new Error("Sheet cell cannot be normalized");
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
function toSheetValue_(value) { return value === null ? "" : value.value; }
|
|
610
|
+
function identityFromCell_(value) {
|
|
611
|
+
if (value === null || value === undefined) return null;
|
|
612
|
+
if (typeof value.value === "string" && value.value.length > 0) return value.value;
|
|
613
|
+
if (typeof value.value === "number" && isFinite(value.value)) return String(value.value);
|
|
614
|
+
return null;
|
|
615
|
+
}
|
|
616
|
+
function optionalWireText_(value) {
|
|
617
|
+
if (value === null || value === undefined) return null;
|
|
618
|
+
if (typeof value === "string") return value;
|
|
619
|
+
if (isObject_(value) && (value.kind === "present" || value.kind === "applicable")) return string_(value.value, "optional wire value");
|
|
620
|
+
if (isObject_(value) && (value.kind === "absent" || value.kind === "not_applicable")) return null;
|
|
621
|
+
throw new Error("optional wire value is invalid");
|
|
622
|
+
}
|
|
623
|
+
function isDeletion_(effectKind) { return effectKind === EFFECT_KINDS.RESOLUTION_DELETE || effectKind === EFFECT_KINDS.USER_INPUT_DELETE; }
|
|
624
|
+
function countOperationKinds_(effects) {
|
|
625
|
+
var counts = { append: 0, update: 0, delete: 0 };
|
|
626
|
+
effects.forEach(function (effect) {
|
|
627
|
+
if (effect !== null && isDeletion_(effect.effectKind)) {
|
|
628
|
+
counts.delete += 1;
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
if (effect !== null && effect.payload !== null && effect.payload !== undefined &&
|
|
632
|
+
effect.payload.createIfMissing === true && effect.expectedVisibleRevision === 0 &&
|
|
633
|
+
effect.expectedVisibleHash === "") {
|
|
634
|
+
counts.append += 1;
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
counts.update += 1;
|
|
638
|
+
});
|
|
639
|
+
return counts;
|
|
640
|
+
}
|
|
641
|
+
function operationKinds_(counts) {
|
|
642
|
+
var kinds = [];
|
|
643
|
+
if (counts.append > 0) kinds.push("append");
|
|
644
|
+
if (counts.update > 0) kinds.push("update");
|
|
645
|
+
if (counts.delete > 0) kinds.push("delete");
|
|
646
|
+
return kinds;
|
|
647
|
+
}
|
|
648
|
+
function phase_(name, phaseStartedAt) {
|
|
649
|
+
phases.push({ phase: name, durationMs: Date.now() - phaseStartedAt });
|
|
650
|
+
}
|
|
651
|
+
function appendTimingPhase_(result, phaseName, durationMs) {
|
|
652
|
+
if (!isObject_(result) || !isObject_(result.timing)) return;
|
|
653
|
+
if (!Array.isArray(result.timing.phases)) result.timing.phases = [];
|
|
654
|
+
result.timing.phases.push({ phase: phaseName, durationMs: durationMs });
|
|
655
|
+
result.timing.durationMs = Number(result.timing.durationMs) + durationMs;
|
|
656
|
+
}
|
|
657
|
+
function isBlankRow_(row) { return row.every(function (cell) { return cell === "" || cell === null; }); }
|
|
658
|
+
function isDate_(value) { return Object.prototype.toString.call(value) === "[object Date]" && !isNaN(value.getTime()); }
|
|
659
|
+
function isObject_(value) { return value !== null && typeof value === "object" && !Array.isArray(value); }
|
|
660
|
+
function requireObject_(value, label) { if (!isObject_(value)) throw new Error(label + " must be an object"); return value; }
|
|
661
|
+
function string_(value, label) { if (typeof value !== "string" || value.length === 0) throw new Error(label + " must be a non-empty string"); return value; }
|
|
662
|
+
function stringAllowEmpty_(value, label) { if (typeof value !== "string") throw new Error(label + " must be a string"); return value; }
|
|
663
|
+
function nonNegativeInteger_(value, label) { if (typeof value !== "number" || !isFinite(value) || Math.floor(value) !== value || value < 0) throw new Error(label + " must be a non-negative integer"); return value; }
|
|
664
|
+
|
|
665
|
+
function visibleHash_(fields) {
|
|
666
|
+
return stableHash_({ fields: Object.keys(fields).sort().map(function (fieldName) { return { fieldName: fieldName, value: fields[fieldName] }; }) });
|
|
667
|
+
}
|
|
668
|
+
function stableHash_(value) { return sha256Hex_(stableEncode_(value)); }
|
|
669
|
+
function stableEncode_(value) {
|
|
670
|
+
if (value === null) return "n";
|
|
671
|
+
if (value === true) return "b1";
|
|
672
|
+
if (value === false) return "b0";
|
|
673
|
+
if (typeof value === "number") return stableEncodeNumber_(value);
|
|
674
|
+
if (typeof value === "string") return stableEncodeString_(value);
|
|
675
|
+
if (isObject_(value) && value.kind === "date" && typeof value.value === "string") return "d24:" + value.value;
|
|
676
|
+
if (Array.isArray(value)) return "a" + value.length + "[" + value.map(stableEncode_).join("") + "]";
|
|
677
|
+
if (isObject_(value)) {
|
|
678
|
+
var entries = Object.keys(value).map(function (key) { var normalized = normalizeScalarString_(key); return { key: normalized, bytes: utf8Bytes_(normalized), value: value[key] }; });
|
|
679
|
+
entries.sort(function (left, right) { return compareBytes_(left.bytes, right.bytes); });
|
|
680
|
+
return "o" + entries.length + "{" + entries.map(function (entry) { return "s" + entry.bytes.length + ":" + entry.key + stableEncode_(entry.value); }).join("") + "}";
|
|
681
|
+
}
|
|
682
|
+
throw new Error("stable value is unsupported");
|
|
683
|
+
}
|
|
684
|
+
function stableEncodeNumber_(value) { if (!isFinite(value)) throw new Error("stable number is not finite"); var decimal = value === 0 ? "0" : String(value).replace(/e\+/, "e").replace(/e(-?)0+(\d+)/, "e$1$2"); return "f" + utf8ByteLength_(decimal) + ":" + decimal; }
|
|
685
|
+
function stableEncodeString_(value) { var normalized = normalizeScalarString_(value); return "s" + utf8ByteLength_(normalized) + ":" + normalized; }
|
|
686
|
+
function normalizeScalarString_(value) { return value.normalize("NFC"); }
|
|
687
|
+
function sha256Hex_(value) { return Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value, Utilities.Charset.UTF_8).map(function (byte) { var unsigned = byte < 0 ? byte + 256 : byte; return ("0" + unsigned.toString(16)).slice(-2); }).join(""); }
|
|
688
|
+
function utf8Bytes_(value) { return Utilities.newBlob(value).getBytes(); }
|
|
689
|
+
function utf8ByteLength_(value) { return utf8Bytes_(value).length; }
|
|
690
|
+
function compareBytes_(left, right) { var count = Math.min(left.length, right.length); for (var index = 0; index < count; index += 1) { var a = left[index] < 0 ? left[index] + 256 : left[index]; var b = right[index] < 0 ? right[index] + 256 : right[index]; if (a !== b) return a - b; } return left.length - right.length; }
|
|
691
|
+
}`;
|
|
692
|
+
//# sourceMappingURL=effectOperationScript.js.map
|