@friggframework/core 2.0.0-next.12 → 2.0.0-next.120
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/.eslintrc.json +18 -1
- package/CLAUDE.md +830 -0
- package/README.md +996 -50
- package/admin-scripts/index.js +52 -0
- package/admin-scripts/repositories/admin-script-execution-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-script-execution-repository-factory.js +51 -0
- package/admin-scripts/repositories/admin-script-execution-repository-interface.js +171 -0
- package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +238 -0
- package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +278 -0
- package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-schedule-repository-factory.js +51 -0
- package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
- package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
- package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
- package/application/commands/README.md +451 -0
- package/application/commands/admin-script-commands.js +359 -0
- package/application/commands/credential-commands.js +262 -0
- package/application/commands/entity-commands.js +294 -0
- package/application/commands/integration-commands.js +419 -0
- package/application/commands/integration-mapping-commands.js +25 -0
- package/application/commands/process-commands.js +135 -0
- package/application/commands/report-commands.js +188 -0
- package/application/commands/scheduler-commands.js +263 -0
- package/application/commands/usage-commands.js +56 -0
- package/application/commands/user-commands.js +312 -0
- package/application/index.js +83 -0
- package/artifacts/repositories/artifact-repository-factory.js +19 -0
- package/artifacts/repositories/artifact-repository-interface.js +27 -0
- package/artifacts/repositories/artifact-repository-local.js +42 -0
- package/artifacts/repositories/artifact-repository-s3.js +61 -0
- package/assertions/index.js +0 -3
- package/core/CLAUDE.md +715 -0
- package/core/Worker.js +55 -24
- package/core/create-handler.js +121 -38
- package/core/index.js +8 -1
- package/core/invocation-scope.js +225 -0
- package/core/parameters-to-env.js +257 -0
- package/core/secrets-to-env.js +7 -6
- package/core/ssm-preload.mjs +34 -0
- package/credential/repositories/credential-active-type.js +32 -0
- package/credential/repositories/credential-repository-documentdb.js +355 -0
- package/credential/repositories/credential-repository-factory.js +54 -0
- package/credential/repositories/credential-repository-interface.js +113 -0
- package/credential/repositories/credential-repository-mongo.js +294 -0
- package/credential/repositories/credential-repository-postgres.js +312 -0
- package/credential/repositories/credential-repository.js +300 -0
- package/credential/use-cases/get-credential-for-user.js +25 -0
- package/credential/use-cases/update-authentication-status.js +15 -0
- package/database/MONGODB_TRANSACTION_FIX.md +198 -0
- package/database/adapters/lambda-invoker.js +97 -0
- package/database/config.js +147 -0
- package/database/documentdb-encryption-service.js +334 -0
- package/database/documentdb-utils.js +196 -0
- package/database/encryption/README.md +863 -0
- package/database/encryption/documentdb-encryption-service.md +3575 -0
- package/database/encryption/encryption-schema-registry.js +404 -0
- package/database/encryption/field-encryption-service.js +254 -0
- package/database/encryption/integration-mapping-encryption.js +97 -0
- package/database/encryption/logger.js +82 -0
- package/database/encryption/prisma-encryption-extension.js +241 -0
- package/database/index.js +21 -21
- package/database/prisma.js +182 -0
- package/database/repositories/health-check-repository-documentdb.js +138 -0
- package/database/repositories/health-check-repository-factory.js +48 -0
- package/database/repositories/health-check-repository-interface.js +82 -0
- package/database/repositories/health-check-repository-mongodb.js +89 -0
- package/database/repositories/health-check-repository-postgres.js +82 -0
- package/database/repositories/migration-status-repository-s3.js +137 -0
- package/database/use-cases/check-database-health-use-case.js +29 -0
- package/database/use-cases/check-database-state-use-case.js +81 -0
- package/database/use-cases/check-encryption-health-use-case.js +83 -0
- package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
- package/database/use-cases/get-migration-status-use-case.js +93 -0
- package/database/use-cases/resolve-migration-via-worker-use-case.js +49 -0
- package/database/use-cases/run-database-migration-use-case.js +139 -0
- package/database/use-cases/test-encryption-use-case.js +253 -0
- package/database/use-cases/trigger-database-migration-use-case.js +157 -0
- package/database/utils/mongodb-collection-utils.js +94 -0
- package/database/utils/mongodb-schema-init.js +108 -0
- package/database/utils/prisma-runner.js +491 -0
- package/database/utils/prisma-schema-parser.js +182 -0
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
- package/encrypt/Cryptor.js +34 -168
- package/encrypt/index.js +1 -2
- package/errors/client-safe-error.js +26 -0
- package/errors/fetch-error.js +59 -57
- package/errors/index.js +6 -0
- package/errors/mapping-already-exists-error.js +14 -0
- package/generated/prisma-mongodb/client.d.ts +1 -0
- package/generated/prisma-mongodb/client.js +5 -0
- package/generated/prisma-mongodb/default.d.ts +1 -0
- package/generated/prisma-mongodb/default.js +5 -0
- package/generated/prisma-mongodb/edge.d.ts +1 -0
- package/generated/prisma-mongodb/edge.js +386 -0
- package/generated/prisma-mongodb/index-browser.js +368 -0
- package/generated/prisma-mongodb/index.d.ts +27065 -0
- package/generated/prisma-mongodb/index.js +411 -0
- package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-mongodb/package.json +183 -0
- package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
- package/generated/prisma-mongodb/runtime/edge.js +35 -0
- package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
- package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
- package/generated/prisma-mongodb/runtime/library.js +147 -0
- package/generated/prisma-mongodb/runtime/react-native.js +84 -0
- package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
- package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
- package/generated/prisma-mongodb/schema.prisma +455 -0
- package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
- package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
- package/generated/prisma-mongodb/wasm.d.ts +1 -0
- package/generated/prisma-mongodb/wasm.js +393 -0
- package/generated/prisma-postgresql/client.d.ts +1 -0
- package/generated/prisma-postgresql/client.js +5 -0
- package/generated/prisma-postgresql/default.d.ts +1 -0
- package/generated/prisma-postgresql/default.js +5 -0
- package/generated/prisma-postgresql/edge.d.ts +1 -0
- package/generated/prisma-postgresql/edge.js +407 -0
- package/generated/prisma-postgresql/index-browser.js +389 -0
- package/generated/prisma-postgresql/index.d.ts +29904 -0
- package/generated/prisma-postgresql/index.js +432 -0
- package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-postgresql/package.json +183 -0
- package/generated/prisma-postgresql/query_engine_bg.js +2 -0
- package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
- package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
- package/generated/prisma-postgresql/runtime/edge.js +35 -0
- package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
- package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
- package/generated/prisma-postgresql/runtime/library.js +147 -0
- package/generated/prisma-postgresql/runtime/react-native.js +84 -0
- package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
- package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
- package/generated/prisma-postgresql/schema.prisma +436 -0
- package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
- package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
- package/generated/prisma-postgresql/wasm.d.ts +1 -0
- package/generated/prisma-postgresql/wasm.js +414 -0
- package/handlers/WEBHOOKS.md +682 -0
- package/handlers/app-definition-loader.js +103 -0
- package/handlers/app-handler-helpers.js +20 -6
- package/handlers/backend-utils.js +272 -46
- package/handlers/database-migration-handler.js +236 -0
- package/handlers/integration-event-dispatcher.js +68 -0
- package/handlers/middleware/admin-auth.js +73 -0
- package/handlers/routers/HEALTHCHECK.md +342 -0
- package/handlers/routers/auth.js +4 -15
- package/handlers/routers/db-migration.handler.js +29 -0
- package/handlers/routers/db-migration.js +329 -0
- package/handlers/routers/health.js +518 -0
- package/handlers/routers/integration-defined-routers.js +85 -10
- package/handlers/routers/integration-webhook-routers.js +87 -0
- package/handlers/routers/user.js +27 -5
- package/handlers/routers/websocket.js +31 -9
- package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
- package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
- package/handlers/workers/db-migration.js +438 -0
- package/handlers/workers/dlq-processor.js +89 -0
- package/handlers/workers/integration-defined-workers.js +13 -7
- package/index.js +123 -47
- package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +184 -0
- package/infrastructure/scheduler/index.js +33 -0
- package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
- package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
- package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
- package/integrations/EXTENSIONS.md +240 -0
- package/integrations/WEBHOOK-QUICKSTART.md +151 -0
- package/integrations/extension.js +254 -0
- package/integrations/index.js +20 -10
- package/integrations/integration-base.js +777 -74
- package/integrations/integration-router.js +399 -180
- package/integrations/options.js +1 -1
- package/integrations/repositories/config-patch-shared.js +43 -0
- package/integrations/repositories/integration-mapping-query-pipeline.js +152 -0
- package/integrations/repositories/integration-mapping-query.js +193 -0
- package/integrations/repositories/integration-mapping-repository-documentdb.js +406 -0
- package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
- package/integrations/repositories/integration-mapping-repository-interface.js +183 -0
- package/integrations/repositories/integration-mapping-repository-mongo.js +284 -0
- package/integrations/repositories/integration-mapping-repository-postgres.js +403 -0
- package/integrations/repositories/integration-mapping-repository.js +185 -0
- package/integrations/repositories/integration-repository-documentdb.js +354 -0
- package/integrations/repositories/integration-repository-factory.js +51 -0
- package/integrations/repositories/integration-repository-interface.js +219 -0
- package/integrations/repositories/integration-repository-mongo.js +502 -0
- package/integrations/repositories/integration-repository-postgres.js +550 -0
- package/integrations/repositories/process-repository-documentdb.js +311 -0
- package/integrations/repositories/process-repository-factory.js +53 -0
- package/integrations/repositories/process-repository-interface.js +136 -0
- package/integrations/repositories/process-repository-mongo.js +262 -0
- package/integrations/repositories/process-repository-postgres.js +380 -0
- package/integrations/repositories/process-update-ops-shared.js +112 -0
- package/integrations/repositories/report-id.js +13 -0
- package/integrations/tests/doubles/config-capturing-integration.js +81 -0
- package/integrations/tests/doubles/dummy-integration-class.js +113 -0
- package/integrations/tests/doubles/test-integration-repository.js +146 -0
- package/integrations/use-cases/add-entities-to-integration.js +92 -0
- package/integrations/use-cases/create-integration.js +253 -0
- package/integrations/use-cases/create-process.js +130 -0
- package/integrations/use-cases/delete-integration-for-user.js +130 -0
- package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
- package/integrations/use-cases/get-integration-for-user.js +78 -0
- package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
- package/integrations/use-cases/get-integration-instance.js +83 -0
- package/integrations/use-cases/get-integrations-for-user.js +88 -0
- package/integrations/use-cases/get-possible-integrations.js +27 -0
- package/integrations/use-cases/get-process.js +89 -0
- package/integrations/use-cases/index.js +19 -0
- package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
- package/integrations/use-cases/load-integration-context.js +71 -0
- package/integrations/use-cases/patch-integration-config.js +39 -0
- package/integrations/use-cases/process-errors.js +28 -0
- package/integrations/use-cases/remove-entities-from-integration.js +70 -0
- package/integrations/use-cases/update-integration-config.js +32 -0
- package/integrations/use-cases/update-integration-messages.js +44 -0
- package/integrations/use-cases/update-integration-status.js +32 -0
- package/integrations/use-cases/update-integration.js +92 -0
- package/integrations/use-cases/update-process-metrics.js +222 -0
- package/integrations/use-cases/update-process-state.js +163 -0
- package/integrations/utils/assert-entity-ids-input.js +42 -0
- package/integrations/utils/map-integration-dto.js +37 -0
- package/jest-global-setup-noop.js +3 -0
- package/jest-global-teardown-noop.js +3 -0
- package/jest.config.js +2 -0
- package/logs/.eslintrc.json +26 -1
- package/logs/__fixtures__/events.js +82 -0
- package/logs/__fixtures__/matchers.js +45 -0
- package/logs/__fixtures__/secrets.js +59 -0
- package/logs/__fixtures__/vectors.js +329 -0
- package/logs/__fixtures__/with-env.js +45 -0
- package/logs/context.js +109 -0
- package/logs/contract-keys.js +67 -0
- package/logs/debug-shims.js +46 -0
- package/logs/denied-keys.js +21 -0
- package/logs/index.js +14 -3
- package/logs/jest-logger-setup.js +25 -0
- package/logs/levels.js +71 -0
- package/logs/logger-runtime.js +137 -0
- package/logs/logger.js +134 -46
- package/logs/record.js +276 -0
- package/logs/redact.js +328 -0
- package/logs/serialize.js +329 -0
- package/logs/sinks.js +93 -0
- package/logs/summarize-event.js +163 -0
- package/{module-plugin → modules}/index.js +0 -10
- package/modules/module-factory.js +56 -0
- package/modules/module.js +320 -0
- package/modules/repositories/module-repository-documentdb.js +350 -0
- package/modules/repositories/module-repository-factory.js +40 -0
- package/modules/repositories/module-repository-interface.js +145 -0
- package/modules/repositories/module-repository-mongo.js +436 -0
- package/modules/repositories/module-repository-postgres.js +481 -0
- package/modules/repositories/module-repository.js +369 -0
- package/modules/requester/api-key.js +52 -0
- package/modules/requester/oauth-2.js +561 -0
- package/modules/requester/requester.js +605 -0
- package/{module-plugin → modules}/test/mock-api/api.js +8 -3
- package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
- package/modules/tests/doubles/test-module-factory.js +16 -0
- package/modules/tests/doubles/test-module-repository.js +39 -0
- package/modules/use-cases/get-entities-for-user.js +32 -0
- package/modules/use-cases/get-entity-options-by-id.js +71 -0
- package/modules/use-cases/get-entity-options-by-type.js +34 -0
- package/modules/use-cases/get-module-instance-from-type.js +34 -0
- package/modules/use-cases/get-module.js +74 -0
- package/modules/use-cases/process-authorization-callback.js +294 -0
- package/modules/use-cases/refresh-entity-options.js +72 -0
- package/modules/use-cases/test-module-auth.js +72 -0
- package/modules/utils/map-module-dto.js +20 -0
- package/modules/utils/to-credential-id.js +14 -0
- package/package.json +91 -52
- package/prisma-mongodb/schema.prisma +455 -0
- package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
- package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
- package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
- package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
- package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
- package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
- package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
- package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
- package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
- package/prisma-postgresql/migrations/20260705000000_create_usage_counter/migration.sql +26 -0
- package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
- package/prisma-postgresql/migrations/migration_lock.toml +3 -0
- package/prisma-postgresql/schema.prisma +436 -0
- package/queues/queue-delivery.js +41 -0
- package/queues/queuer-util.js +89 -21
- package/reporting/README.md +154 -0
- package/reporting/builtin-reports.js +6 -0
- package/reporting/index.js +13 -0
- package/reporting/report-base.js +49 -0
- package/reporting/reports/integrations-report.js +221 -0
- package/syncs/manager.js +468 -443
- package/syncs/repositories/sync-repository-documentdb.js +240 -0
- package/syncs/repositories/sync-repository-factory.js +43 -0
- package/syncs/repositories/sync-repository-interface.js +109 -0
- package/syncs/repositories/sync-repository-mongo.js +239 -0
- package/syncs/repositories/sync-repository-postgres.js +319 -0
- package/syncs/sync.js +0 -1
- package/telemetry/README.md +331 -0
- package/telemetry/bind-telemetry-context.js +77 -0
- package/telemetry/canonical-counters.js +52 -0
- package/telemetry/exporters.js +85 -0
- package/telemetry/index.js +26 -0
- package/telemetry/instrument-handler.js +104 -0
- package/telemetry/no-op-telemetry.js +71 -0
- package/telemetry/north-star.js +103 -0
- package/telemetry/otel-telemetry.js +232 -0
- package/telemetry/plugin-subscribers.js +77 -0
- package/telemetry/telemetry-config.js +120 -0
- package/telemetry/telemetry-context.js +51 -0
- package/telemetry/telemetry-event-bus.js +58 -0
- package/telemetry/telemetry-runtime.js +164 -0
- package/telemetry/telemetry-service.js +52 -0
- package/telemetry/usage-rollup-subscriber.js +116 -0
- package/token/repositories/token-repository-documentdb.js +137 -0
- package/token/repositories/token-repository-factory.js +40 -0
- package/token/repositories/token-repository-interface.js +131 -0
- package/token/repositories/token-repository-mongo.js +219 -0
- package/token/repositories/token-repository-postgres.js +264 -0
- package/token/repositories/token-repository.js +219 -0
- package/types/associations/index.d.ts +0 -17
- package/types/core/index.d.ts +12 -4
- package/types/database/index.d.ts +10 -2
- package/types/encrypt/index.d.ts +5 -3
- package/types/errors/index.d.ts +24 -10
- package/types/integrations/index.d.ts +3 -8
- package/types/logs/index.d.ts +61 -2
- package/types/module-plugin/index.d.ts +20 -69
- package/types/syncs/index.d.ts +0 -17
- package/usage/README.md +54 -0
- package/usage/index.js +17 -0
- package/usage/repositories/usage-repository-documentdb.js +194 -0
- package/usage/repositories/usage-repository-factory.js +25 -0
- package/usage/repositories/usage-repository-interface.js +37 -0
- package/usage/repositories/usage-repository-prisma.js +146 -0
- package/usage/tracked-metrics.js +38 -0
- package/usage/usage-windows.js +24 -0
- package/user/repositories/user-repository-documentdb.js +426 -0
- package/user/repositories/user-repository-factory.js +52 -0
- package/user/repositories/user-repository-interface.js +214 -0
- package/user/repositories/user-repository-mongo.js +323 -0
- package/user/repositories/user-repository-postgres.js +377 -0
- package/user/tests/doubles/test-user-repository.js +72 -0
- package/user/use-cases/authenticate-user.js +143 -0
- package/user/use-cases/authenticate-with-shared-secret.js +48 -0
- package/user/use-cases/create-individual-user.js +61 -0
- package/user/use-cases/create-organization-user.js +47 -0
- package/user/use-cases/create-token-for-user-id.js +30 -0
- package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
- package/user/use-cases/get-user-from-bearer-token.js +82 -0
- package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
- package/user/use-cases/login-user.js +122 -0
- package/user/user.js +125 -0
- package/utils/backend-path.js +38 -0
- package/utils/index.js +6 -0
- package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
- package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
- package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
- package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
- package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
- package/websocket/repositories/websocket-connection-repository.js +161 -0
- package/assertions/is-equal.js +0 -17
- package/associations/model.js +0 -54
- package/database/models/IndividualUser.js +0 -76
- package/database/models/OrganizationUser.js +0 -29
- package/database/models/State.js +0 -9
- package/database/models/Token.js +0 -70
- package/database/models/UserModel.js +0 -7
- package/database/models/WebsocketConnection.js +0 -49
- package/database/mongo.js +0 -45
- package/database/mongoose.js +0 -5
- package/encrypt/Cryptor.test.js +0 -32
- package/encrypt/encrypt.js +0 -132
- package/encrypt/encrypt.test.js +0 -1069
- package/encrypt/test-encrypt.js +0 -107
- package/errors/base-error.test.js +0 -32
- package/errors/fetch-error.test.js +0 -79
- package/errors/halt-error.test.js +0 -11
- package/errors/validation-errors.test.js +0 -120
- package/handlers/routers/middleware/loadUser.js +0 -15
- package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
- package/integrations/create-frigg-backend.js +0 -31
- package/integrations/integration-factory.js +0 -251
- package/integrations/integration-mapping.js +0 -43
- package/integrations/integration-model.js +0 -46
- package/integrations/integration-user.js +0 -144
- package/integrations/test/integration-base.test.js +0 -144
- package/lambda/TimeoutCatcher.test.js +0 -68
- package/logs/logger.test.js +0 -76
- package/module-plugin/auther.js +0 -393
- package/module-plugin/credential.js +0 -22
- package/module-plugin/entity-manager.js +0 -70
- package/module-plugin/entity.js +0 -46
- package/module-plugin/manager.js +0 -169
- package/module-plugin/module-factory.js +0 -61
- package/module-plugin/requester/api-key.js +0 -36
- package/module-plugin/requester/oauth-2.js +0 -219
- package/module-plugin/requester/requester.js +0 -165
- package/module-plugin/requester/requester.test.js +0 -28
- package/module-plugin/test/auther.test.js +0 -97
- package/syncs/model.js +0 -62
- /package/{module-plugin → modules}/ModuleConstants.js +0 -0
- /package/{module-plugin → modules}/requester/basic.js +0 -0
- /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
declare module "@friggframework/associations/model" {
|
|
2
|
-
import { Model } from "mongoose";
|
|
3
|
-
|
|
4
|
-
export class Association extends Model {
|
|
5
|
-
integrationId: string;
|
|
6
|
-
name: string;
|
|
7
|
-
type: string;
|
|
8
|
-
primaryObject: string;
|
|
9
|
-
objects: {
|
|
10
|
-
entityId: string;
|
|
11
|
-
objectType: string;
|
|
12
|
-
objId: string;
|
|
13
|
-
metadata?: object;
|
|
14
|
-
}[];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
1
|
declare module "@friggframework/associations/association" {
|
|
19
2
|
export default class Association implements IFriggAssociation {
|
|
20
3
|
data: any;
|
package/types/core/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
declare module "@friggframework/core" {
|
|
2
|
-
import {
|
|
2
|
+
import type { SendMessageCommandInput } from "@aws-sdk/client-sqs";
|
|
3
3
|
|
|
4
4
|
export class Delegate implements IFriggDelegate {
|
|
5
5
|
delegate: any;
|
|
@@ -26,10 +26,18 @@ declare module "@friggframework/core" {
|
|
|
26
26
|
): Promise<any>;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
export interface BatchItemFailure {
|
|
30
|
+
itemIdentifier: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface BatchItemFailuresResponse {
|
|
34
|
+
batchItemFailures: BatchItemFailure[];
|
|
35
|
+
}
|
|
36
|
+
|
|
29
37
|
export class Worker implements IWorker {
|
|
30
38
|
getQueueURL(params: GetQueueURLParams): Promise<string | undefined>;
|
|
31
39
|
|
|
32
|
-
run(params: { Records: any }): Promise<
|
|
40
|
+
run(params: { Records: any }, context?: object): Promise<BatchItemFailuresResponse>;
|
|
33
41
|
|
|
34
42
|
send(params: object & { QueueUrl: any }, delay?: number): Promise<string>;
|
|
35
43
|
|
|
@@ -38,7 +46,7 @@ declare module "@friggframework/core" {
|
|
|
38
46
|
|
|
39
47
|
interface IWorker {
|
|
40
48
|
getQueueURL(params: GetQueueURLParams): Promise<string | undefined>;
|
|
41
|
-
run(params: { Records: any }): Promise<
|
|
49
|
+
run(params: { Records: any }, context?: object): Promise<BatchItemFailuresResponse>;
|
|
42
50
|
send(params: object & { QueueUrl: any }, delay?: number): Promise<string>;
|
|
43
51
|
sendAsyncSQSMessage(params: SendSQSMessageParams): Promise<string>;
|
|
44
52
|
}
|
|
@@ -50,5 +58,5 @@ declare module "@friggframework/core" {
|
|
|
50
58
|
QueueOwnerAWSAccountId?: string;
|
|
51
59
|
};
|
|
52
60
|
|
|
53
|
-
type SendSQSMessageParams =
|
|
61
|
+
type SendSQSMessageParams = SendMessageCommandInput;
|
|
54
62
|
}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
declare module "@friggframework/database
|
|
2
|
-
export
|
|
1
|
+
declare module "@friggframework/database" {
|
|
2
|
+
export const prisma: any;
|
|
3
|
+
export function connectPrisma(): Promise<any>;
|
|
4
|
+
export function disconnectPrisma(): Promise<void>;
|
|
5
|
+
export class TokenRepository {
|
|
6
|
+
constructor(params: { prismaClient: any });
|
|
7
|
+
}
|
|
8
|
+
export class WebsocketConnectionRepository {
|
|
9
|
+
constructor(params: { prismaClient: any });
|
|
10
|
+
}
|
|
3
11
|
}
|
package/types/encrypt/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
declare module "@friggframework/encrypt" {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
export class Cryptor {
|
|
3
|
+
constructor(params: { shouldUseAws?: boolean });
|
|
4
|
+
encrypt(plaintext: string): Promise<string>;
|
|
5
|
+
decrypt(ciphertext: string): Promise<string>;
|
|
6
|
+
}
|
|
5
7
|
}
|
package/types/errors/index.d.ts
CHANGED
|
@@ -6,11 +6,30 @@ declare module "@friggframework/errors" {
|
|
|
6
6
|
export class FetchError extends BaseError {
|
|
7
7
|
constructor(options?: FetchErrorConstructor);
|
|
8
8
|
|
|
9
|
+
statusCode?: number;
|
|
10
|
+
method: string;
|
|
11
|
+
/** Request URL without userinfo; each query value is `REDACTED`. */
|
|
12
|
+
url: string;
|
|
13
|
+
/** Non-enumerable. The raw response, or `null`. */
|
|
14
|
+
readonly response: FetchErrorResponse | null;
|
|
15
|
+
/** Non-enumerable. The raw response body; never part of `message`. */
|
|
16
|
+
readonly body: any;
|
|
17
|
+
isTimeout?: boolean;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
|
|
9
20
|
static create(options?: CreateFetchErrorParams): Promise<FetchError>;
|
|
10
21
|
}
|
|
11
22
|
|
|
23
|
+
type FetchErrorResponse = {
|
|
24
|
+
headers?: object;
|
|
25
|
+
status?: number;
|
|
26
|
+
statusText?: string;
|
|
27
|
+
bodyUsed?: boolean;
|
|
28
|
+
text?: () => Promise<string>;
|
|
29
|
+
};
|
|
30
|
+
|
|
12
31
|
type FetchErrorConstructor = {
|
|
13
|
-
resource?: string;
|
|
32
|
+
resource?: string | URL | { url: string };
|
|
14
33
|
init?: Partial<{
|
|
15
34
|
method: string;
|
|
16
35
|
credentials: string;
|
|
@@ -19,18 +38,13 @@ declare module "@friggframework/errors" {
|
|
|
19
38
|
body: URLSearchParams | any;
|
|
20
39
|
returnFullRes: false;
|
|
21
40
|
}>;
|
|
22
|
-
response?:
|
|
23
|
-
|
|
24
|
-
status?: number;
|
|
25
|
-
statusText?: string;
|
|
26
|
-
text?: () => Promise<string>;
|
|
27
|
-
};
|
|
41
|
+
response?: FetchErrorResponse | null;
|
|
42
|
+
cause?: unknown;
|
|
28
43
|
responseBody?: any;
|
|
44
|
+
body?: any;
|
|
29
45
|
};
|
|
30
46
|
|
|
31
|
-
type CreateFetchErrorParams =
|
|
32
|
-
body: any;
|
|
33
|
-
};
|
|
47
|
+
type CreateFetchErrorParams = FetchErrorConstructor;
|
|
34
48
|
|
|
35
49
|
export class HaltError extends BaseError {
|
|
36
50
|
isHaltError: boolean;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
declare module "@friggframework/integrations" {
|
|
2
2
|
import { Delegate, IFriggDelegate } from "@friggframework/core";
|
|
3
|
-
import { Model } from "mongoose";
|
|
4
|
-
import { EntityManager } from "@friggframework/module-plugin";
|
|
5
3
|
|
|
6
|
-
export
|
|
4
|
+
export interface Integration {
|
|
7
5
|
entities: any[];
|
|
8
6
|
userId: string;
|
|
9
7
|
status: string; // IntegrationStatus
|
|
@@ -19,8 +17,7 @@ declare module "@friggframework/integrations" {
|
|
|
19
17
|
|
|
20
18
|
export class IntegrationManager
|
|
21
19
|
extends Delegate
|
|
22
|
-
implements IFriggIntegrationManager
|
|
23
|
-
{
|
|
20
|
+
implements IFriggIntegrationManager {
|
|
24
21
|
integration: Integration;
|
|
25
22
|
primaryInstance: any;
|
|
26
23
|
targetInstance: any;
|
|
@@ -56,7 +53,6 @@ declare module "@friggframework/integrations" {
|
|
|
56
53
|
entities: { id: string; user: any },
|
|
57
54
|
userId: string,
|
|
58
55
|
config: any,
|
|
59
|
-
EntityManager: EntityManager
|
|
60
56
|
): Promise<any>;
|
|
61
57
|
|
|
62
58
|
static getFormattedIntegration(
|
|
@@ -116,8 +112,7 @@ declare module "@friggframework/integrations" {
|
|
|
116
112
|
}
|
|
117
113
|
|
|
118
114
|
export class IntegrationConfigManager
|
|
119
|
-
implements IFriggIntegrationConfigManager
|
|
120
|
-
{
|
|
115
|
+
implements IFriggIntegrationConfigManager {
|
|
121
116
|
options: IntegrationOptions[];
|
|
122
117
|
primary: any;
|
|
123
118
|
|
package/types/logs/index.d.ts
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
|
-
declare module "@friggframework/logs
|
|
1
|
+
declare module "@friggframework/core/logs" {
|
|
2
|
+
export type LogLevel = "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL";
|
|
3
|
+
|
|
4
|
+
export type LogFields = Record<string, unknown>;
|
|
5
|
+
|
|
6
|
+
export interface LogRecord {
|
|
7
|
+
readonly timestamp: string;
|
|
8
|
+
readonly level: LogLevel;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly logger: string;
|
|
11
|
+
readonly [key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Logger {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
trace(message: unknown, fields?: LogFields): void;
|
|
17
|
+
debug(message: unknown, fields?: LogFields): void;
|
|
18
|
+
info(message: unknown, fields?: LogFields): void;
|
|
19
|
+
warn(message: unknown, fields?: LogFields): void;
|
|
20
|
+
error(message: unknown, fields?: LogFields): void;
|
|
21
|
+
fatal(message: unknown, fields?: LogFields): void;
|
|
22
|
+
child(bindings: LogFields | (() => LogFields)): Logger;
|
|
23
|
+
isLevelEnabled(level: string): boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface LogSink {
|
|
27
|
+
name: string;
|
|
28
|
+
write(record: LogRecord): void;
|
|
29
|
+
flush?(options: { signal?: AbortSignal }): Promise<void> | void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface MemorySink extends LogSink {
|
|
33
|
+
readonly records: LogRecord[];
|
|
34
|
+
clear(): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface SerializedError {
|
|
38
|
+
type: string;
|
|
39
|
+
message: string;
|
|
40
|
+
code?: string | number;
|
|
41
|
+
status?: number;
|
|
42
|
+
stack?: string;
|
|
43
|
+
cause?: SerializedError | string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getLogger(name?: string): Logger;
|
|
47
|
+
export function createMemorySink(options?: { install?: boolean }): MemorySink;
|
|
48
|
+
export function resetLoggerForTests(options?: {
|
|
49
|
+
level?: LogLevel | Lowercase<LogLevel>;
|
|
50
|
+
sinks?: LogSink[];
|
|
51
|
+
/** Record frigg.* WARN+ records without eventName. Kept across resets that omit it. */
|
|
52
|
+
trackViolations?: boolean;
|
|
53
|
+
}): void;
|
|
54
|
+
export function serializeError(error: unknown): SerializedError;
|
|
55
|
+
export function redactValue(value: unknown): unknown;
|
|
56
|
+
export function toSanitizedSurrogate(error: unknown): Error;
|
|
57
|
+
|
|
58
|
+
/** @deprecated Use getLogger or this.logger. */
|
|
2
59
|
export function debug(...messages: any[]): void;
|
|
60
|
+
/** @deprecated Use getLogger or this.logger. */
|
|
3
61
|
export function initDebugLog(...initMessages: any[]): void;
|
|
4
|
-
|
|
62
|
+
/** @deprecated Use getLogger or this.logger. */
|
|
63
|
+
export function flushDebugLog(error?: any): void;
|
|
5
64
|
}
|
|
@@ -1,75 +1,26 @@
|
|
|
1
1
|
declare module "@friggframework/module-plugin" {
|
|
2
|
-
import { Model } from "mongoose";
|
|
3
2
|
import { Delegate, IFriggDelegate } from "@friggframework/core";
|
|
4
3
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
externalId
|
|
4
|
+
export interface Credential {
|
|
5
|
+
id?: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
authIsValid?: boolean;
|
|
8
|
+
externalId?: string;
|
|
9
|
+
data?: any;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
static getEntityManagerInstanceFromEntityId(
|
|
21
|
-
entityId: string,
|
|
22
|
-
userId: string
|
|
23
|
-
): Promise<any>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
interface IFriggEntityManager {}
|
|
27
|
-
|
|
28
|
-
export class Entity extends Model {
|
|
29
|
-
credentialId: string;
|
|
30
|
-
subType: string;
|
|
31
|
-
userId: string;
|
|
32
|
-
name: string;
|
|
33
|
-
externalId: string;
|
|
12
|
+
export interface Entity {
|
|
13
|
+
id?: string;
|
|
14
|
+
credentialId?: string;
|
|
15
|
+
userId?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
moduleName?: string;
|
|
18
|
+
externalId?: string;
|
|
19
|
+
data?: any;
|
|
34
20
|
}
|
|
35
21
|
|
|
36
22
|
export type MappedEntity = Entity & { id: string; type: any };
|
|
37
|
-
export class ModuleManager extends Delegate implements IFriggModuleManager {
|
|
38
|
-
static Entity: Entity;
|
|
39
|
-
static Credential: Credential;
|
|
40
23
|
|
|
41
|
-
constructor(params: { userId: string });
|
|
42
|
-
|
|
43
|
-
static getName(): any;
|
|
44
|
-
static getInstance(params: any): Promise<any>;
|
|
45
|
-
static getEntitiesForUserId(userId: string): Promise<MappedEntity[]>;
|
|
46
|
-
|
|
47
|
-
batchCreateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
|
|
48
|
-
batchUpdateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
|
|
49
|
-
findOrCreateEntity(params: any): Promise<any>;
|
|
50
|
-
getAllSyncObjects(SyncClass: any): Promise<any>;
|
|
51
|
-
getAuthorizationRequirements(params: any): Promise<any>;
|
|
52
|
-
getEntityId(): Promise<string>;
|
|
53
|
-
getEntityOptions(): Promise<any>;
|
|
54
|
-
markCredentialsInvalid(): Promise<Credential>;
|
|
55
|
-
processAuthorizationCallback(params: any): Promise<any>;
|
|
56
|
-
testAuth(params: any): Promise<any>;
|
|
57
|
-
validateAuthorizationRequirements(): Promise<boolean>;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
interface IFriggModuleManager extends IFriggDelegate {
|
|
61
|
-
getEntityId(): Promise<string>;
|
|
62
|
-
validateAuthorizationRequirements(): Promise<boolean>;
|
|
63
|
-
getAuthorizationRequirements(params: any): Promise<any>;
|
|
64
|
-
testAuth(params: any): Promise<any>;
|
|
65
|
-
processAuthorizationCallback(params: any): Promise<any>;
|
|
66
|
-
getEntityOptions(): Promise<any>;
|
|
67
|
-
findOrCreateEntity(params: any): Promise<any>;
|
|
68
|
-
getAllSyncObjects(SyncClass: any): Promise<any>;
|
|
69
|
-
batchCreateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
|
|
70
|
-
batchUpdateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
|
|
71
|
-
markCredentialsInvalid(): Promise<Credential>;
|
|
72
|
-
}
|
|
73
24
|
|
|
74
25
|
export class Requester implements IFriggRequester {
|
|
75
26
|
DLGT_INVALID_AUTH: string;
|
|
@@ -90,6 +41,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
90
41
|
): Promise<any>;
|
|
91
42
|
parseBody(response: any): Promise<any>;
|
|
92
43
|
refreshAuth(): Promise<any>;
|
|
44
|
+
_adoptNewerCredential(): Promise<boolean>;
|
|
93
45
|
|
|
94
46
|
delegate: any;
|
|
95
47
|
delegateTypes: any[];
|
|
@@ -121,6 +73,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
121
73
|
_put(options: RequestOptions): Promise<any>;
|
|
122
74
|
_delete(options: RequestOptions): Promise<any>;
|
|
123
75
|
refreshAuth(): Promise<any>;
|
|
76
|
+
_adoptNewerCredential(): Promise<boolean>;
|
|
124
77
|
}
|
|
125
78
|
|
|
126
79
|
type RequestOptions = {
|
|
@@ -138,8 +91,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
138
91
|
|
|
139
92
|
export class ApiKeyRequester
|
|
140
93
|
extends Requester
|
|
141
|
-
implements IFriggApiKeyRequester
|
|
142
|
-
{
|
|
94
|
+
implements IFriggApiKeyRequester {
|
|
143
95
|
API_KEY_NAME: string;
|
|
144
96
|
API_KEY_VALUE: any;
|
|
145
97
|
|
|
@@ -160,8 +112,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
160
112
|
|
|
161
113
|
export class BasicAuthRequester
|
|
162
114
|
extends Requester
|
|
163
|
-
implements IFriggBasicAuthRequester
|
|
164
|
-
{
|
|
115
|
+
implements IFriggBasicAuthRequester {
|
|
165
116
|
password: string;
|
|
166
117
|
username: string;
|
|
167
118
|
|
|
@@ -189,8 +140,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
189
140
|
|
|
190
141
|
export class OAuth2Requester
|
|
191
142
|
extends Requester
|
|
192
|
-
implements IFriggOAuth2Requester
|
|
193
|
-
{
|
|
143
|
+
implements IFriggOAuth2Requester {
|
|
194
144
|
DLGT_TOKEN_DEAUTHORIZED: string;
|
|
195
145
|
DLGT_TOKEN_UPDATE: string;
|
|
196
146
|
accessTokenExpire: any;
|
|
@@ -253,6 +203,7 @@ declare module "@friggframework/module-plugin" {
|
|
|
253
203
|
addAuthHeaders(headers: object): Promise<object>;
|
|
254
204
|
isAuthenticated(): boolean;
|
|
255
205
|
refreshAuth(): Promise<void>;
|
|
206
|
+
_adoptNewerCredential(): Promise<boolean>;
|
|
256
207
|
getTokenFromUsernamePassword(): Promise<Token>;
|
|
257
208
|
getTokenFromClientCredentials(): Promise<Token>;
|
|
258
209
|
}
|
package/types/syncs/index.d.ts
CHANGED
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
declare module "@friggframework/syncs/model" {
|
|
2
|
-
import { Model } from "mongoose";
|
|
3
|
-
|
|
4
|
-
export class Sync extends Model {
|
|
5
|
-
entities: any[];
|
|
6
|
-
hash: string;
|
|
7
|
-
name: string;
|
|
8
|
-
dataIdentifiers: {
|
|
9
|
-
entity: any;
|
|
10
|
-
id: object;
|
|
11
|
-
hash: string;
|
|
12
|
-
}[];
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
1
|
declare module "@friggframework/syncs/manager" {
|
|
17
2
|
import Sync from "@friggframework/syncs/sync";
|
|
18
3
|
|
|
@@ -28,7 +13,6 @@ declare module "@friggframework/syncs/manager" {
|
|
|
28
13
|
confirmCreate(
|
|
29
14
|
syncObj: Sync,
|
|
30
15
|
createdId: string,
|
|
31
|
-
moduleManager: any
|
|
32
16
|
): Promise<any>;
|
|
33
17
|
confirmUpdate(syncObj: Sync): Promise<any>;
|
|
34
18
|
createSyncDBObject(objArr: any[], entities: any[]): Promise<any>;
|
|
@@ -50,7 +34,6 @@ declare module "@friggframework/syncs/manager" {
|
|
|
50
34
|
confirmCreate(
|
|
51
35
|
syncObj: Sync,
|
|
52
36
|
createdId: string,
|
|
53
|
-
moduleManager: any
|
|
54
37
|
): Promise<any>;
|
|
55
38
|
confirmUpdate(syncObj: Sync): Promise<any>;
|
|
56
39
|
}
|
package/usage/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Usage Store
|
|
2
|
+
|
|
3
|
+
The durable, Frigg-owned store behind ADR-011 feature-usage tracking. Holds
|
|
4
|
+
per-integration counters that the reporting endpoint reads for cross-integration
|
|
5
|
+
comparison and trend series.
|
|
6
|
+
|
|
7
|
+
Populated by the telemetry usage rollup and read via `frigg.usage.*` — see
|
|
8
|
+
[`telemetry/README.md`](../telemetry/README.md) for the full guide, config, and
|
|
9
|
+
usage examples. This README covers the store internals only.
|
|
10
|
+
|
|
11
|
+
## Fact row
|
|
12
|
+
|
|
13
|
+
`UsageCounter { integrationId, integrationType, metric, window, value, updatedAt }`,
|
|
14
|
+
uniquely keyed by `(integrationId, integrationType, metric, window)`. `window` is
|
|
15
|
+
`day:YYYY-MM-DD` or `hour:YYYY-MM-DDTHH` (UTC).
|
|
16
|
+
|
|
17
|
+
## Isolation (ADR-010 Decision 3)
|
|
18
|
+
|
|
19
|
+
The store is deliberately isolated from user/integration-scoped data:
|
|
20
|
+
|
|
21
|
+
- **No `userId`** and **no foreign key** to `Integration` — a user-scoped query
|
|
22
|
+
can never return a usage row, and usage history survives integration deletion.
|
|
23
|
+
- **Not** in the encryption registry — dimensions are bounded and non-sensitive.
|
|
24
|
+
|
|
25
|
+
## Repository triad
|
|
26
|
+
|
|
27
|
+
Mirrors the reporting/process pattern — an interface plus PostgreSQL, MongoDB and
|
|
28
|
+
DocumentDB adapters selected by `DB_TYPE`:
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
const { createUsageRepository } = require('@friggframework/core'); // usage-repository-factory
|
|
32
|
+
|
|
33
|
+
class UsageRepositoryInterface {
|
|
34
|
+
async increment({ integrationId, integrationType, metric, window, value }) {} // atomic upsert
|
|
35
|
+
async getTotalsByDimension({ metric, groupBy, since, bucket }) {} // comparison (one window granularity)
|
|
36
|
+
async getTimeSeries({ metric, integrationType, from, to, bucket }) {} // trend (aggregated across instances)
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- **`increment`** is atomic: PostgreSQL uses Prisma `upsert` with
|
|
41
|
+
`{ value: { increment } }`; a concurrent first-insert race (`P2002`) retries
|
|
42
|
+
once onto the atomic update path.
|
|
43
|
+
- **`getTotalsByDimension`** filters to a single window granularity (default `day`) so day and
|
|
44
|
+
hour rows are never double-summed. Requires a `metric`; `groupBy` is
|
|
45
|
+
allow-listed to `integrationType` / `metric`.
|
|
46
|
+
- **`getTimeSeries`** aggregates across integration instances (`groupBy(window) + sum`)
|
|
47
|
+
and range-filters on the window key. Requires an `integrationType`.
|
|
48
|
+
|
|
49
|
+
> **DocumentDB:** the adapter overrides increment/getTotalsByDimension/getTimeSeries with raw commands
|
|
50
|
+
> (`$runCommandRaw`: a `$inc` upsert via `documentdb-utils.updateOne`, and a
|
|
51
|
+
> cursor-drained `$aggregate` `$group/$sum`) — matching every other DocumentDB
|
|
52
|
+
> adapter, since Prisma's Mongo engine emits upsert/groupBy shapes DocumentDB
|
|
53
|
+
> rejects and cursor reads truncate at ~101 docs. Command shapes are unit-tested;
|
|
54
|
+
> run an end-to-end check against a real cluster before GA.
|
package/usage/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const {
|
|
2
|
+
createUsageRepository,
|
|
3
|
+
UsageRepositoryPrisma,
|
|
4
|
+
UsageRepositoryDocumentDB,
|
|
5
|
+
} = require('./repositories/usage-repository-factory');
|
|
6
|
+
const {
|
|
7
|
+
UsageRepositoryInterface,
|
|
8
|
+
} = require('./repositories/usage-repository-interface');
|
|
9
|
+
const { computeTrackedMetrics } = require('./tracked-metrics');
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
createUsageRepository,
|
|
13
|
+
computeTrackedMetrics,
|
|
14
|
+
UsageRepositoryInterface,
|
|
15
|
+
UsageRepositoryPrisma,
|
|
16
|
+
UsageRepositoryDocumentDB,
|
|
17
|
+
};
|