@friggframework/core 2.0.0-next.8 → 2.0.0-next.80
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/CLAUDE.md +694 -0
- package/README.md +959 -50
- package/application/commands/README.md +451 -0
- package/application/commands/credential-commands.js +245 -0
- package/application/commands/entity-commands.js +336 -0
- package/application/commands/integration-commands.js +210 -0
- package/application/commands/scheduler-commands.js +263 -0
- package/application/commands/user-commands.js +283 -0
- package/application/index.js +73 -0
- package/assertions/index.js +0 -3
- package/core/CLAUDE.md +690 -0
- package/core/Worker.js +60 -24
- package/core/create-handler.js +79 -8
- package/credential/repositories/credential-repository-documentdb.js +304 -0
- package/credential/repositories/credential-repository-factory.js +54 -0
- package/credential/repositories/credential-repository-interface.js +98 -0
- package/credential/repositories/credential-repository-mongo.js +269 -0
- package/credential/repositories/credential-repository-postgres.js +287 -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 +154 -0
- package/database/documentdb-encryption-service.js +330 -0
- package/database/documentdb-utils.js +136 -0
- package/database/encryption/README.md +839 -0
- package/database/encryption/documentdb-encryption-service.md +3575 -0
- package/database/encryption/encryption-schema-registry.js +268 -0
- package/database/encryption/field-encryption-service.js +226 -0
- package/database/encryption/logger.js +79 -0
- package/database/encryption/prisma-encryption-extension.js +222 -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/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 +477 -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 +15 -7
- package/errors/index.js +2 -0
- package/generated/prisma-mongodb/client.d.ts +1 -0
- package/generated/prisma-mongodb/client.js +4 -0
- package/generated/prisma-mongodb/default.d.ts +1 -0
- package/generated/prisma-mongodb/default.js +4 -0
- package/generated/prisma-mongodb/edge.d.ts +1 -0
- package/generated/prisma-mongodb/edge.js +335 -0
- package/generated/prisma-mongodb/index-browser.js +317 -0
- package/generated/prisma-mongodb/index.d.ts +22955 -0
- package/generated/prisma-mongodb/index.js +360 -0
- package/generated/prisma-mongodb/package.json +183 -0
- package/generated/prisma-mongodb/query-engine-debian-openssl-3.0.x +0 -0
- package/generated/prisma-mongodb/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/runtime/edge-esm.js +34 -0
- package/generated/prisma-mongodb/runtime/edge.js +34 -0
- package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-mongodb/runtime/index-browser.js +16 -0
- package/generated/prisma-mongodb/runtime/library.d.ts +3977 -0
- package/generated/prisma-mongodb/runtime/react-native.js +83 -0
- package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +84 -0
- package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +36 -0
- package/generated/prisma-mongodb/schema.prisma +362 -0
- package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +4 -0
- package/generated/prisma-mongodb/wasm-worker-loader.mjs +4 -0
- package/generated/prisma-mongodb/wasm.d.ts +1 -0
- package/generated/prisma-mongodb/wasm.js +342 -0
- package/generated/prisma-postgresql/client.d.ts +1 -0
- package/generated/prisma-postgresql/client.js +4 -0
- package/generated/prisma-postgresql/default.d.ts +1 -0
- package/generated/prisma-postgresql/default.js +4 -0
- package/generated/prisma-postgresql/edge.d.ts +1 -0
- package/generated/prisma-postgresql/edge.js +357 -0
- package/generated/prisma-postgresql/index-browser.js +339 -0
- package/generated/prisma-postgresql/index.d.ts +25131 -0
- package/generated/prisma-postgresql/index.js +382 -0
- package/generated/prisma-postgresql/package.json +183 -0
- package/generated/prisma-postgresql/query-engine-debian-openssl-3.0.x +0 -0
- package/generated/prisma-postgresql/query-engine-rhel-openssl-3.0.x +0 -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/binary.d.ts +1 -0
- package/generated/prisma-postgresql/runtime/binary.js +289 -0
- package/generated/prisma-postgresql/runtime/edge-esm.js +34 -0
- package/generated/prisma-postgresql/runtime/edge.js +34 -0
- package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-postgresql/runtime/index-browser.js +16 -0
- package/generated/prisma-postgresql/runtime/library.d.ts +3977 -0
- package/generated/prisma-postgresql/runtime/react-native.js +83 -0
- package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +84 -0
- package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +36 -0
- package/generated/prisma-postgresql/schema.prisma +345 -0
- package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +4 -0
- package/generated/prisma-postgresql/wasm-worker-loader.mjs +4 -0
- package/generated/prisma-postgresql/wasm.d.ts +1 -0
- package/generated/prisma-postgresql/wasm.js +364 -0
- package/handlers/WEBHOOKS.md +653 -0
- package/handlers/app-definition-loader.js +38 -0
- package/handlers/app-handler-helpers.js +57 -0
- package/handlers/backend-utils.js +262 -0
- package/handlers/database-migration-handler.js +227 -0
- package/handlers/integration-event-dispatcher.js +54 -0
- package/handlers/routers/HEALTHCHECK.md +342 -0
- package/handlers/routers/auth.js +15 -0
- package/handlers/routers/db-migration.handler.js +29 -0
- package/handlers/routers/db-migration.js +326 -0
- package/handlers/routers/health.js +516 -0
- package/handlers/routers/integration-defined-routers.js +45 -0
- package/handlers/routers/integration-webhook-routers.js +67 -0
- package/handlers/routers/user.js +63 -0
- package/handlers/routers/websocket.js +57 -0
- 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 +352 -0
- package/handlers/workers/dlq-processor.js +63 -0
- package/handlers/workers/integration-defined-workers.js +23 -0
- package/index.js +82 -46
- 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/WEBHOOK-QUICKSTART.md +151 -0
- package/integrations/index.js +12 -10
- package/integrations/integration-base.js +364 -55
- package/integrations/integration-router.js +375 -179
- package/integrations/options.js +1 -1
- package/integrations/repositories/integration-mapping-repository-documentdb.js +280 -0
- package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
- package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
- package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
- package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
- package/integrations/repositories/integration-mapping-repository.js +156 -0
- package/integrations/repositories/integration-repository-documentdb.js +219 -0
- package/integrations/repositories/integration-repository-factory.js +51 -0
- package/integrations/repositories/integration-repository-interface.js +144 -0
- package/integrations/repositories/integration-repository-mongo.js +330 -0
- package/integrations/repositories/integration-repository-postgres.js +385 -0
- package/integrations/repositories/process-repository-documentdb.js +243 -0
- package/integrations/repositories/process-repository-factory.js +53 -0
- package/integrations/repositories/process-repository-interface.js +90 -0
- package/integrations/repositories/process-repository-mongo.js +190 -0
- package/integrations/repositories/process-repository-postgres.js +217 -0
- package/integrations/tests/doubles/config-capturing-integration.js +81 -0
- package/integrations/tests/doubles/dummy-integration-class.js +105 -0
- package/integrations/tests/doubles/test-integration-repository.js +112 -0
- package/integrations/use-cases/create-integration.js +83 -0
- package/integrations/use-cases/create-process.js +128 -0
- package/integrations/use-cases/delete-integration-for-user.js +101 -0
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -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 +87 -0
- package/integrations/use-cases/index.js +19 -0
- package/integrations/use-cases/load-integration-context.js +71 -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 +201 -0
- package/integrations/use-cases/update-process-state.js +119 -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/logs/logger.js +0 -4
- package/{module-plugin → modules}/index.js +0 -10
- package/modules/module-factory.js +56 -0
- package/modules/module.js +256 -0
- package/modules/repositories/module-repository-documentdb.js +335 -0
- package/modules/repositories/module-repository-factory.js +40 -0
- package/modules/repositories/module-repository-interface.js +129 -0
- package/modules/repositories/module-repository-mongo.js +408 -0
- package/modules/repositories/module-repository-postgres.js +453 -0
- package/modules/repositories/module-repository.js +345 -0
- package/modules/requester/api-key.js +52 -0
- package/modules/requester/oauth-2.js +396 -0
- package/{module-plugin → modules}/requester/requester.js +4 -2
- 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 +31 -0
- package/modules/use-cases/get-module.js +74 -0
- package/modules/use-cases/process-authorization-callback.js +177 -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 +18 -0
- package/package.json +82 -50
- package/prisma-mongodb/schema.prisma +362 -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/migration_lock.toml +3 -0
- package/prisma-postgresql/schema.prisma +345 -0
- package/queues/queuer-util.js +103 -21
- 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/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/integrations/index.d.ts +3 -8
- package/types/module-plugin/index.d.ts +17 -69
- package/types/syncs/index.d.ts +0 -17
- package/user/repositories/user-repository-documentdb.js +441 -0
- package/user/repositories/user-repository-factory.js +52 -0
- package/user/repositories/user-repository-interface.js +201 -0
- package/user/repositories/user-repository-mongo.js +308 -0
- package/user/repositories/user-repository-postgres.js +360 -0
- package/user/tests/doubles/test-user-repository.js +72 -0
- package/user/use-cases/authenticate-user.js +127 -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 +77 -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/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.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
package/database/models/Token.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
const { mongoose } = require('../mongoose');
|
|
2
|
-
const bcrypt = require('bcryptjs');
|
|
3
|
-
|
|
4
|
-
const collectionName = 'Token';
|
|
5
|
-
const decimals = 10;
|
|
6
|
-
|
|
7
|
-
const schema = new mongoose.Schema({
|
|
8
|
-
token: { type: String, required: true },
|
|
9
|
-
created: { type: Date, default: Date.now },
|
|
10
|
-
expires: { type: Date },
|
|
11
|
-
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
schema.static({
|
|
15
|
-
createTokenWithExpire: async function (userId, rawToken, minutes) {
|
|
16
|
-
// Create user token
|
|
17
|
-
let tokenHash = await bcrypt.hashSync(rawToken, parseInt(decimals));
|
|
18
|
-
|
|
19
|
-
let session = {
|
|
20
|
-
token: tokenHash,
|
|
21
|
-
expires: new Date(Date.now() + minutes * 60000).toISOString(),
|
|
22
|
-
user: userId,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
return this.create(session);
|
|
26
|
-
},
|
|
27
|
-
// Takes in a token object and that has been created in the database and the raw token value.
|
|
28
|
-
// Returns a json of just the token and id to return to the browser
|
|
29
|
-
createJSONToken: function (token, rawToken) {
|
|
30
|
-
let returnArr = {
|
|
31
|
-
id: token.id,
|
|
32
|
-
token: rawToken,
|
|
33
|
-
};
|
|
34
|
-
return JSON.stringify(returnArr);
|
|
35
|
-
},
|
|
36
|
-
// Takes in a token object and that has been created in the database and the raw token value.
|
|
37
|
-
// Returns a base64 buffer of just the token and id to return to the browser
|
|
38
|
-
createBase64BufferToken: function (token, rawToken) {
|
|
39
|
-
let jsonVal = Token.createJSONToken(token, rawToken);
|
|
40
|
-
return Buffer.from(jsonVal).toString('base64');
|
|
41
|
-
},
|
|
42
|
-
getJSONTokenFromBase64BufferToken: function (buffer) {
|
|
43
|
-
let tokenStr = Buffer.from(buffer.trim(), 'base64').toString('ascii');
|
|
44
|
-
return JSON.parse(tokenStr);
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
// Takes in a JSON Token with id and token in it and verifies the token
|
|
48
|
-
// is valid from the database. If it is not va
|
|
49
|
-
validateAndGetTokenFromJSONToken: async function (tokenObj) {
|
|
50
|
-
let sessionToken = await this.findById(tokenObj.id);
|
|
51
|
-
if (sessionToken) {
|
|
52
|
-
if (
|
|
53
|
-
!(await bcrypt.compareSync(tokenObj.token, sessionToken.token))
|
|
54
|
-
) {
|
|
55
|
-
throw new Error('Invalid Token: Token does not match');
|
|
56
|
-
}
|
|
57
|
-
if (new Date(sessionToken.expires) < new Date()) {
|
|
58
|
-
throw new Error('Invalid Token: Token is expired');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return sessionToken;
|
|
62
|
-
} else {
|
|
63
|
-
throw new Error('Invalid Token: Token does not exist');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
const Token = mongoose.models.Token || mongoose.model(collectionName, schema);
|
|
69
|
-
|
|
70
|
-
module.exports = { Token };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
const { mongoose } = require('../mongoose');
|
|
2
|
-
const AWS = require('aws-sdk');
|
|
3
|
-
|
|
4
|
-
const schema = new mongoose.Schema({
|
|
5
|
-
connectionId: { type: mongoose.Schema.Types.String },
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
// Add a static method to get active connections
|
|
9
|
-
schema.statics.getActiveConnections = async function () {
|
|
10
|
-
try {
|
|
11
|
-
const connections = await this.find({}, 'connectionId');
|
|
12
|
-
return connections.map((conn) => ({
|
|
13
|
-
connectionId: conn.connectionId,
|
|
14
|
-
send: async (data) => {
|
|
15
|
-
const apigwManagementApi = new AWS.ApiGatewayManagementApi({
|
|
16
|
-
apiVersion: '2018-11-29',
|
|
17
|
-
endpoint: process.env.WEBSOCKET_API_ENDPOINT,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
await apigwManagementApi
|
|
22
|
-
.postToConnection({
|
|
23
|
-
ConnectionId: conn.connectionId,
|
|
24
|
-
Data: JSON.stringify(data),
|
|
25
|
-
})
|
|
26
|
-
.promise();
|
|
27
|
-
} catch (error) {
|
|
28
|
-
if (error.statusCode === 410) {
|
|
29
|
-
console.log(`Stale connection ${conn.connectionId}`);
|
|
30
|
-
await this.deleteOne({
|
|
31
|
-
connectionId: conn.connectionId,
|
|
32
|
-
});
|
|
33
|
-
} else {
|
|
34
|
-
throw error;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
}));
|
|
39
|
-
} catch (error) {
|
|
40
|
-
console.error('Error getting active connections:', error);
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const WebsocketConnection =
|
|
46
|
-
mongoose.models.WebsocketConnection ||
|
|
47
|
-
mongoose.model('WebsocketConnection', schema);
|
|
48
|
-
|
|
49
|
-
module.exports = { WebsocketConnection };
|
package/database/mongo.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// Best Practices Connecting from AWS Lambda:
|
|
2
|
-
// https://dev.to/adnanrahic/building-a-serverless-rest-api-with-nodejs-and-mongodb-43db
|
|
3
|
-
// https://mongoosejs.com/docs/lambda.html
|
|
4
|
-
// https://www.mongodb.com/blog/post/optimizing-aws-lambda-performance-with-mongodb-atlas-and-nodejs
|
|
5
|
-
const { Encrypt } = require('../encrypt');
|
|
6
|
-
const { mongoose } = require('./mongoose');
|
|
7
|
-
const { debug, flushDebugLog } = require('../logs');
|
|
8
|
-
|
|
9
|
-
mongoose.plugin(Encrypt);
|
|
10
|
-
mongoose.set('applyPluginsToDiscriminators', true); // Needed for LHEncrypt
|
|
11
|
-
|
|
12
|
-
// Buffering means mongoose will queue up operations if it gets
|
|
13
|
-
// With serverless, better to fail fast if not connected.
|
|
14
|
-
// disconnected from MongoDB and send them when it reconnects.
|
|
15
|
-
const mongoConfig = {
|
|
16
|
-
useNewUrlParser: true,
|
|
17
|
-
bufferCommands: false, // Disable mongoose buffering
|
|
18
|
-
autoCreate: false, // Disable because auto creation does not work without buffering
|
|
19
|
-
useUnifiedTopology: true,
|
|
20
|
-
serverSelectionTimeoutMS: 5000,
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const checkIsConnected = () => mongoose.connection?.readyState > 0;
|
|
24
|
-
|
|
25
|
-
const connectToDatabase = async () => {
|
|
26
|
-
if (checkIsConnected()) {
|
|
27
|
-
debug('=> using existing database connection');
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
debug('=> using new database connection');
|
|
32
|
-
await mongoose.connect(process.env.MONGO_URI, mongoConfig);
|
|
33
|
-
debug('Connection state:', mongoose.STATES[mongoose.connection.readyState]);
|
|
34
|
-
mongoose.connection.on('error', (error) => flushDebugLog(error));
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const disconnectFromDatabase = async () => mongoose.disconnect();
|
|
38
|
-
|
|
39
|
-
const createObjectId = () => new mongoose.Types.ObjectId();
|
|
40
|
-
|
|
41
|
-
module.exports = {
|
|
42
|
-
connectToDatabase,
|
|
43
|
-
disconnectFromDatabase,
|
|
44
|
-
createObjectId,
|
|
45
|
-
};
|
package/database/mongoose.js
DELETED
package/encrypt/Cryptor.test.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const { Cryptor } = require('./Cryptor');
|
|
2
|
-
|
|
3
|
-
describe('Cryptor', () => {
|
|
4
|
-
describe('Permutations', () => {
|
|
5
|
-
it('calculates permutations correctly', async () => {
|
|
6
|
-
// Given a nested field, we want all possible paths that could access it.
|
|
7
|
-
const cryptor = new Cryptor({ fields: ['a.b.c.d', 'e'] });
|
|
8
|
-
expect(cryptor.permutationsByField).toEqual({
|
|
9
|
-
'a.b.c.d': [
|
|
10
|
-
['a', 'b', 'c', 'd'],
|
|
11
|
-
['a', 'b', 'c.d'],
|
|
12
|
-
['a', 'b.c', 'd'],
|
|
13
|
-
['a', 'b.c.d'],
|
|
14
|
-
['a.b', 'c', 'd'],
|
|
15
|
-
['a.b', 'c.d'],
|
|
16
|
-
['a.b.c', 'd'],
|
|
17
|
-
['a.b.c.d'],
|
|
18
|
-
],
|
|
19
|
-
e: [['e']],
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
describe('Keys', () => {
|
|
25
|
-
it('raises error on missing environment', () => {
|
|
26
|
-
const cryptor = new Cryptor({ fields: ['a.b.c.d', 'e'] });
|
|
27
|
-
expect(cryptor.getKeyFromEnvironment).toThrow(
|
|
28
|
-
'No encryption key found with ID "undefined"'
|
|
29
|
-
);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
});
|
package/encrypt/encrypt.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
const { Cryptor } = require('./Cryptor');
|
|
2
|
-
|
|
3
|
-
const updateOneEvents = [
|
|
4
|
-
'updateOne',
|
|
5
|
-
'replaceOne',
|
|
6
|
-
'findOneAndUpdate',
|
|
7
|
-
'findOneAndReplace',
|
|
8
|
-
];
|
|
9
|
-
const findOneEvents = [
|
|
10
|
-
'findOne',
|
|
11
|
-
'findOneAndDelete',
|
|
12
|
-
'findOneAndRemove',
|
|
13
|
-
'findOneAndUpdate',
|
|
14
|
-
'findOneAndReplace',
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
const shouldBypassEncryption = (STAGE) => {
|
|
18
|
-
const defaultBypassStages = ['dev', 'test', 'local'];
|
|
19
|
-
const bypassStageEnv = process.env.BYPASS_ENCRYPTION_STAGE;
|
|
20
|
-
// If the env is set to anything or an empty string, use the env. Otherwise, use the default array
|
|
21
|
-
const useEnv = !String(bypassStageEnv) || !!bypassStageEnv;
|
|
22
|
-
const bypassStages = useEnv
|
|
23
|
-
? bypassStageEnv.split(',').map((stage) => stage.trim())
|
|
24
|
-
: defaultBypassStages;
|
|
25
|
-
return bypassStages.includes(STAGE);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// The Mongoose plug-in function
|
|
29
|
-
function Encrypt(schema, options) {
|
|
30
|
-
const { STAGE, KMS_KEY_ARN, AES_KEY_ID } = process.env;
|
|
31
|
-
|
|
32
|
-
if (shouldBypassEncryption(STAGE)) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (KMS_KEY_ARN && AES_KEY_ID) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
'Local and AWS encryption keys are both set in the environment.'
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const fields = Object.values(schema.paths)
|
|
43
|
-
.map(({ path, options }) => (options.lhEncrypt === true ? path : ''))
|
|
44
|
-
.filter(Boolean);
|
|
45
|
-
|
|
46
|
-
if (!fields.length) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const cryptor = new Cryptor({
|
|
51
|
-
// Use AWS if the CMK is present
|
|
52
|
-
shouldUseAws: !!KMS_KEY_ARN,
|
|
53
|
-
// Find all the fields in the schema with lhEncrypt === true
|
|
54
|
-
fields: fields,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// ---------------------------------------------
|
|
58
|
-
// ### Encrypt fields before save/update/insert.
|
|
59
|
-
// ---------------------------------------------
|
|
60
|
-
|
|
61
|
-
schema.pre('save', async function encryptionPreSave() {
|
|
62
|
-
// `this` will be a doc
|
|
63
|
-
await cryptor.encryptFieldsInDocuments([this]);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
schema.pre(
|
|
67
|
-
'insertMany',
|
|
68
|
-
async function encryptionPreInsertMany(_, docs, options) {
|
|
69
|
-
// `this` will be the model
|
|
70
|
-
if (options?.rawResult) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
'Raw result not supported for insertMany with Encrypt plugin'
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
await cryptor.encryptFieldsInDocuments(docs);
|
|
77
|
-
}
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
schema.pre(updateOneEvents, async function encryptionPreUpdateOne() {
|
|
81
|
-
// `this` will be a query
|
|
82
|
-
await cryptor.encryptFieldsInQuery(this);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
schema.pre('updateMany', async function encryptionPreUpdateMany() {
|
|
86
|
-
// `this` will be a query
|
|
87
|
-
cryptor.expectNotToUpdateManyEncrypted(this.getUpdate());
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
schema.pre('update', async function encryptionPreUpdate() {
|
|
91
|
-
// `this` will be a query
|
|
92
|
-
const { multiple } = this.getOptions();
|
|
93
|
-
|
|
94
|
-
if (multiple) {
|
|
95
|
-
cryptor.expectNotToUpdateManyEncrypted(this.getUpdate());
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
await cryptor.encryptFieldsInQuery(this);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// --------------------------------------------
|
|
103
|
-
// ### Decrypt documents after they are loaded.
|
|
104
|
-
// --------------------------------------------
|
|
105
|
-
schema.post('save', async function encryptionPreSave() {
|
|
106
|
-
// `this` will be a doc
|
|
107
|
-
await cryptor.decryptFieldsInDocuments([this]);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
schema.post(findOneEvents, async function encryptionPostFindOne(doc) {
|
|
111
|
-
// `this` will be a query
|
|
112
|
-
const { rawResult } = this.getOptions();
|
|
113
|
-
|
|
114
|
-
if (rawResult) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
await cryptor.decryptFieldsInDocuments([doc]);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
schema.post('find', async function encryptionPostFind(docs) {
|
|
122
|
-
// `this` will be a query
|
|
123
|
-
await cryptor.decryptFieldsInDocuments(docs);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
schema.post('insertMany', async function encryptionPostInsertMany(docs) {
|
|
127
|
-
// `this` will be the model
|
|
128
|
-
await cryptor.decryptFieldsInDocuments(docs);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
module.exports = { Encrypt };
|