@friggframework/core 2.0.0--canary.545.ccb5010.0 → 2.0.0--canary.549.b074651.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/CHANGELOG.md +67 -66
- package/CLAUDE.md +124 -148
- package/README.md +130 -165
- package/assertions/jest.config.ts +7 -0
- package/core/CLAUDE.md +156 -222
- package/database/MONGODB_TRANSACTION_FIX.md +52 -72
- package/database/encryption/README.md +36 -53
- package/database/jest.config.ts +7 -0
- package/database/models/WorkflowExecutionModel.ts +315 -0
- package/database/models/WorkflowModel.ts +129 -0
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +80 -135
- package/generated/prisma-mongodb/edge.js +5 -60
- package/generated/prisma-mongodb/index-browser.js +1 -49
- package/generated/prisma-mongodb/index.d.ts +57 -4019
- package/generated/prisma-mongodb/index.js +11 -66
- package/generated/prisma-mongodb/package.json +1 -1
- package/generated/prisma-mongodb/{libquery_engine-debian-openssl-3.0.x.so.node → query-engine-debian-openssl-3.0.x} +0 -0
- package/generated/prisma-mongodb/{libquery_engine-rhel-openssl-3.0.x.so.node → query-engine-rhel-openssl-3.0.x} +0 -0
- package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
- package/generated/prisma-mongodb/runtime/binary.js +289 -0
- package/generated/prisma-mongodb/schema.prisma +2 -89
- package/generated/prisma-mongodb/wasm.js +5 -60
- package/generated/prisma-postgresql/edge.js +5 -59
- package/generated/prisma-postgresql/index-browser.js +1 -48
- package/generated/prisma-postgresql/index.d.ts +44 -4732
- package/generated/prisma-postgresql/index.js +11 -65
- package/generated/prisma-postgresql/package.json +1 -1
- package/generated/prisma-postgresql/{libquery_engine-debian-openssl-3.0.x.so.node → query-engine-debian-openssl-3.0.x} +0 -0
- package/generated/prisma-postgresql/{libquery_engine-rhel-openssl-3.0.x.so.node → query-engine-rhel-openssl-3.0.x} +0 -0
- package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
- package/generated/prisma-postgresql/runtime/binary.js +289 -0
- package/generated/prisma-postgresql/schema.prisma +2 -87
- package/generated/prisma-postgresql/wasm.js +5 -59
- package/handlers/WEBHOOKS.md +81 -104
- package/handlers/routers/HEALTHCHECK.md +135 -170
- package/integrations/WEBHOOK-QUICKSTART.md +14 -21
- package/jest-global-setup-noop.ts +3 -0
- package/jest-global-teardown-noop.ts +3 -0
- package/jest-resolver.ts +36 -0
- package/jest-setup.ts +1 -0
- package/jest-teardown.ts +1 -0
- package/jest.config.ts +20 -0
- package/package.json +32 -8
- package/prisma-mongodb/schema.prisma +2 -89
- package/prisma-postgresql/schema.prisma +2 -87
- package/src/application/commands/command-utils.ts +17 -0
- package/src/application/commands/credential-commands.ts +214 -0
- package/src/application/commands/entity-commands.ts +253 -0
- package/src/application/commands/integration-commands.test.ts +158 -0
- package/src/application/commands/integration-commands.ts +205 -0
- package/{application/commands/scheduler-commands.js → src/application/commands/scheduler-commands.ts} +82 -104
- package/{application/commands/user-commands.js → src/application/commands/user-commands.ts} +73 -97
- package/src/application/index.ts +82 -0
- package/src/assertions/get.ts +196 -0
- package/src/assertions/index.ts +9 -0
- package/src/associations/association.ts +103 -0
- package/src/associations/index.ts +3 -0
- package/src/core/Delegate.ts +41 -0
- package/src/core/Worker.test.ts +158 -0
- package/src/core/Worker.ts +86 -0
- package/{core/create-handler.js → src/core/create-handler.ts} +42 -15
- package/src/core/index.ts +15 -0
- package/src/core/load-installed-modules.ts +31 -0
- package/{core/secrets-to-env.js → src/core/secrets-to-env.ts} +14 -14
- package/src/credential/index.ts +9 -0
- package/src/credential/repositories/credential-repository-documentdb.ts +185 -0
- package/src/credential/repositories/credential-repository-factory.ts +26 -0
- package/src/credential/repositories/credential-repository-interface.ts +62 -0
- package/src/credential/repositories/credential-repository-mongo.ts +163 -0
- package/src/credential/repositories/credential-repository-postgres.ts +169 -0
- package/src/credential/repositories/credential-repository.ts +162 -0
- package/src/credential/use-cases/get-credential-for-user.ts +27 -0
- package/src/credential/use-cases/update-authentication-status.ts +17 -0
- package/src/database/adapters/index.ts +1 -0
- package/src/database/adapters/lambda-invoker.test.ts +104 -0
- package/src/database/adapters/lambda-invoker.ts +61 -0
- package/src/database/config.ts +142 -0
- package/src/database/documentdb-encryption-service.ts +191 -0
- package/src/database/documentdb-utils.ts +160 -0
- package/src/database/encryption/encryption-schema-registry.test.ts +397 -0
- package/src/database/encryption/encryption-schema-registry.ts +243 -0
- package/src/database/encryption/field-encryption-service.test.ts +511 -0
- package/{database/encryption/field-encryption-service.js → src/database/encryption/field-encryption-service.ts} +46 -67
- package/src/database/encryption/index.ts +24 -0
- package/{database/encryption/logger.js → src/database/encryption/logger.ts} +19 -21
- package/src/database/encryption/mongo-decryption-fix-verification.test.ts +337 -0
- package/src/database/encryption/postgres-decryption-fix-verification.test.ts +335 -0
- package/src/database/encryption/postgres-relation-decryption.test.ts +205 -0
- package/src/database/encryption/prisma-encryption-extension.test.ts +433 -0
- package/{database/encryption/prisma-encryption-extension.js → src/database/encryption/prisma-encryption-extension.ts} +58 -77
- package/src/database/index.ts +126 -0
- package/src/database/prisma.test.ts +65 -0
- package/src/database/prisma.ts +166 -0
- package/{database/repositories/health-check-repository-documentdb.js → src/database/repositories/health-check-repository-documentdb.ts} +34 -45
- package/src/database/repositories/health-check-repository-factory.ts +38 -0
- package/src/database/repositories/health-check-repository-interface.ts +20 -0
- package/src/database/repositories/health-check-repository-mongodb.test.ts +178 -0
- package/src/database/repositories/health-check-repository-mongodb.ts +79 -0
- package/src/database/repositories/health-check-repository-postgres.test.ts +94 -0
- package/src/database/repositories/health-check-repository-postgres.ts +70 -0
- package/src/database/repositories/index.ts +10 -0
- package/src/database/repositories/migration-status-repository-s3.test.ts +150 -0
- package/src/database/repositories/migration-status-repository-s3.ts +127 -0
- package/src/database/use-cases/check-database-health-use-case.test.ts +131 -0
- package/src/database/use-cases/check-database-health-use-case.ts +30 -0
- package/src/database/use-cases/check-database-state-use-case.test.ts +131 -0
- package/src/database/use-cases/check-database-state-use-case.ts +66 -0
- package/src/database/use-cases/check-encryption-health-use-case.test.ts +183 -0
- package/{database/use-cases/check-encryption-health-use-case.js → src/database/use-cases/check-encryption-health-use-case.ts} +38 -15
- package/src/database/use-cases/get-database-state-via-worker-use-case.test.ts +126 -0
- package/src/database/use-cases/get-database-state-via-worker-use-case.ts +31 -0
- package/src/database/use-cases/get-migration-status-use-case.test.ts +160 -0
- package/src/database/use-cases/get-migration-status-use-case.ts +57 -0
- package/src/database/use-cases/index.ts +14 -0
- package/src/database/use-cases/run-database-migration-use-case.test.ts +350 -0
- package/src/database/use-cases/run-database-migration-use-case.ts +113 -0
- package/src/database/use-cases/test-encryption-use-case.ts +197 -0
- package/src/database/use-cases/trigger-database-migration-use-case.test.ts +256 -0
- package/src/database/use-cases/trigger-database-migration-use-case.ts +131 -0
- package/src/database/utils/index.ts +26 -0
- package/src/database/utils/mongodb-collection-utils.test.ts +133 -0
- package/src/database/utils/mongodb-collection-utils.ts +45 -0
- package/src/database/utils/mongodb-schema-init.test.ts +152 -0
- package/src/database/utils/mongodb-schema-init.ts +51 -0
- package/src/database/utils/prisma-runner.test.ts +513 -0
- package/src/database/utils/prisma-runner.ts +336 -0
- package/src/database/utils/prisma-schema-parser.test.ts +283 -0
- package/src/database/utils/prisma-schema-parser.ts +90 -0
- package/src/declarations.d.ts +141 -0
- package/src/encrypt/Cryptor.test.ts +137 -0
- package/src/encrypt/Cryptor.ts +92 -0
- package/{encrypt/aes.js → src/encrypt/aes.ts} +4 -9
- package/src/encrypt/index.ts +2 -0
- package/src/errors/base-error.test.ts +32 -0
- package/src/errors/base-error.ts +15 -0
- package/src/errors/client-safe-error.ts +12 -0
- package/src/errors/fetch-error.test.ts +105 -0
- package/{errors/fetch-error.js → src/errors/fetch-error.ts} +36 -17
- package/src/errors/halt-error.test.ts +11 -0
- package/src/errors/halt-error.ts +10 -0
- package/src/errors/index.ts +9 -0
- package/src/errors/validation-errors.test.ts +122 -0
- package/src/errors/validation-errors.ts +33 -0
- package/src/handlers/app-definition-loader.ts +52 -0
- package/src/handlers/app-handler-helpers.ts +62 -0
- package/src/handlers/auth-flow.integration.test.ts +149 -0
- package/{handlers/backend-utils.js → src/handlers/backend-utils.ts} +55 -52
- package/src/handlers/database-migration-handler.ts +172 -0
- package/src/handlers/index.ts +22 -0
- package/src/handlers/integration-event-dispatcher.test.ts +211 -0
- package/{handlers/integration-event-dispatcher.js → src/handlers/integration-event-dispatcher.ts} +33 -9
- package/src/handlers/routers/auth.ts +20 -0
- package/src/handlers/routers/db-migration.handler.ts +28 -0
- package/src/handlers/routers/db-migration.test.ts +69 -0
- package/src/handlers/routers/db-migration.ts +173 -0
- package/src/handlers/routers/health.test.ts +251 -0
- package/src/handlers/routers/health.ts +390 -0
- package/src/handlers/routers/index.ts +8 -0
- package/src/handlers/routers/integration-defined-routers.ts +50 -0
- package/src/handlers/routers/integration-webhook-routers.test.ts +116 -0
- package/src/handlers/routers/integration-webhook-routers.ts +72 -0
- package/src/handlers/routers/user.ts +63 -0
- package/{handlers/routers/websocket.js → src/handlers/routers/websocket.ts} +25 -28
- package/{handlers/use-cases/check-external-apis-health-use-case.js → src/handlers/use-cases/check-external-apis-health-use-case.ts} +31 -12
- package/src/handlers/use-cases/check-integrations-health-use-case.test.ts +124 -0
- package/src/handlers/use-cases/check-integrations-health-use-case.ts +69 -0
- package/src/handlers/use-cases/index.ts +9 -0
- package/src/handlers/webhook-flow.integration.test.ts +318 -0
- package/src/handlers/workers/db-migration.test.ts +168 -0
- package/src/handlers/workers/db-migration.ts +173 -0
- package/src/handlers/workers/index.ts +3 -0
- package/src/handlers/workers/integration-defined-workers.test.ts +254 -0
- package/src/handlers/workers/integration-defined-workers.ts +35 -0
- package/src/index.ts +400 -0
- package/src/infrastructure/index.ts +14 -0
- package/src/infrastructure/scheduler/eventbridge-scheduler-adapter.ts +148 -0
- package/src/infrastructure/scheduler/index.ts +19 -0
- package/{infrastructure/scheduler/mock-scheduler-adapter.js → src/infrastructure/scheduler/mock-scheduler-adapter.ts} +25 -59
- package/src/infrastructure/scheduler/scheduler-service-factory.ts +50 -0
- package/src/infrastructure/scheduler/scheduler-service-interface.ts +31 -0
- package/src/integrations/index.ts +79 -0
- package/src/integrations/integration-base.module-keys.test.ts +204 -0
- package/{integrations/integration-base.js → src/integrations/integration-base.ts} +161 -169
- package/src/integrations/integration-router.ts +645 -0
- package/src/integrations/options.ts +57 -0
- package/{integrations/repositories/integration-mapping-repository-documentdb.js → src/integrations/repositories/integration-mapping-repository-documentdb.ts} +54 -134
- package/src/integrations/repositories/integration-mapping-repository-factory.ts +27 -0
- package/src/integrations/repositories/integration-mapping-repository-interface.ts +56 -0
- package/src/integrations/repositories/integration-mapping-repository-mongo.ts +89 -0
- package/src/integrations/repositories/integration-mapping-repository-postgres.ts +129 -0
- package/src/integrations/repositories/integration-mapping-repository.ts +71 -0
- package/{integrations/repositories/integration-repository-documentdb.js → src/integrations/repositories/integration-repository-documentdb.ts} +51 -89
- package/src/integrations/repositories/integration-repository-factory.ts +27 -0
- package/src/integrations/repositories/integration-repository-interface.ts +52 -0
- package/src/integrations/repositories/integration-repository-mongo.ts +186 -0
- package/src/integrations/repositories/integration-repository-postgres.ts +227 -0
- package/{integrations/repositories/process-repository-documentdb.js → src/integrations/repositories/process-repository-documentdb.ts} +57 -124
- package/src/integrations/repositories/process-repository-factory.ts +27 -0
- package/src/integrations/repositories/process-repository-interface.ts +34 -0
- package/src/integrations/repositories/process-repository-mongo.ts +102 -0
- package/src/integrations/repositories/process-repository-postgres.ts +123 -0
- package/{integrations/tests/doubles/config-capturing-integration.js → src/integrations/tests/doubles/config-capturing-integration.ts} +21 -22
- package/src/integrations/tests/doubles/dummy-integration-class.ts +109 -0
- package/src/integrations/tests/doubles/test-integration-repository.ts +100 -0
- package/src/integrations/tests/integration-router-multi-auth.test.ts +531 -0
- package/src/integrations/tests/use-cases/create-integration.test.ts +131 -0
- package/src/integrations/tests/use-cases/delete-integration-for-user.test.ts +150 -0
- package/src/integrations/tests/use-cases/find-integration-context-by-external-entity-id.test.ts +92 -0
- package/src/integrations/tests/use-cases/get-integration-for-user.test.ts +150 -0
- package/src/integrations/tests/use-cases/get-integration-instance.test.ts +176 -0
- package/src/integrations/tests/use-cases/get-integrations-for-user.test.ts +176 -0
- package/src/integrations/tests/use-cases/get-possible-integrations.test.ts +188 -0
- package/src/integrations/tests/use-cases/update-integration-messages.test.ts +142 -0
- package/src/integrations/tests/use-cases/update-integration-status.test.ts +103 -0
- package/src/integrations/tests/use-cases/update-integration.test.ts +208 -0
- package/src/integrations/types.ts +195 -0
- package/src/integrations/use-cases/create-integration.ts +70 -0
- package/src/integrations/use-cases/create-process.test.ts +172 -0
- package/src/integrations/use-cases/create-process.ts +77 -0
- package/src/integrations/use-cases/delete-integration-for-user.ts +87 -0
- package/src/integrations/use-cases/find-integration-context-by-external-entity-id.ts +92 -0
- package/src/integrations/use-cases/get-integration-for-user.ts +74 -0
- package/src/integrations/use-cases/get-integration-instance-by-definition.ts +69 -0
- package/{integrations/use-cases/get-integration-instance.js → src/integrations/use-cases/get-integration-instance.ts} +20 -31
- package/src/integrations/use-cases/get-integrations-for-user.ts +75 -0
- package/src/integrations/use-cases/get-possible-integrations.ts +15 -0
- package/src/integrations/use-cases/get-process.test.ts +181 -0
- package/src/integrations/use-cases/get-process.ts +49 -0
- package/src/integrations/use-cases/index.ts +16 -0
- package/src/integrations/use-cases/load-integration-context-full.test.ts +316 -0
- package/src/integrations/use-cases/load-integration-context.test.ts +115 -0
- package/{integrations/use-cases/load-integration-context.js → src/integrations/use-cases/load-integration-context.ts} +34 -14
- package/src/integrations/use-cases/update-integration-messages.ts +26 -0
- package/src/integrations/use-cases/update-integration-status.ts +17 -0
- package/src/integrations/use-cases/update-integration.ts +76 -0
- package/src/integrations/use-cases/update-process-metrics.test.ts +278 -0
- package/src/integrations/use-cases/update-process-metrics.ts +128 -0
- package/src/integrations/use-cases/update-process-state.test.ts +249 -0
- package/src/integrations/use-cases/update-process-state.ts +73 -0
- package/src/integrations/utils/map-integration-dto.ts +55 -0
- package/src/lambda/TimeoutCatcher.test.ts +69 -0
- package/src/lambda/TimeoutCatcher.ts +57 -0
- package/src/lambda/index.ts +2 -0
- package/src/logs/index.ts +2 -0
- package/src/logs/logger.test.ts +76 -0
- package/{logs/logger.js → src/logs/logger.ts} +15 -10
- package/src/modules/ModuleConstants.ts +11 -0
- package/src/modules/index.ts +38 -0
- package/{modules/module-factory.js → src/modules/module-factory.ts} +16 -20
- package/src/modules/module-hydration.test.ts +203 -0
- package/src/modules/module.ts +283 -0
- package/src/modules/repositories/module-repository-documentdb.ts +303 -0
- package/src/modules/repositories/module-repository-factory.ts +29 -0
- package/src/modules/repositories/module-repository-interface.ts +73 -0
- package/src/modules/repositories/module-repository-mongo.ts +260 -0
- package/src/modules/repositories/module-repository-postgres.ts +293 -0
- package/src/modules/repositories/module-repository.ts +210 -0
- package/src/modules/requester/api-key.ts +58 -0
- package/src/modules/requester/basic.ts +49 -0
- package/src/modules/requester/oauth-2.test.ts +425 -0
- package/src/modules/requester/oauth-2.ts +298 -0
- package/src/modules/requester/requester.test.ts +28 -0
- package/src/modules/requester/requester.ts +212 -0
- package/{modules/test/mock-api/api.js → src/modules/test/mock-api/api.ts} +6 -8
- package/{modules/test/mock-api/definition.js → src/modules/test/mock-api/definition.ts} +15 -21
- package/src/modules/test/mock-api/mocks/hubspot.ts +41 -0
- package/src/modules/tests/doubles/test-module-factory.ts +11 -0
- package/{modules/tests/doubles/test-module-repository.js → src/modules/tests/doubles/test-module-repository.ts} +7 -7
- package/src/modules/tests/module-on-token-update.test.ts +125 -0
- package/src/modules/use-cases/get-entities-for-user.ts +36 -0
- package/src/modules/use-cases/get-entity-options-by-id.ts +64 -0
- package/src/modules/use-cases/get-entity-options-by-type.ts +25 -0
- package/src/modules/use-cases/get-module-instance-from-type.ts +23 -0
- package/src/modules/use-cases/get-module.ts +70 -0
- package/{modules/use-cases/process-authorization-callback.js → src/modules/use-cases/process-authorization-callback.ts} +50 -49
- package/src/modules/use-cases/refresh-entity-options.ts +65 -0
- package/src/modules/use-cases/test-module-auth.ts +64 -0
- package/src/modules/utils/map-module-dto.ts +23 -0
- package/src/queues/index.ts +1 -0
- package/src/queues/queuer-util.test.ts +131 -0
- package/src/queues/queuer-util.ts +59 -0
- package/src/syncs/index.ts +14 -0
- package/{syncs/manager.js → src/syncs/manager.ts} +140 -142
- package/{syncs/repositories/sync-repository-documentdb.js → src/syncs/repositories/sync-repository-documentdb.ts} +46 -67
- package/src/syncs/repositories/sync-repository-factory.ts +30 -0
- package/src/syncs/repositories/sync-repository-interface.ts +68 -0
- package/src/syncs/repositories/sync-repository-mongo.ts +149 -0
- package/src/syncs/repositories/sync-repository-postgres.ts +221 -0
- package/src/syncs/sync.ts +119 -0
- package/src/token/index.ts +7 -0
- package/src/token/repositories/token-repository-documentdb.ts +110 -0
- package/src/token/repositories/token-repository-factory.ts +26 -0
- package/src/token/repositories/token-repository-interface.ts +57 -0
- package/src/token/repositories/token-repository-mongo.ts +81 -0
- package/src/token/repositories/token-repository-postgres.ts +105 -0
- package/src/token/repositories/token-repository.ts +125 -0
- package/src/user/index.ts +17 -0
- package/src/user/repositories/user-repository-documentdb.ts +286 -0
- package/src/user/repositories/user-repository-factory.ts +26 -0
- package/src/user/repositories/user-repository-interface.ts +109 -0
- package/src/user/repositories/user-repository-mongo.ts +130 -0
- package/src/user/repositories/user-repository-postgres.ts +175 -0
- package/{user/tests/doubles/test-user-repository.js → src/user/tests/doubles/test-user-repository.ts} +16 -19
- package/src/user/tests/use-cases/create-individual-user.test.ts +24 -0
- package/src/user/tests/use-cases/create-organization-user.test.ts +28 -0
- package/src/user/tests/use-cases/create-token-for-user-id.test.ts +18 -0
- package/src/user/tests/use-cases/get-user-from-adopter-jwt.test.ts +113 -0
- package/src/user/tests/use-cases/get-user-from-bearer-token.test.ts +64 -0
- package/src/user/tests/use-cases/get-user-from-x-frigg-headers.test.ts +440 -0
- package/src/user/tests/use-cases/login-user.test.ts +220 -0
- package/src/user/use-cases/authenticate-user.ts +98 -0
- package/src/user/use-cases/authenticate-with-shared-secret.test.ts +127 -0
- package/src/user/use-cases/authenticate-with-shared-secret.ts +19 -0
- package/src/user/use-cases/create-individual-user.ts +59 -0
- package/src/user/use-cases/create-organization-user.ts +44 -0
- package/src/user/use-cases/create-token-for-user-id.ts +19 -0
- package/src/user/use-cases/get-user-from-adopter-jwt.ts +40 -0
- package/{user/use-cases/get-user-from-bearer-token.js → src/user/use-cases/get-user-from-bearer-token.ts} +23 -30
- package/src/user/use-cases/get-user-from-x-frigg-headers.ts +119 -0
- package/src/user/use-cases/login-user.ts +110 -0
- package/src/user/user.ts +125 -0
- package/{utils/backend-path.js → src/utils/backend-path.ts} +5 -8
- package/src/utils/index.ts +2 -0
- package/src/websocket/index.ts +7 -0
- package/src/websocket/repositories/websocket-connection-repository-documentdb.ts +93 -0
- package/src/websocket/repositories/websocket-connection-repository-factory.ts +26 -0
- package/src/websocket/repositories/websocket-connection-repository-interface.ts +47 -0
- package/src/websocket/repositories/websocket-connection-repository-mongo.ts +77 -0
- package/src/websocket/repositories/websocket-connection-repository-postgres.ts +94 -0
- package/src/websocket/repositories/websocket-connection-repository.test.ts +220 -0
- package/src/websocket/repositories/websocket-connection-repository.ts +101 -0
- package/tsconfig.json +17 -0
- package/tsconfig.test.json +10 -0
- package/workflows/frigg-workflow.ts +322 -0
- package/workflows/index.ts +205 -0
- package/workflows/steps/fan-out-step.ts +275 -0
- package/workflows/steps/function-step.ts +174 -0
- package/workflows/steps/index.ts +30 -0
- package/workflows/steps/workflow-step.ts +115 -0
- package/workflows/use-cases/create-workflow.ts +332 -0
- package/workflows/use-cases/execute-workflow-step.ts +465 -0
- package/workflows/use-cases/execute-workflow.ts +403 -0
- package/workflows/workflow-execution-repository.ts +415 -0
- package/workflows/workflow-execution.ts +209 -0
- package/workflows/workflow-queue-service.ts +379 -0
- package/workflows/workflow-repository.ts +295 -0
- package/workflows/workflow.ts +117 -0
- package/admin-scripts/index.js +0 -52
- package/admin-scripts/repositories/admin-api-key-repository-documentdb.js +0 -21
- package/admin-scripts/repositories/admin-api-key-repository-factory.js +0 -51
- package/admin-scripts/repositories/admin-api-key-repository-interface.js +0 -121
- package/admin-scripts/repositories/admin-api-key-repository-mongo.js +0 -155
- package/admin-scripts/repositories/admin-api-key-repository-postgres.js +0 -189
- package/admin-scripts/repositories/admin-process-repository-documentdb.js +0 -21
- package/admin-scripts/repositories/admin-process-repository-factory.js +0 -49
- package/admin-scripts/repositories/admin-process-repository-interface.js +0 -150
- package/admin-scripts/repositories/admin-process-repository-mongo.js +0 -213
- package/admin-scripts/repositories/admin-process-repository-postgres.js +0 -251
- package/admin-scripts/repositories/script-execution-repository-documentdb.js +0 -21
- package/admin-scripts/repositories/script-execution-repository-factory.js +0 -51
- package/admin-scripts/repositories/script-execution-repository-interface.js +0 -193
- package/admin-scripts/repositories/script-execution-repository-mongo.js +0 -278
- package/admin-scripts/repositories/script-execution-repository-postgres.js +0 -320
- package/admin-scripts/repositories/script-schedule-repository-documentdb.js +0 -21
- package/admin-scripts/repositories/script-schedule-repository-factory.js +0 -49
- package/admin-scripts/repositories/script-schedule-repository-interface.js +0 -108
- package/admin-scripts/repositories/script-schedule-repository-mongo.js +0 -179
- package/admin-scripts/repositories/script-schedule-repository-postgres.js +0 -210
- package/application/commands/admin-script-commands.js +0 -348
- package/application/commands/credential-commands.js +0 -245
- package/application/commands/entity-commands.js +0 -336
- package/application/commands/integration-commands.js +0 -216
- package/application/index.js +0 -75
- package/assertions/get.js +0 -149
- package/assertions/index.js +0 -16
- package/assertions/jest.config.js +0 -5
- package/associations/association.js +0 -80
- package/core/Delegate.js +0 -29
- package/core/Worker.js +0 -93
- package/core/index.js +0 -6
- package/core/load-installed-modules.js +0 -28
- package/credential/credential-router.js +0 -262
- package/credential/repositories/credential-repository-documentdb.js +0 -374
- package/credential/repositories/credential-repository-factory.js +0 -52
- package/credential/repositories/credential-repository-interface.js +0 -104
- package/credential/repositories/credential-repository-mongo.js +0 -310
- package/credential/repositories/credential-repository-postgres.js +0 -328
- package/credential/repositories/credential-repository.js +0 -302
- package/credential/use-cases/delete-credential-for-user.js +0 -50
- package/credential/use-cases/get-credential-for-user.js +0 -43
- package/credential/use-cases/list-credentials-for-user.js +0 -31
- package/credential/use-cases/reauthorize-credential.js +0 -103
- package/credential/use-cases/update-authentication-status.js +0 -18
- package/database/config.js +0 -108
- package/database/documentdb-encryption-service.js +0 -346
- package/database/documentdb-utils.js +0 -145
- package/database/encryption/encryption-schema-registry.js +0 -314
- package/database/index.js +0 -25
- package/database/jest.config.js +0 -5
- package/database/prisma.js +0 -193
- package/database/repositories/health-check-repository-factory.js +0 -50
- package/database/repositories/health-check-repository-interface.js +0 -92
- package/database/repositories/health-check-repository-mongodb.js +0 -89
- package/database/repositories/health-check-repository-postgres.js +0 -82
- package/database/use-cases/check-database-health-use-case.js +0 -30
- package/database/use-cases/check-database-state-use-case.js +0 -82
- package/database/use-cases/get-database-state-via-worker-use-case.js +0 -64
- package/database/use-cases/get-migration-status-use-case.js +0 -95
- package/database/use-cases/run-database-migration-use-case.js +0 -171
- package/database/use-cases/test-encryption-use-case.js +0 -252
- package/database/use-cases/trigger-database-migration-use-case.js +0 -158
- package/database/utils/mongodb-collection-utils.js +0 -102
- package/database/utils/mongodb-schema-init.js +0 -114
- package/database/utils/prisma-runner.js +0 -547
- package/database/utils/prisma-schema-parser.js +0 -182
- package/encrypt/Cryptor.js +0 -107
- package/encrypt/aes-encryption-key-provider.js +0 -82
- package/encrypt/encryption-key-provider-interface.js +0 -50
- package/encrypt/index.js +0 -3
- package/errors/base-error.js +0 -23
- package/errors/client-safe-error.js +0 -26
- package/errors/halt-error.js +0 -10
- package/errors/index.js +0 -17
- package/errors/validation-errors.js +0 -23
- package/extensions/bootstrap-runner.js +0 -43
- package/extensions/extension-loader.js +0 -167
- package/extensions/index.js +0 -37
- package/extensions/initialize-app.js +0 -123
- package/extensions/route-mounter.js +0 -59
- package/extensions/schema-composer.js +0 -188
- package/generated/prisma-mongodb/runtime/library.js +0 -146
- package/generated/prisma-postgresql/runtime/library.js +0 -146
- package/handlers/app-definition-loader.js +0 -81
- package/handlers/app-handler-helpers.js +0 -68
- package/handlers/database-migration-handler.js +0 -246
- package/handlers/middleware/admin-auth.js +0 -53
- package/handlers/routers/admin.js +0 -474
- package/handlers/routers/auth.js +0 -57
- package/handlers/routers/db-migration.handler.js +0 -28
- package/handlers/routers/db-migration.js +0 -362
- package/handlers/routers/docs.js +0 -180
- package/handlers/routers/health.js +0 -317
- package/handlers/routers/integration-defined-routers.js +0 -56
- package/handlers/routers/integration-webhook-routers.js +0 -88
- package/handlers/routers/middleware/loadUser.js +0 -39
- package/handlers/routers/middleware/requireAdmin.js +0 -43
- package/handlers/routers/middleware/requireLoggedInUser.js +0 -19
- package/handlers/routers/user.js +0 -79
- package/handlers/use-cases/check-integrations-health-use-case.js +0 -51
- package/handlers/workers/db-migration.js +0 -391
- package/handlers/workers/integration-defined-workers.js +0 -38
- package/index.js +0 -220
- package/infrastructure/scheduler/index.js +0 -37
- package/infrastructure/scheduler/netlify-scheduler-adapter.js +0 -185
- package/infrastructure/scheduler/scheduler-service-factory.js +0 -80
- package/infrastructure/scheduler/scheduler-service-interface.js +0 -47
- package/integrations/index.js +0 -25
- package/integrations/integration-router.js +0 -2354
- package/integrations/options.js +0 -80
- package/integrations/repositories/integration-mapping-repository-factory.js +0 -53
- package/integrations/repositories/integration-mapping-repository-interface.js +0 -106
- package/integrations/repositories/integration-mapping-repository-mongo.js +0 -161
- package/integrations/repositories/integration-mapping-repository-postgres.js +0 -227
- package/integrations/repositories/integration-mapping-repository.js +0 -156
- package/integrations/repositories/integration-repository-factory.js +0 -51
- package/integrations/repositories/integration-repository-interface.js +0 -145
- package/integrations/repositories/integration-repository-mongo.js +0 -303
- package/integrations/repositories/integration-repository-postgres.js +0 -352
- package/integrations/repositories/process-repository-factory.js +0 -50
- package/integrations/repositories/process-repository-interface.js +0 -94
- package/integrations/repositories/process-repository-mongo.js +0 -194
- package/integrations/repositories/process-repository-postgres.js +0 -217
- package/integrations/tests/doubles/dummy-integration-class.js +0 -178
- package/integrations/tests/doubles/test-integration-repository.js +0 -139
- package/integrations/use-cases/create-integration.js +0 -87
- package/integrations/use-cases/create-process.js +0 -139
- package/integrations/use-cases/delete-integration-for-user.js +0 -102
- package/integrations/use-cases/execute-proxy-request.js +0 -564
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +0 -72
- package/integrations/use-cases/get-integration-for-user.js +0 -93
- package/integrations/use-cases/get-integration-instance-by-definition.js +0 -73
- package/integrations/use-cases/get-integrations-for-user.js +0 -91
- package/integrations/use-cases/get-possible-integrations.js +0 -27
- package/integrations/use-cases/get-process.js +0 -86
- package/integrations/use-cases/index.js +0 -21
- package/integrations/use-cases/update-integration-messages.js +0 -44
- package/integrations/use-cases/update-integration-status.js +0 -32
- package/integrations/use-cases/update-integration.js +0 -92
- package/integrations/use-cases/update-process-metrics.js +0 -201
- package/integrations/use-cases/update-process-state.js +0 -121
- package/integrations/utils/map-integration-dto.js +0 -43
- package/jest-global-setup-noop.js +0 -3
- package/jest-global-teardown-noop.js +0 -3
- package/jest-setup.js +0 -2
- package/jest-teardown.js +0 -2
- package/jest.config.js +0 -21
- package/lambda/TimeoutCatcher.js +0 -45
- package/lambda/index.js +0 -3
- package/logs/index.js +0 -7
- package/modules/ModuleConstants.js +0 -10
- package/modules/domain/entities/AuthorizationSession.js +0 -131
- package/modules/domain/entities/index.js +0 -10
- package/modules/index.js +0 -15
- package/modules/module.js +0 -261
- package/modules/repositories/authorization-session-repository-factory.js +0 -53
- package/modules/repositories/authorization-session-repository-interface.js +0 -75
- package/modules/repositories/authorization-session-repository-mongo.js +0 -169
- package/modules/repositories/authorization-session-repository-postgres.js +0 -170
- package/modules/repositories/module-repository-documentdb.js +0 -383
- package/modules/repositories/module-repository-factory.js +0 -38
- package/modules/repositories/module-repository-interface.js +0 -142
- package/modules/repositories/module-repository-mongo.js +0 -443
- package/modules/repositories/module-repository-postgres.js +0 -490
- package/modules/repositories/module-repository.js +0 -373
- package/modules/requester/api-key.js +0 -50
- package/modules/requester/basic.js +0 -42
- package/modules/requester/oauth-2.js +0 -385
- package/modules/requester/requester.js +0 -167
- package/modules/test/mock-api/mocks/hubspot.js +0 -43
- package/modules/tests/doubles/test-module-factory.js +0 -22
- package/modules/use-cases/delete-module-entity.js +0 -23
- package/modules/use-cases/get-authorization-requirements.js +0 -110
- package/modules/use-cases/get-entities-for-user.js +0 -32
- package/modules/use-cases/get-entity-options-by-id.js +0 -73
- package/modules/use-cases/get-entity-options-by-type.js +0 -34
- package/modules/use-cases/get-module-entity-by-id.js +0 -16
- package/modules/use-cases/get-module-instance-from-type.js +0 -31
- package/modules/use-cases/get-module.js +0 -77
- package/modules/use-cases/process-authorization-step.js +0 -160
- package/modules/use-cases/refresh-entity-options.js +0 -74
- package/modules/use-cases/start-authorization-session.js +0 -86
- package/modules/use-cases/test-module-auth.js +0 -74
- package/modules/use-cases/update-module-entity.js +0 -27
- package/modules/utils/map-module-dto.js +0 -18
- package/openapi/openapi-spec-generator.js +0 -370
- package/openapi/openapi-v1.yaml +0 -1360
- package/openapi/openapi-v2.yaml +0 -1535
- package/prisma-postgresql/migrations/20260222000000_add_admin_process_and_script_schedule/migration.sql +0 -55
- package/providers/index.js +0 -13
- package/providers/resolve-provider.js +0 -93
- package/queues/index.js +0 -23
- package/queues/providers/index.js +0 -7
- package/queues/providers/netlify-background-provider.js +0 -76
- package/queues/providers/qstash-queue-provider.js +0 -122
- package/queues/queue-client-interface.js +0 -55
- package/queues/queue-provider-factory.js +0 -93
- package/queues/queue-provider.js +0 -46
- package/queues/queuer-util.js +0 -74
- package/syncs/repositories/sync-repository-factory.js +0 -43
- package/syncs/repositories/sync-repository-interface.js +0 -113
- package/syncs/repositories/sync-repository-mongo.js +0 -239
- package/syncs/repositories/sync-repository-postgres.js +0 -325
- package/syncs/sync.js +0 -117
- package/token/repositories/token-repository-documentdb.js +0 -137
- package/token/repositories/token-repository-factory.js +0 -38
- package/token/repositories/token-repository-interface.js +0 -131
- package/token/repositories/token-repository-mongo.js +0 -219
- package/token/repositories/token-repository-postgres.js +0 -264
- package/token/repositories/token-repository.js +0 -219
- package/types/assertions/index.d.ts +0 -83
- package/types/associations/index.d.ts +0 -57
- package/types/core/index.d.ts +0 -99
- package/types/database/index.d.ts +0 -11
- package/types/encrypt/index.d.ts +0 -7
- package/types/errors/index.d.ts +0 -73
- package/types/eslint-config/index.d.ts +0 -41
- package/types/index.d.ts +0 -14
- package/types/integrations/index.d.ts +0 -186
- package/types/lambda/index.d.ts +0 -31
- package/types/logs/index.d.ts +0 -5
- package/types/module-plugin/index.d.ts +0 -241
- package/types/prettier-config/index.d.ts +0 -6
- package/types/syncs/index.d.ts +0 -111
- package/types/test-environment/index.d.ts +0 -17
- package/types/tsconfig.json +0 -105
- package/user/repositories/user-repository-documentdb.js +0 -441
- package/user/repositories/user-repository-factory.js +0 -52
- package/user/repositories/user-repository-interface.js +0 -201
- package/user/repositories/user-repository-mongo.js +0 -308
- package/user/repositories/user-repository-postgres.js +0 -360
- package/user/use-cases/authenticate-user.js +0 -125
- package/user/use-cases/authenticate-with-shared-secret.js +0 -48
- package/user/use-cases/create-individual-user.js +0 -62
- package/user/use-cases/create-organization-user.js +0 -47
- package/user/use-cases/create-token-for-user-id.js +0 -30
- package/user/use-cases/delete-user.js +0 -47
- package/user/use-cases/get-user-from-adopter-jwt.js +0 -147
- package/user/use-cases/get-user-from-x-frigg-headers.js +0 -135
- package/user/use-cases/login-user.js +0 -122
- package/user/user.js +0 -139
- package/utils/index.js +0 -9
- package/websocket/repositories/websocket-connection-repository-documentdb.js +0 -144
- package/websocket/repositories/websocket-connection-repository-factory.js +0 -40
- package/websocket/repositories/websocket-connection-repository-interface.js +0 -106
- package/websocket/repositories/websocket-connection-repository-mongo.js +0 -166
- package/websocket/repositories/websocket-connection-repository-postgres.js +0 -207
- package/websocket/repositories/websocket-connection-repository.js +0 -167
- package/websocket/websocket-message-sender-interface.js +0 -38
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
The current BaseCRMIntegration implementation has a **race condition** in process record updates:
|
|
6
6
|
|
|
7
7
|
1. Multiple queue workers process batches concurrently
|
|
8
|
-
2. Each worker calls `processManager.updateMetrics()`
|
|
8
|
+
2. Each worker calls `processManager.updateMetrics()`
|
|
9
9
|
3. Multiple workers read-modify-write the same process record simultaneously
|
|
10
10
|
4. **Result**: Lost updates, inconsistent metrics, potential data corruption
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ The current BaseCRMIntegration implementation has a **race condition** in proces
|
|
|
13
13
|
|
|
14
14
|
```
|
|
15
15
|
Time 1: Worker A reads process.results.aggregateData.totalSynced = 100
|
|
16
|
-
Time 2: Worker B reads process.results.aggregateData.totalSynced = 100
|
|
16
|
+
Time 2: Worker B reads process.results.aggregateData.totalSynced = 100
|
|
17
17
|
Time 3: Worker A adds 50 → writes totalSynced = 150
|
|
18
18
|
Time 4: Worker B adds 30 → writes totalSynced = 130 (overwrites Worker A's update!)
|
|
19
19
|
```
|
|
@@ -24,10 +24,10 @@ Time 4: Worker B adds 30 → writes totalSynced = 130 (overwrites Worker A's upd
|
|
|
24
24
|
|
|
25
25
|
Create a dedicated FIFO SQS queue in **Frigg Core** for all process management operations:
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
27
|
+
- **Queue Type**: FIFO (First-In-First-Out)
|
|
28
|
+
- **Message Group ID**: `process-{processId}` (ensures ordered processing per process)
|
|
29
|
+
- **Message Deduplication**: Enabled (prevents duplicate updates)
|
|
30
|
+
- **Dead Letter Queue**: Enabled (captures failed updates)
|
|
31
31
|
|
|
32
32
|
### Architecture
|
|
33
33
|
|
|
@@ -80,7 +80,7 @@ class ProcessManagementQueueFactory {
|
|
|
80
80
|
*/
|
|
81
81
|
async createProcessManagementQueue(integrationName) {
|
|
82
82
|
const queueName = `${integrationName}-process-management.fifo`;
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
const params = {
|
|
85
85
|
QueueName: queueName,
|
|
86
86
|
Attributes: {
|
|
@@ -92,7 +92,7 @@ class ProcessManagementQueueFactory {
|
|
|
92
92
|
ReceiveMessageWaitTimeSeconds: '20', // Long polling
|
|
93
93
|
DeadLetterTargetArn: `${queueName}-dlq.fifo`, // DLQ
|
|
94
94
|
MaxReceiveCount: '3', // Retry failed messages 3 times
|
|
95
|
-
}
|
|
95
|
+
}
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
const result = await this.sqs.createQueue(params).promise();
|
|
@@ -114,7 +114,7 @@ class ProcessManagementQueueFactory {
|
|
|
114
114
|
processId,
|
|
115
115
|
operation,
|
|
116
116
|
data,
|
|
117
|
-
timestamp: new Date().toISOString()
|
|
117
|
+
timestamp: new Date().toISOString()
|
|
118
118
|
}),
|
|
119
119
|
MessageGroupId: `process-${processId}`,
|
|
120
120
|
MessageDeduplicationId: `${processId}-${operation}-${Date.now()}`,
|
|
@@ -137,9 +137,7 @@ const {
|
|
|
137
137
|
UpdateProcessMetrics,
|
|
138
138
|
GetProcess,
|
|
139
139
|
} = require('../use-cases');
|
|
140
|
-
const {
|
|
141
|
-
createProcessRepository,
|
|
142
|
-
} = require('../repositories/process-repository-factory');
|
|
140
|
+
const { createProcessRepository } = require('../repositories/process-repository-factory');
|
|
143
141
|
|
|
144
142
|
/**
|
|
145
143
|
* Handler for process management FIFO queue messages
|
|
@@ -148,12 +146,8 @@ const {
|
|
|
148
146
|
class ProcessUpdateHandler {
|
|
149
147
|
constructor() {
|
|
150
148
|
const processRepository = createProcessRepository();
|
|
151
|
-
this.updateProcessStateUseCase = new UpdateProcessState({
|
|
152
|
-
|
|
153
|
-
});
|
|
154
|
-
this.updateProcessMetricsUseCase = new UpdateProcessMetrics({
|
|
155
|
-
processRepository,
|
|
156
|
-
});
|
|
149
|
+
this.updateProcessStateUseCase = new UpdateProcessState({ processRepository });
|
|
150
|
+
this.updateProcessMetricsUseCase = new UpdateProcessMetrics({ processRepository });
|
|
157
151
|
this.getProcessUseCase = new GetProcess({ processRepository });
|
|
158
152
|
}
|
|
159
153
|
|
|
@@ -170,35 +164,35 @@ class ProcessUpdateHandler {
|
|
|
170
164
|
switch (operation) {
|
|
171
165
|
case 'UPDATE_STATE':
|
|
172
166
|
await this.updateProcessStateUseCase.execute(
|
|
173
|
-
processId,
|
|
174
|
-
data.state,
|
|
167
|
+
processId,
|
|
168
|
+
data.state,
|
|
175
169
|
data.contextUpdates
|
|
176
170
|
);
|
|
177
171
|
break;
|
|
178
172
|
|
|
179
173
|
case 'UPDATE_METRICS':
|
|
180
174
|
await this.updateProcessMetricsUseCase.execute(
|
|
181
|
-
processId,
|
|
175
|
+
processId,
|
|
182
176
|
data.metricsUpdate
|
|
183
177
|
);
|
|
184
178
|
break;
|
|
185
179
|
|
|
186
180
|
case 'COMPLETE_PROCESS':
|
|
187
181
|
await this.updateProcessStateUseCase.execute(
|
|
188
|
-
processId,
|
|
189
|
-
'COMPLETED',
|
|
182
|
+
processId,
|
|
183
|
+
'COMPLETED',
|
|
190
184
|
{ endTime: new Date().toISOString() }
|
|
191
185
|
);
|
|
192
186
|
break;
|
|
193
187
|
|
|
194
188
|
case 'HANDLE_ERROR':
|
|
195
189
|
await this.updateProcessStateUseCase.execute(
|
|
196
|
-
processId,
|
|
197
|
-
'ERROR',
|
|
190
|
+
processId,
|
|
191
|
+
'ERROR',
|
|
198
192
|
{
|
|
199
193
|
error: data.error.message,
|
|
200
194
|
errorStack: data.error.stack,
|
|
201
|
-
errorTimestamp: new Date().toISOString()
|
|
195
|
+
errorTimestamp: new Date().toISOString()
|
|
202
196
|
}
|
|
203
197
|
);
|
|
204
198
|
break;
|
|
@@ -207,9 +201,7 @@ class ProcessUpdateHandler {
|
|
|
207
201
|
throw new Error(`Unknown process operation: ${operation}`);
|
|
208
202
|
}
|
|
209
203
|
|
|
210
|
-
console.log(
|
|
211
|
-
`Process update completed: ${operation} for process ${processId}`
|
|
212
|
-
);
|
|
204
|
+
console.log(`Process update completed: ${operation} for process ${processId}`);
|
|
213
205
|
} catch (error) {
|
|
214
206
|
console.error('Process update failed:', error);
|
|
215
207
|
throw error; // Will trigger SQS retry/DLQ
|
|
@@ -225,9 +217,7 @@ module.exports = { ProcessUpdateHandler };
|
|
|
225
217
|
**File**: `/packages/core/integrations/queues/process-queue-manager.js`
|
|
226
218
|
|
|
227
219
|
```javascript
|
|
228
|
-
const {
|
|
229
|
-
ProcessManagementQueueFactory,
|
|
230
|
-
} = require('./process-management-queue-factory');
|
|
220
|
+
const { ProcessManagementQueueFactory } = require('./process-management-queue-factory');
|
|
231
221
|
|
|
232
222
|
/**
|
|
233
223
|
* Manages process update operations via FIFO queue
|
|
@@ -246,9 +236,7 @@ class ProcessQueueManager {
|
|
|
246
236
|
*/
|
|
247
237
|
async getProcessQueueUrl(integrationName) {
|
|
248
238
|
if (!this.queueUrls.has(integrationName)) {
|
|
249
|
-
const queueUrl = await this.factory.createProcessManagementQueue(
|
|
250
|
-
integrationName
|
|
251
|
-
);
|
|
239
|
+
const queueUrl = await this.factory.createProcessManagementQueue(integrationName);
|
|
252
240
|
this.queueUrls.set(integrationName, queueUrl);
|
|
253
241
|
}
|
|
254
242
|
return this.queueUrls.get(integrationName);
|
|
@@ -262,22 +250,12 @@ class ProcessQueueManager {
|
|
|
262
250
|
* @param {Object} contextUpdates - Context updates
|
|
263
251
|
* @returns {Promise<void>}
|
|
264
252
|
*/
|
|
265
|
-
async queueStateUpdate(
|
|
266
|
-
integrationName,
|
|
267
|
-
processId,
|
|
268
|
-
state,
|
|
269
|
-
contextUpdates = {}
|
|
270
|
-
) {
|
|
253
|
+
async queueStateUpdate(integrationName, processId, state, contextUpdates = {}) {
|
|
271
254
|
const queueUrl = await this.getProcessQueueUrl(integrationName);
|
|
272
|
-
await this.factory.sendProcessUpdate(
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
{
|
|
277
|
-
state,
|
|
278
|
-
contextUpdates,
|
|
279
|
-
}
|
|
280
|
-
);
|
|
255
|
+
await this.factory.sendProcessUpdate(queueUrl, processId, 'UPDATE_STATE', {
|
|
256
|
+
state,
|
|
257
|
+
contextUpdates
|
|
258
|
+
});
|
|
281
259
|
}
|
|
282
260
|
|
|
283
261
|
/**
|
|
@@ -289,14 +267,9 @@ class ProcessQueueManager {
|
|
|
289
267
|
*/
|
|
290
268
|
async queueMetricsUpdate(integrationName, processId, metricsUpdate) {
|
|
291
269
|
const queueUrl = await this.getProcessQueueUrl(integrationName);
|
|
292
|
-
await this.factory.sendProcessUpdate(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
'UPDATE_METRICS',
|
|
296
|
-
{
|
|
297
|
-
metricsUpdate,
|
|
298
|
-
}
|
|
299
|
-
);
|
|
270
|
+
await this.factory.sendProcessUpdate(queueUrl, processId, 'UPDATE_METRICS', {
|
|
271
|
+
metricsUpdate
|
|
272
|
+
});
|
|
300
273
|
}
|
|
301
274
|
|
|
302
275
|
/**
|
|
@@ -307,12 +280,7 @@ class ProcessQueueManager {
|
|
|
307
280
|
*/
|
|
308
281
|
async queueProcessCompletion(integrationName, processId) {
|
|
309
282
|
const queueUrl = await this.getProcessQueueUrl(integrationName);
|
|
310
|
-
await this.factory.sendProcessUpdate(
|
|
311
|
-
queueUrl,
|
|
312
|
-
processId,
|
|
313
|
-
'COMPLETE_PROCESS',
|
|
314
|
-
{}
|
|
315
|
-
);
|
|
283
|
+
await this.factory.sendProcessUpdate(queueUrl, processId, 'COMPLETE_PROCESS', {});
|
|
316
284
|
}
|
|
317
285
|
|
|
318
286
|
/**
|
|
@@ -324,17 +292,12 @@ class ProcessQueueManager {
|
|
|
324
292
|
*/
|
|
325
293
|
async queueErrorHandling(integrationName, processId, error) {
|
|
326
294
|
const queueUrl = await this.getProcessQueueUrl(integrationName);
|
|
327
|
-
await this.factory.sendProcessUpdate(
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
{
|
|
332
|
-
error: {
|
|
333
|
-
message: error.message,
|
|
334
|
-
stack: error.stack,
|
|
335
|
-
},
|
|
295
|
+
await this.factory.sendProcessUpdate(queueUrl, processId, 'HANDLE_ERROR', {
|
|
296
|
+
error: {
|
|
297
|
+
message: error.message,
|
|
298
|
+
stack: error.stack
|
|
336
299
|
}
|
|
337
|
-
);
|
|
300
|
+
});
|
|
338
301
|
}
|
|
339
302
|
}
|
|
340
303
|
|
|
@@ -348,9 +311,7 @@ module.exports = { ProcessQueueManager };
|
|
|
348
311
|
**File**: `/Users/sean/Documents/GitHub/quo--frigg/backend/src/base/services/ProcessManager.js`
|
|
349
312
|
|
|
350
313
|
```javascript
|
|
351
|
-
const {
|
|
352
|
-
ProcessQueueManager,
|
|
353
|
-
} = require('@friggframework/core/integrations/queues/process-queue-manager');
|
|
314
|
+
const { ProcessQueueManager } = require('@friggframework/core/integrations/queues/process-queue-manager');
|
|
354
315
|
|
|
355
316
|
class ProcessManager {
|
|
356
317
|
constructor({
|
|
@@ -433,11 +394,11 @@ class ProcessManager {
|
|
|
433
394
|
const attachProcessManagementQueues = (definition, AppDefinition) => {
|
|
434
395
|
for (const integration of AppDefinition.integrations) {
|
|
435
396
|
const integrationName = integration.Definition.name;
|
|
436
|
-
|
|
397
|
+
|
|
437
398
|
// Create FIFO queue for process management
|
|
438
399
|
const processQueueName = `${integrationName}ProcessManagementQueue`;
|
|
439
400
|
const processDLQName = `${integrationName}ProcessManagementDLQ`;
|
|
440
|
-
|
|
401
|
+
|
|
441
402
|
// FIFO Queue
|
|
442
403
|
definition.resources.Resources[processQueueName] = {
|
|
443
404
|
Type: 'AWS::SQS::Queue',
|
|
@@ -450,9 +411,7 @@ const attachProcessManagementQueues = (definition, AppDefinition) => {
|
|
|
450
411
|
DelaySeconds: 0,
|
|
451
412
|
ReceiveMessageWaitTimeSeconds: 20, // Long polling
|
|
452
413
|
RedrivePolicy: {
|
|
453
|
-
deadLetterTargetArn: {
|
|
454
|
-
'Fn::GetAtt': [processDLQName, 'Arn'],
|
|
455
|
-
},
|
|
414
|
+
deadLetterTargetArn: { 'Fn::GetAtt': [processDLQName, 'Arn'] },
|
|
456
415
|
maxReceiveCount: 3,
|
|
457
416
|
},
|
|
458
417
|
},
|
|
@@ -471,18 +430,15 @@ const attachProcessManagementQueues = (definition, AppDefinition) => {
|
|
|
471
430
|
// Process Update Handler Function
|
|
472
431
|
const processHandlerName = `${integrationName}ProcessUpdateHandler`;
|
|
473
432
|
definition.functions[processHandlerName] = {
|
|
474
|
-
handler:
|
|
475
|
-
'node_modules/@friggframework/core/handlers/process-update-handler.handler',
|
|
433
|
+
handler: 'node_modules/@friggframework/core/handlers/process-update-handler.handler',
|
|
476
434
|
reservedConcurrency: 1, // Process updates sequentially per integration
|
|
477
|
-
events: [
|
|
478
|
-
{
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
maximumBatchingWindowInSeconds: 5,
|
|
483
|
-
},
|
|
435
|
+
events: [{
|
|
436
|
+
sqs: {
|
|
437
|
+
arn: { 'Fn::GetAtt': [processQueueName, 'Arn'] },
|
|
438
|
+
batchSize: 1, // Process one update at a time
|
|
439
|
+
maximumBatchingWindowInSeconds: 5,
|
|
484
440
|
},
|
|
485
|
-
],
|
|
441
|
+
}],
|
|
486
442
|
timeout: 30,
|
|
487
443
|
environment: {
|
|
488
444
|
INTEGRATION_NAME: integrationName,
|
|
@@ -495,75 +451,64 @@ const attachProcessManagementQueues = (definition, AppDefinition) => {
|
|
|
495
451
|
## Benefits
|
|
496
452
|
|
|
497
453
|
### ✅ Race Condition Prevention
|
|
498
|
-
|
|
499
|
-
-
|
|
500
|
-
-
|
|
501
|
-
- No more lost updates or inconsistent metrics
|
|
454
|
+
- FIFO queue ensures ordered processing per process ID
|
|
455
|
+
- MessageGroupId = `process-{processId}` guarantees sequential updates
|
|
456
|
+
- No more lost updates or inconsistent metrics
|
|
502
457
|
|
|
503
458
|
### ✅ Cost Optimization
|
|
504
|
-
|
|
505
|
-
-
|
|
506
|
-
-
|
|
507
|
-
- Long polling reduces API calls
|
|
459
|
+
- Only one FIFO queue per integration (not per process)
|
|
460
|
+
- MessageGroupId provides ordering without expensive per-process queues
|
|
461
|
+
- Long polling reduces API calls
|
|
508
462
|
|
|
509
463
|
### ✅ Reliability
|
|
510
|
-
|
|
511
|
-
-
|
|
512
|
-
-
|
|
513
|
-
- Content-based deduplication prevents duplicate processing
|
|
464
|
+
- Dead Letter Queue captures failed updates
|
|
465
|
+
- Retry mechanism with exponential backoff
|
|
466
|
+
- Content-based deduplication prevents duplicate processing
|
|
514
467
|
|
|
515
468
|
### ✅ Scalability
|
|
516
|
-
|
|
517
|
-
-
|
|
518
|
-
-
|
|
519
|
-
- Can scale process update handlers independently
|
|
469
|
+
- Each integration has its own process management queue
|
|
470
|
+
- Process updates don't block data processing
|
|
471
|
+
- Can scale process update handlers independently
|
|
520
472
|
|
|
521
473
|
## Migration Strategy
|
|
522
474
|
|
|
523
475
|
### Phase 1: Current Implementation (Native Queue)
|
|
524
|
-
|
|
525
|
-
-
|
|
526
|
-
-
|
|
527
|
-
- Focus on core functionality
|
|
476
|
+
- Use existing integration queue for process updates
|
|
477
|
+
- Accept potential race conditions for now
|
|
478
|
+
- Focus on core functionality
|
|
528
479
|
|
|
529
480
|
### Phase 2: FIFO Queue Implementation
|
|
530
|
-
|
|
531
|
-
-
|
|
532
|
-
-
|
|
533
|
-
- Deploy with feature flag
|
|
481
|
+
- Implement FIFO queue infrastructure in Frigg Core
|
|
482
|
+
- Update ProcessManager to use FIFO queue
|
|
483
|
+
- Deploy with feature flag
|
|
534
484
|
|
|
535
485
|
### Phase 3: Full Migration
|
|
536
|
-
|
|
537
|
-
-
|
|
538
|
-
-
|
|
539
|
-
- Monitor for race condition elimination
|
|
486
|
+
- Switch all integrations to FIFO queue
|
|
487
|
+
- Remove native queue process update code
|
|
488
|
+
- Monitor for race condition elimination
|
|
540
489
|
|
|
541
490
|
## Cost Analysis
|
|
542
491
|
|
|
543
492
|
### FIFO Queue Costs (per integration)
|
|
544
|
-
|
|
545
|
-
-
|
|
546
|
-
-
|
|
547
|
-
-
|
|
548
|
-
- **Example**: 10 integrations, 1000 process updates/day = ~$2.40/month
|
|
493
|
+
- **Queue Creation**: Free
|
|
494
|
+
- **Message Storage**: $0.40 per million messages
|
|
495
|
+
- **Message Processing**: $0.40 per million requests
|
|
496
|
+
- **Example**: 10 integrations, 1000 process updates/day = ~$2.40/month
|
|
549
497
|
|
|
550
498
|
### Benefits vs Costs
|
|
551
|
-
|
|
552
|
-
-
|
|
553
|
-
-
|
|
554
|
-
- **ROI**: High - prevents data corruption and debugging time
|
|
499
|
+
- **Cost**: ~$2.40/month for 10 integrations
|
|
500
|
+
- **Benefit**: Eliminates race conditions, ensures data consistency
|
|
501
|
+
- **ROI**: High - prevents data corruption and debugging time
|
|
555
502
|
|
|
556
503
|
## Implementation Priority
|
|
557
504
|
|
|
558
505
|
**High Priority** - Race conditions in process updates can cause:
|
|
559
|
-
|
|
560
|
-
-
|
|
561
|
-
-
|
|
562
|
-
-
|
|
563
|
-
- Data integrity issues
|
|
506
|
+
- Lost sync progress
|
|
507
|
+
- Inconsistent metrics
|
|
508
|
+
- Difficult debugging
|
|
509
|
+
- Data integrity issues
|
|
564
510
|
|
|
565
511
|
**Recommended Timeline**:
|
|
566
|
-
|
|
567
512
|
1. **Week 1**: Implement FIFO queue infrastructure in Frigg Core
|
|
568
513
|
2. **Week 2**: Update ProcessManager to use FIFO queue
|
|
569
514
|
3. **Week 3**: Deploy and test with one integration
|