@friggframework/core 2.0.0--canary.548.c8ae0ca.0 → 2.0.0--canary.545.c40eca4.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 +66 -67
- package/CLAUDE.md +148 -124
- package/README.md +165 -130
- package/admin-scripts/index.js +52 -0
- package/admin-scripts/repositories/admin-api-key-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-api-key-repository-factory.js +51 -0
- package/admin-scripts/repositories/admin-api-key-repository-interface.js +121 -0
- package/admin-scripts/repositories/admin-api-key-repository-mongo.js +155 -0
- package/admin-scripts/repositories/admin-api-key-repository-postgres.js +189 -0
- package/admin-scripts/repositories/admin-process-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-process-repository-factory.js +49 -0
- package/admin-scripts/repositories/admin-process-repository-interface.js +150 -0
- package/admin-scripts/repositories/admin-process-repository-mongo.js +213 -0
- package/admin-scripts/repositories/admin-process-repository-postgres.js +251 -0
- package/admin-scripts/repositories/script-execution-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-execution-repository-factory.js +51 -0
- package/admin-scripts/repositories/script-execution-repository-interface.js +193 -0
- package/admin-scripts/repositories/script-execution-repository-mongo.js +278 -0
- package/admin-scripts/repositories/script-execution-repository-postgres.js +320 -0
- package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-schedule-repository-factory.js +49 -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/admin-script-commands.js +348 -0
- package/application/commands/integration-commands.js +12 -6
- package/application/index.js +5 -3
- package/assertions/get.js +17 -7
- package/associations/association.js +59 -57
- package/core/CLAUDE.md +222 -156
- package/core/Worker.js +33 -12
- package/credential/credential-router.js +262 -0
- package/credential/repositories/credential-repository-documentdb.js +71 -1
- package/credential/repositories/credential-repository-factory.js +4 -6
- package/credential/repositories/credential-repository-interface.js +8 -2
- package/credential/repositories/credential-repository-mongo.js +45 -4
- package/credential/repositories/credential-repository-postgres.js +44 -3
- package/credential/repositories/credential-repository.js +3 -1
- package/credential/use-cases/delete-credential-for-user.js +50 -0
- package/credential/use-cases/get-credential-for-user.js +21 -3
- package/credential/use-cases/list-credentials-for-user.js +31 -0
- package/credential/use-cases/reauthorize-credential.js +103 -0
- package/credential/use-cases/update-authentication-status.js +5 -2
- package/database/MONGODB_TRANSACTION_FIX.md +72 -52
- package/database/config.js +13 -59
- package/database/documentdb-encryption-service.js +29 -13
- package/database/documentdb-utils.js +21 -12
- package/database/encryption/README.md +53 -36
- package/database/encryption/encryption-schema-registry.js +29 -23
- package/database/encryption/field-encryption-service.js +15 -4
- package/database/encryption/logger.js +3 -2
- package/database/encryption/prisma-encryption-extension.js +5 -8
- package/database/prisma.js +22 -14
- package/database/repositories/health-check-repository-factory.js +7 -5
- package/database/repositories/health-check-repository-interface.js +15 -5
- package/database/repositories/health-check-repository-postgres.js +1 -1
- package/database/use-cases/check-database-health-use-case.js +3 -2
- package/database/use-cases/check-database-state-use-case.js +8 -7
- package/database/use-cases/get-database-state-via-worker-use-case.js +15 -12
- package/database/use-cases/get-migration-status-use-case.js +4 -2
- package/database/use-cases/run-database-migration-use-case.js +41 -9
- package/database/use-cases/test-encryption-use-case.js +4 -5
- package/database/use-cases/trigger-database-migration-use-case.js +9 -8
- package/database/utils/mongodb-collection-utils.js +11 -3
- package/database/utils/mongodb-schema-init.js +10 -4
- package/database/utils/prisma-runner.js +144 -74
- package/database/utils/prisma-schema-parser.js +2 -2
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +135 -80
- package/encrypt/Cryptor.js +54 -49
- package/encrypt/aes-encryption-key-provider.js +82 -0
- package/encrypt/encryption-key-provider-interface.js +50 -0
- package/errors/fetch-error.js +1 -1
- package/generated/prisma-mongodb/edge.js +59 -4
- package/generated/prisma-mongodb/index-browser.js +49 -1
- package/generated/prisma-mongodb/index.d.ts +4023 -61
- package/generated/prisma-mongodb/index.js +59 -4
- package/generated/prisma-mongodb/package.json +1 -1
- package/generated/prisma-mongodb/schema.prisma +87 -0
- package/generated/prisma-mongodb/wasm.js +59 -4
- package/generated/prisma-postgresql/edge.js +58 -4
- package/generated/prisma-postgresql/index-browser.js +48 -1
- package/generated/prisma-postgresql/index.d.ts +4738 -54
- package/generated/prisma-postgresql/index.js +58 -4
- package/generated/prisma-postgresql/package.json +1 -1
- package/generated/prisma-postgresql/schema.prisma +85 -0
- package/generated/prisma-postgresql/wasm.js +58 -4
- package/handlers/WEBHOOKS.md +104 -81
- package/handlers/app-definition-loader.js +53 -10
- package/handlers/app-handler-helpers.js +14 -3
- package/handlers/backend-utils.js +0 -1
- package/handlers/database-migration-handler.js +64 -45
- package/handlers/middleware/admin-auth.js +53 -0
- package/handlers/routers/HEALTHCHECK.md +170 -135
- package/handlers/routers/admin.js +474 -0
- package/handlers/routers/auth.js +51 -9
- package/handlers/routers/db-migration.handler.js +2 -3
- package/handlers/routers/db-migration.js +102 -66
- package/handlers/routers/docs.js +180 -0
- package/handlers/routers/health.js +84 -283
- package/handlers/routers/integration-defined-routers.js +44 -33
- package/handlers/routers/integration-webhook-routers.js +73 -52
- package/handlers/routers/middleware/loadUser.js +39 -0
- package/handlers/routers/middleware/requireAdmin.js +43 -0
- package/handlers/routers/middleware/requireLoggedInUser.js +19 -0
- package/handlers/routers/user.js +30 -14
- package/handlers/routers/websocket.js +18 -4
- package/handlers/use-cases/check-integrations-health-use-case.js +13 -6
- package/handlers/workers/db-migration.js +74 -35
- package/handlers/workers/integration-defined-workers.js +31 -20
- package/index.js +50 -16
- package/infrastructure/scheduler/index.js +15 -11
- package/infrastructure/scheduler/netlify-scheduler-adapter.js +185 -0
- package/infrastructure/scheduler/scheduler-service-factory.js +38 -31
- package/integrations/WEBHOOK-QUICKSTART.md +21 -14
- package/integrations/index.js +4 -0
- package/integrations/integration-base.js +9 -6
- package/integrations/integration-router.js +1828 -157
- package/integrations/options.js +47 -20
- package/integrations/repositories/integration-mapping-repository-factory.js +4 -8
- package/integrations/repositories/integration-repository-documentdb.js +53 -24
- package/integrations/repositories/integration-repository-factory.js +6 -6
- package/integrations/repositories/integration-repository-interface.js +27 -9
- package/integrations/repositories/integration-repository-postgres.js +3 -3
- package/integrations/repositories/process-repository-factory.js +4 -7
- package/integrations/repositories/process-repository-interface.js +9 -5
- package/integrations/repositories/process-repository-mongo.js +7 -3
- package/integrations/repositories/process-repository-postgres.js +2 -2
- package/integrations/tests/doubles/config-capturing-integration.js +9 -8
- package/integrations/tests/doubles/dummy-integration-class.js +81 -8
- package/integrations/tests/doubles/test-integration-repository.js +51 -11
- package/integrations/use-cases/create-integration.js +36 -32
- package/integrations/use-cases/create-process.js +20 -9
- package/integrations/use-cases/delete-integration-for-user.js +5 -4
- package/integrations/use-cases/execute-proxy-request.js +564 -0
- package/integrations/use-cases/get-integration-for-user.js +25 -10
- package/integrations/use-cases/get-integration-instance-by-definition.js +13 -7
- package/integrations/use-cases/get-integrations-for-user.js +4 -1
- package/integrations/use-cases/get-possible-integrations.js +1 -1
- package/integrations/use-cases/get-process.js +5 -6
- package/integrations/use-cases/index.js +3 -1
- package/integrations/use-cases/load-integration-context.js +1 -5
- package/integrations/use-cases/update-process-state.js +10 -8
- package/integrations/utils/map-integration-dto.js +9 -3
- package/jest-setup.js +1 -1
- package/jest-teardown.js +1 -1
- package/lambda/TimeoutCatcher.js +32 -30
- package/lambda/index.js +1 -1
- package/logs/index.js +3 -3
- package/modules/domain/entities/AuthorizationSession.js +131 -0
- package/modules/domain/entities/index.js +10 -0
- package/modules/module.js +4 -9
- package/modules/repositories/authorization-session-repository-factory.js +53 -0
- package/modules/repositories/authorization-session-repository-interface.js +75 -0
- package/modules/repositories/authorization-session-repository-mongo.js +169 -0
- package/modules/repositories/authorization-session-repository-postgres.js +170 -0
- package/modules/repositories/module-repository-documentdb.js +89 -41
- package/modules/repositories/module-repository-factory.js +4 -6
- package/modules/repositories/module-repository-interface.js +13 -0
- package/modules/repositories/module-repository-mongo.js +40 -5
- package/modules/repositories/module-repository-postgres.js +42 -5
- package/modules/repositories/module-repository.js +28 -0
- package/modules/requester/api-key.js +0 -2
- package/modules/requester/basic.js +0 -1
- package/modules/requester/oauth-2.js +3 -14
- package/modules/test/mock-api/definition.js +15 -10
- package/modules/test/mock-api/mocks/hubspot.js +36 -36
- package/modules/tests/doubles/test-module-factory.js +10 -4
- package/modules/tests/doubles/test-module-repository.js +1 -1
- package/modules/use-cases/delete-module-entity.js +23 -0
- package/modules/use-cases/get-authorization-requirements.js +110 -0
- package/modules/use-cases/get-entities-for-user.js +1 -1
- package/modules/use-cases/get-entity-options-by-id.js +8 -6
- package/modules/use-cases/get-module-entity-by-id.js +16 -0
- package/modules/use-cases/get-module.js +12 -9
- package/modules/use-cases/process-authorization-callback.js +12 -6
- package/modules/use-cases/process-authorization-step.js +160 -0
- package/modules/use-cases/refresh-entity-options.js +8 -6
- package/modules/use-cases/start-authorization-session.js +86 -0
- package/modules/use-cases/test-module-auth.js +8 -6
- package/modules/use-cases/update-module-entity.js +27 -0
- package/modules/utils/map-module-dto.js +2 -2
- package/openapi/openapi-spec-generator.js +370 -0
- package/openapi/openapi-v1.yaml +1360 -0
- package/openapi/openapi-v2.yaml +1535 -0
- package/package.json +7 -9
- package/prisma-mongodb/schema.prisma +87 -0
- package/prisma-postgresql/migrations/20260222000000_add_admin_process_and_script_schedule/migration.sql +55 -0
- package/prisma-postgresql/schema.prisma +85 -0
- package/providers/index.js +13 -0
- package/providers/resolve-provider.js +93 -0
- package/queues/index.js +19 -0
- package/queues/providers/index.js +7 -0
- package/queues/providers/netlify-background-provider.js +76 -0
- package/queues/providers/qstash-queue-provider.js +122 -0
- package/queues/queue-client-interface.js +55 -0
- package/queues/queue-provider-factory.js +93 -0
- package/queues/queue-provider.js +46 -0
- package/queues/queuer-util.js +33 -25
- package/syncs/repositories/sync-repository-documentdb.js +39 -19
- package/syncs/repositories/sync-repository-factory.js +4 -4
- package/syncs/repositories/sync-repository-interface.js +6 -2
- package/syncs/repositories/sync-repository-postgres.js +19 -13
- package/syncs/sync.js +104 -100
- package/token/repositories/token-repository-factory.js +4 -6
- package/types/assertions/index.d.ts +72 -72
- package/types/core/index.d.ts +98 -53
- package/types/errors/index.d.ts +61 -54
- package/types/eslint-config/index.d.ts +40 -40
- package/types/lambda/index.d.ts +26 -26
- package/types/logs/index.d.ts +4 -4
- package/types/prettier-config/index.d.ts +5 -5
- package/types/test-environment/index.d.ts +14 -14
- package/types/tsconfig.json +95 -93
- package/user/repositories/user-repository-factory.js +4 -4
- package/user/tests/doubles/test-user-repository.js +5 -2
- package/user/use-cases/authenticate-user.js +2 -4
- package/user/use-cases/authenticate-with-shared-secret.js +1 -1
- package/user/use-cases/create-individual-user.js +8 -7
- package/user/use-cases/create-organization-user.js +1 -1
- package/user/use-cases/create-token-for-user-id.js +1 -1
- package/user/use-cases/delete-user.js +47 -0
- package/user/use-cases/get-user-from-adopter-jwt.js +0 -2
- package/user/use-cases/get-user-from-bearer-token.js +7 -3
- package/user/use-cases/get-user-from-x-frigg-headers.js +14 -11
- package/user/use-cases/login-user.js +8 -8
- package/user/user.js +18 -4
- package/utils/backend-path.js +2 -2
- package/utils/index.js +4 -1
- package/websocket/repositories/websocket-connection-repository-documentdb.js +46 -21
- package/websocket/repositories/websocket-connection-repository-factory.js +4 -8
- package/websocket/repositories/websocket-connection-repository-mongo.js +26 -16
- package/websocket/repositories/websocket-connection-repository-postgres.js +26 -15
- package/websocket/repositories/websocket-connection-repository.js +26 -20
- package/websocket/websocket-message-sender-interface.js +38 -0
- package/database/adapters/lambda-invoker.js +0 -97
- package/database/repositories/migration-status-repository-s3.js +0 -137
- package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +0 -184
package/CLAUDE.md
CHANGED
|
@@ -4,12 +4,12 @@ This file provides guidance to Claude Code when working with the Frigg Framework
|
|
|
4
4
|
|
|
5
5
|
## Critical Context (Read First)
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
7
|
+
- **Package Purpose**: Core framework functionality for building enterprise serverless integrations
|
|
8
|
+
- **Main Architecture**: Hexagonal/DDD architecture with clear separation of adapters, use cases, and repositories
|
|
9
|
+
- **Key Technologies**: Node.js, Express, AWS Lambda, MongoDB/PostgreSQL (Prisma), AWS KMS encryption
|
|
10
|
+
- **Core Value**: Provides building blocks for integration developers - they extend IntegrationBase and use framework services
|
|
11
|
+
- **Security Model**: Field-level encryption, OAuth2 flows, signature validation, VPC deployment
|
|
12
|
+
- **DO NOT**: Bypass architectural layers, skip encryption for sensitive data, expose internal errors to users
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
15
15
|
|
|
@@ -26,14 +26,14 @@ This file provides guidance to Claude Code when working with the Frigg Framework
|
|
|
26
26
|
|
|
27
27
|
`@friggframework/core` is the foundational package of the Frigg Framework, providing:
|
|
28
28
|
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
29
|
+
- **IntegrationBase**: Base class all integrations extend
|
|
30
|
+
- **Database Layer**: Multi-database support (MongoDB, DocumentDB, PostgreSQL) with Prisma ORM
|
|
31
|
+
- **Encryption**: Transparent field-level encryption with AWS KMS or AES
|
|
32
|
+
- **User Management**: Individual and organizational user support
|
|
33
|
+
- **Module System**: API module loading and credential management
|
|
34
|
+
- **Lambda Runtime**: Handler factory, worker base class, timeout management
|
|
35
|
+
- **Error Handling**: Standardized error types with proper HTTP status codes
|
|
36
|
+
- **Event System**: Integration lifecycle events and user actions
|
|
37
37
|
|
|
38
38
|
## Architecture Principles
|
|
39
39
|
|
|
@@ -196,22 +196,25 @@ packages/core/
|
|
|
196
196
|
**Purpose**: Foundation for building integrations between external systems.
|
|
197
197
|
|
|
198
198
|
**Key Files**:
|
|
199
|
-
|
|
200
|
-
-
|
|
201
|
-
-
|
|
199
|
+
|
|
200
|
+
- `integration-base.js` - Base class all integrations extend
|
|
201
|
+
- `integration.js` - Integration domain aggregate using Proxy pattern
|
|
202
|
+
- `options.js` - Integration configuration and options
|
|
202
203
|
|
|
203
204
|
**Use Cases**:
|
|
204
|
-
|
|
205
|
-
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
-
|
|
205
|
+
|
|
206
|
+
- `create-integration.js` - Create new integration instance
|
|
207
|
+
- `update-integration.js` - Update integration configuration
|
|
208
|
+
- `delete-integration-for-user.js` - Remove integration
|
|
209
|
+
- `get-integration-instance.js` - Load integration with modules
|
|
210
|
+
- `load-integration-context.js` - Full integration context loading
|
|
209
211
|
|
|
210
212
|
**Repositories**:
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
-
|
|
213
|
+
|
|
214
|
+
- `integration-repository-factory.js` - Creates database-specific repositories
|
|
215
|
+
- `integration-repository-mongo.js` - MongoDB implementation
|
|
216
|
+
- `integration-repository-postgres.js` - PostgreSQL implementation
|
|
217
|
+
- `integration-mapping-repository-*.js` - Mapping data persistence
|
|
215
218
|
|
|
216
219
|
**Integration developers extend IntegrationBase**:
|
|
217
220
|
|
|
@@ -224,8 +227,8 @@ class MyIntegration extends IntegrationBase {
|
|
|
224
227
|
version: '1.0.0',
|
|
225
228
|
modules: {
|
|
226
229
|
serviceA: 'service-a',
|
|
227
|
-
serviceB: 'service-b'
|
|
228
|
-
}
|
|
230
|
+
serviceB: 'service-b',
|
|
231
|
+
},
|
|
229
232
|
};
|
|
230
233
|
|
|
231
234
|
async onCreate({ integrationId }) {
|
|
@@ -240,52 +243,60 @@ class MyIntegration extends IntegrationBase {
|
|
|
240
243
|
**Purpose**: Multi-database support with transparent encryption.
|
|
241
244
|
|
|
242
245
|
**Key Components**:
|
|
243
|
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
+
|
|
247
|
+
- `prisma.js` - Prisma client initialization with encryption extension
|
|
248
|
+
- `mongo.js` - Mongoose connection management (legacy)
|
|
249
|
+
- `models/` - Mongoose model definitions
|
|
246
250
|
|
|
247
251
|
**Encryption System** (`/database/encryption`):
|
|
248
|
-
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
+
|
|
253
|
+
- **Transparent encryption**: Application code never sees encrypted data
|
|
254
|
+
- **Database-agnostic**: Works with MongoDB and PostgreSQL
|
|
255
|
+
- **AWS KMS or AES**: Production KMS, development AES
|
|
256
|
+
- **Configurable**: Via environment variables and app definition
|
|
252
257
|
|
|
253
258
|
**See**: `database/encryption/README.md` for comprehensive documentation
|
|
254
259
|
|
|
255
260
|
**Repositories**:
|
|
256
|
-
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
261
|
+
|
|
262
|
+
- `health-check-repository.js` - Database health monitoring
|
|
263
|
+
- `token-repository.js` - Authentication tokens
|
|
264
|
+
- `websocket-connection-repository.js` - WebSocket connections
|
|
265
|
+
- DocumentDB-enabled adapters mirror the MongoDB APIs but execute raw commands (`$runCommandRaw`, `$aggregateRaw`) for compatibility; encrypted models (e.g., credentials) still delegate reads to Prisma so the encryption extension can decrypt secrets transparently.
|
|
260
266
|
|
|
261
267
|
**Use Cases**:
|
|
262
|
-
|
|
263
|
-
-
|
|
268
|
+
|
|
269
|
+
- `check-database-health-use-case.js` - Database health checks
|
|
270
|
+
- `test-encryption-use-case.js` - Encryption verification
|
|
264
271
|
|
|
265
272
|
### 3. User Management (`/user`)
|
|
266
273
|
|
|
267
274
|
**Purpose**: Individual and organizational user authentication.
|
|
268
275
|
|
|
269
276
|
**User Types**:
|
|
270
|
-
|
|
271
|
-
-
|
|
272
|
-
-
|
|
277
|
+
|
|
278
|
+
- **Individual Users**: Personal accounts with email/password
|
|
279
|
+
- **Organization Users**: Business accounts with organization-level access
|
|
280
|
+
- **Hybrid**: Support both simultaneously
|
|
273
281
|
|
|
274
282
|
**Authentication Methods**:
|
|
275
|
-
|
|
276
|
-
-
|
|
277
|
-
-
|
|
283
|
+
|
|
284
|
+
- Password-based (bcrypt hashed)
|
|
285
|
+
- Token-based (Bearer tokens)
|
|
286
|
+
- App-based (external app user IDs)
|
|
278
287
|
|
|
279
288
|
**Use Cases**:
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
-
|
|
283
|
-
-
|
|
289
|
+
|
|
290
|
+
- `login-user.js` - User authentication
|
|
291
|
+
- `create-individual-user.js` - Create personal account
|
|
292
|
+
- `create-organization-user.js` - Create business account
|
|
293
|
+
- `get-user-from-bearer-token.js` - Token authentication
|
|
284
294
|
|
|
285
295
|
**Repositories**:
|
|
286
|
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
296
|
+
|
|
297
|
+
- `user-repository-factory.js` - Creates database-specific repositories
|
|
298
|
+
- `user-repository-mongo.js` - MongoDB implementation
|
|
299
|
+
- `user-repository-postgres.js` - PostgreSQL implementation
|
|
289
300
|
|
|
290
301
|
**Configuration** (in app definition):
|
|
291
302
|
|
|
@@ -305,21 +316,24 @@ class MyIntegration extends IntegrationBase {
|
|
|
305
316
|
**Purpose**: API module loading, credential management, and HTTP clients.
|
|
306
317
|
|
|
307
318
|
**Key Classes**:
|
|
308
|
-
|
|
309
|
-
-
|
|
310
|
-
-
|
|
311
|
-
-
|
|
312
|
-
-
|
|
313
|
-
-
|
|
319
|
+
|
|
320
|
+
- `Credential` - API credentials domain entity
|
|
321
|
+
- `Entity` - External service entity (account, workspace, etc.)
|
|
322
|
+
- `Requester` - Base HTTP client class
|
|
323
|
+
- `OAuth2Requester` - OAuth 2.0 flow implementation
|
|
324
|
+
- `ApiKeyRequester` - API key authentication
|
|
325
|
+
- `BasicAuthRequester` - Basic authentication
|
|
314
326
|
|
|
315
327
|
**Module Factory**:
|
|
316
|
-
|
|
317
|
-
-
|
|
318
|
-
-
|
|
328
|
+
|
|
329
|
+
- `ModuleFactory` - Creates and configures API module instances
|
|
330
|
+
- Handles credential injection
|
|
331
|
+
- Manages module lifecycle
|
|
319
332
|
|
|
320
333
|
**Repositories**:
|
|
321
|
-
|
|
322
|
-
-
|
|
334
|
+
|
|
335
|
+
- `module-repository.js` - Module data access
|
|
336
|
+
- `credential-repository.js` - Credential persistence (encrypted)
|
|
323
337
|
|
|
324
338
|
### 5. Core Runtime System (`/core`)
|
|
325
339
|
|
|
@@ -328,10 +342,11 @@ class MyIntegration extends IntegrationBase {
|
|
|
328
342
|
**See**: `core/CLAUDE.md` for comprehensive documentation
|
|
329
343
|
|
|
330
344
|
**Key Components**:
|
|
331
|
-
|
|
332
|
-
-
|
|
333
|
-
-
|
|
334
|
-
-
|
|
345
|
+
|
|
346
|
+
- `create-handler.js` - Lambda handler factory
|
|
347
|
+
- `Worker.js` - SQS job processing base class
|
|
348
|
+
- `Delegate.js` - Observer/delegation pattern
|
|
349
|
+
- `load-installed-modules.js` - Dynamic module loading
|
|
335
350
|
|
|
336
351
|
**Handler Pattern**:
|
|
337
352
|
|
|
@@ -340,12 +355,12 @@ const { createHandler } = require('@friggframework/core');
|
|
|
340
355
|
|
|
341
356
|
const handler = createHandler({
|
|
342
357
|
eventName: 'MyIntegration',
|
|
343
|
-
isUserFacingResponse: true,
|
|
344
|
-
shouldUseDatabase: true,
|
|
358
|
+
isUserFacingResponse: true, // Sanitize errors
|
|
359
|
+
shouldUseDatabase: true, // Connect to DB
|
|
345
360
|
method: async (event, context) => {
|
|
346
361
|
// Your logic here
|
|
347
362
|
return { statusCode: 200, body: 'Success' };
|
|
348
|
-
}
|
|
363
|
+
},
|
|
349
364
|
});
|
|
350
365
|
```
|
|
351
366
|
|
|
@@ -370,10 +385,11 @@ class MyWorker extends Worker {
|
|
|
370
385
|
**Purpose**: Cryptor adapter for AWS KMS and AES encryption.
|
|
371
386
|
|
|
372
387
|
**Key Class**: `Cryptor.js`
|
|
373
|
-
|
|
374
|
-
-
|
|
375
|
-
-
|
|
376
|
-
-
|
|
388
|
+
|
|
389
|
+
- Envelope encryption pattern
|
|
390
|
+
- AWS KMS integration
|
|
391
|
+
- AES-256-GCM fallback
|
|
392
|
+
- Key rotation support
|
|
377
393
|
|
|
378
394
|
**Usage**:
|
|
379
395
|
|
|
@@ -381,7 +397,7 @@ class MyWorker extends Worker {
|
|
|
381
397
|
const { Cryptor } = require('@friggframework/core');
|
|
382
398
|
|
|
383
399
|
const cryptor = new Cryptor({
|
|
384
|
-
shouldUseAws: process.env.KMS_KEY_ARN ? true : false
|
|
400
|
+
shouldUseAws: process.env.KMS_KEY_ARN ? true : false,
|
|
385
401
|
});
|
|
386
402
|
|
|
387
403
|
const encrypted = await cryptor.encrypt('sensitive-data');
|
|
@@ -393,29 +409,33 @@ const decrypted = await cryptor.decrypt(encrypted);
|
|
|
393
409
|
**Purpose**: HTTP/Lambda request handling and routing.
|
|
394
410
|
|
|
395
411
|
**Key Routers**:
|
|
396
|
-
|
|
397
|
-
-
|
|
398
|
-
-
|
|
412
|
+
|
|
413
|
+
- `integration-router.js` - Integration CRUD operations
|
|
414
|
+
- `auth.js` - Authentication endpoints
|
|
415
|
+
- `health.js` - Health check endpoints with encryption verification
|
|
399
416
|
|
|
400
417
|
**Handler Types**:
|
|
401
|
-
|
|
402
|
-
-
|
|
403
|
-
-
|
|
418
|
+
|
|
419
|
+
- **User-facing**: Sanitize errors, friendly responses
|
|
420
|
+
- **Server-to-server**: Full error details for debugging
|
|
421
|
+
- **Background workers**: SQS message processing
|
|
404
422
|
|
|
405
423
|
**Event Dispatcher**:
|
|
406
|
-
|
|
407
|
-
-
|
|
424
|
+
|
|
425
|
+
- `integration-event-dispatcher.js` - Routes events to integration handlers
|
|
426
|
+
- Supports lifecycle events and user actions
|
|
408
427
|
|
|
409
428
|
### 8. Error Handling (`/errors`)
|
|
410
429
|
|
|
411
430
|
**Purpose**: Standardized error types with proper HTTP semantics.
|
|
412
431
|
|
|
413
432
|
**Error Types**:
|
|
414
|
-
|
|
415
|
-
-
|
|
416
|
-
-
|
|
417
|
-
-
|
|
418
|
-
-
|
|
433
|
+
|
|
434
|
+
- `BaseError` - Base error class
|
|
435
|
+
- `FetchError` - HTTP request failures
|
|
436
|
+
- `HaltError` - Stop processing without retry
|
|
437
|
+
- `RequiredPropertyError` - Missing required parameters
|
|
438
|
+
- `ParameterTypeError` - Invalid parameter type
|
|
419
439
|
|
|
420
440
|
**Usage**:
|
|
421
441
|
|
|
@@ -432,9 +452,10 @@ if (!userId) {
|
|
|
432
452
|
**Purpose**: Structured logging with debug capabilities.
|
|
433
453
|
|
|
434
454
|
**Functions**:
|
|
435
|
-
|
|
436
|
-
-
|
|
437
|
-
-
|
|
455
|
+
|
|
456
|
+
- `debug(message, data)` - Debug logging
|
|
457
|
+
- `initDebugLog(eventName, event)` - Initialize debug context
|
|
458
|
+
- `flushDebugLog(error)` - Flush logs on error
|
|
438
459
|
|
|
439
460
|
**Usage**:
|
|
440
461
|
|
|
@@ -452,8 +473,9 @@ flushDebugLog(); // On error
|
|
|
452
473
|
**Purpose**: AWS Lambda-specific utilities.
|
|
453
474
|
|
|
454
475
|
**Key Classes**:
|
|
455
|
-
|
|
456
|
-
-
|
|
476
|
+
|
|
477
|
+
- `TimeoutCatcher` - Detect approaching Lambda timeout
|
|
478
|
+
- Graceful shutdown handling
|
|
457
479
|
|
|
458
480
|
**Usage**:
|
|
459
481
|
|
|
@@ -511,10 +533,10 @@ const appDefinition = {
|
|
|
511
533
|
encryption: {
|
|
512
534
|
schema: {
|
|
513
535
|
MyCustomModel: {
|
|
514
|
-
fields: ['secretData', 'data.apiKey']
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
}
|
|
536
|
+
fields: ['secretData', 'data.apiKey'],
|
|
537
|
+
},
|
|
538
|
+
},
|
|
539
|
+
},
|
|
518
540
|
};
|
|
519
541
|
```
|
|
520
542
|
|
|
@@ -525,8 +547,8 @@ Edit `database/encryption/encryption-schema-registry.js`:
|
|
|
525
547
|
```javascript
|
|
526
548
|
const ENCRYPTION_SCHEMA = {
|
|
527
549
|
MyModel: {
|
|
528
|
-
fields: ['sensitiveField']
|
|
529
|
-
}
|
|
550
|
+
fields: ['sensitiveField'],
|
|
551
|
+
},
|
|
530
552
|
};
|
|
531
553
|
```
|
|
532
554
|
|
|
@@ -571,7 +593,7 @@ describe('MyUseCase', () => {
|
|
|
571
593
|
beforeEach(() => {
|
|
572
594
|
mockRepository = {
|
|
573
595
|
findById: jest.fn(),
|
|
574
|
-
save: jest.fn()
|
|
596
|
+
save: jest.fn(),
|
|
575
597
|
};
|
|
576
598
|
useCase = new MyUseCase({ repository: mockRepository });
|
|
577
599
|
});
|
|
@@ -638,35 +660,35 @@ Use test doubles from `@friggframework/test` package for consistent mocking.
|
|
|
638
660
|
|
|
639
661
|
### Required
|
|
640
662
|
|
|
641
|
-
-
|
|
642
|
-
-
|
|
643
|
-
-
|
|
663
|
+
- `AWS_REGION` - AWS region for services
|
|
664
|
+
- `DATABASE_URL` - Database connection string (auto-set)
|
|
665
|
+
- `DB_TYPE` - Database type: 'mongodb' or 'postgresql'
|
|
644
666
|
|
|
645
667
|
### Encryption
|
|
646
668
|
|
|
647
|
-
-
|
|
648
|
-
-
|
|
649
|
-
-
|
|
650
|
-
-
|
|
669
|
+
- `KMS_KEY_ARN` - AWS KMS key ARN (production)
|
|
670
|
+
- `AES_KEY_ID` - AES key ID (development)
|
|
671
|
+
- `AES_KEY` - AES encryption key (development)
|
|
672
|
+
- `STAGE` - Environment stage (dev, test, local bypass encryption)
|
|
651
673
|
|
|
652
674
|
### Optional
|
|
653
675
|
|
|
654
|
-
-
|
|
655
|
-
-
|
|
656
|
-
-
|
|
676
|
+
- `SECRET_ARN` - AWS Secrets Manager ARN for auto-injection
|
|
677
|
+
- `DEBUG` - Debug logging pattern
|
|
678
|
+
- `LOG_LEVEL` - Logging level (debug, info, warn, error)
|
|
657
679
|
|
|
658
680
|
## Version Information
|
|
659
681
|
|
|
660
|
-
-
|
|
661
|
-
-
|
|
662
|
-
-
|
|
682
|
+
- **Current Version**: 2.0.0-next.0 (pre-release)
|
|
683
|
+
- **Node.js**: >=18 required
|
|
684
|
+
- **Dependencies**: See package.json for full list
|
|
663
685
|
|
|
664
686
|
## Support and Documentation
|
|
665
687
|
|
|
666
|
-
-
|
|
667
|
-
-
|
|
668
|
-
-
|
|
669
|
-
-
|
|
688
|
+
- **Main Framework CLAUDE.md**: See root Frigg CLAUDE.md for framework-wide guidance
|
|
689
|
+
- **Core Runtime**: See `core/CLAUDE.md` for Lambda/Worker patterns
|
|
690
|
+
- **Encryption**: See `database/encryption/README.md` for encryption details
|
|
691
|
+
- **Package README**: See `README.md` for API reference
|
|
670
692
|
|
|
671
693
|
## Recent Important Changes
|
|
672
694
|
|
|
@@ -677,13 +699,15 @@ Use test doubles from `@friggframework/test` package for consistent mocking.
|
|
|
677
699
|
**Problem**: The `FieldEncryptionService` was converting objects to the string `"[object Object]"` before encrypting, corrupting JSON fields like `IntegrationMapping.mapping`.
|
|
678
700
|
|
|
679
701
|
**Solution**: Added `_serializeForEncryption()` and `_deserializeAfterDecryption()` methods:
|
|
680
|
-
|
|
681
|
-
-
|
|
682
|
-
-
|
|
702
|
+
|
|
703
|
+
- Objects are now JSON.stringify'd before encryption
|
|
704
|
+
- Decrypted strings are JSON.parse'd back to objects
|
|
705
|
+
- Plain strings work as before
|
|
683
706
|
|
|
684
707
|
**Files Changed**:
|
|
685
|
-
|
|
686
|
-
-
|
|
708
|
+
|
|
709
|
+
- `database/encryption/field-encryption-service.js`
|
|
710
|
+
- `database/encryption/field-encryption-service.test.js`
|
|
687
711
|
|
|
688
712
|
**Test Coverage**: All 40 tests pass, including new object encryption test.
|
|
689
713
|
|