@friggframework/core 2.0.0-next.5 → 2.0.0-next.50

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.
Files changed (267) hide show
  1. package/CLAUDE.md +693 -0
  2. package/README.md +959 -50
  3. package/application/commands/README.md +421 -0
  4. package/application/commands/credential-commands.js +224 -0
  5. package/application/commands/entity-commands.js +315 -0
  6. package/application/commands/integration-commands.js +179 -0
  7. package/application/commands/user-commands.js +213 -0
  8. package/application/index.js +69 -0
  9. package/core/CLAUDE.md +690 -0
  10. package/core/Worker.js +8 -21
  11. package/core/create-handler.js +2 -7
  12. package/credential/repositories/credential-repository-factory.js +47 -0
  13. package/credential/repositories/credential-repository-interface.js +98 -0
  14. package/credential/repositories/credential-repository-mongo.js +307 -0
  15. package/credential/repositories/credential-repository-postgres.js +313 -0
  16. package/credential/repositories/credential-repository.js +302 -0
  17. package/credential/use-cases/get-credential-for-user.js +21 -0
  18. package/credential/use-cases/update-authentication-status.js +15 -0
  19. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  20. package/database/adapters/lambda-invoker.js +97 -0
  21. package/database/config.js +154 -0
  22. package/database/encryption/README.md +684 -0
  23. package/database/encryption/encryption-schema-registry.js +141 -0
  24. package/database/encryption/field-encryption-service.js +226 -0
  25. package/database/encryption/logger.js +79 -0
  26. package/database/encryption/prisma-encryption-extension.js +222 -0
  27. package/database/index.js +25 -12
  28. package/database/models/WebsocketConnection.js +16 -10
  29. package/database/models/readme.md +1 -0
  30. package/database/prisma.js +222 -0
  31. package/database/repositories/health-check-repository-factory.js +43 -0
  32. package/database/repositories/health-check-repository-interface.js +87 -0
  33. package/database/repositories/health-check-repository-mongodb.js +91 -0
  34. package/database/repositories/health-check-repository-postgres.js +82 -0
  35. package/database/repositories/health-check-repository.js +108 -0
  36. package/database/repositories/migration-status-repository-s3.js +137 -0
  37. package/database/use-cases/check-database-health-use-case.js +29 -0
  38. package/database/use-cases/check-database-state-use-case.js +81 -0
  39. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  40. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  41. package/database/use-cases/get-migration-status-use-case.js +93 -0
  42. package/database/use-cases/run-database-migration-use-case.js +137 -0
  43. package/database/use-cases/test-encryption-use-case.js +253 -0
  44. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  45. package/database/utils/mongodb-collection-utils.js +91 -0
  46. package/database/utils/mongodb-schema-init.js +106 -0
  47. package/database/utils/prisma-runner.js +400 -0
  48. package/database/utils/prisma-schema-parser.js +182 -0
  49. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  50. package/encrypt/Cryptor.js +34 -168
  51. package/encrypt/index.js +1 -2
  52. package/encrypt/test-encrypt.js +0 -2
  53. package/generated/prisma-mongodb/client.d.ts +1 -0
  54. package/generated/prisma-mongodb/client.js +4 -0
  55. package/generated/prisma-mongodb/default.d.ts +1 -0
  56. package/generated/prisma-mongodb/default.js +4 -0
  57. package/generated/prisma-mongodb/edge.d.ts +1 -0
  58. package/generated/prisma-mongodb/edge.js +334 -0
  59. package/generated/prisma-mongodb/index-browser.js +316 -0
  60. package/generated/prisma-mongodb/index.d.ts +22898 -0
  61. package/generated/prisma-mongodb/index.js +359 -0
  62. package/generated/prisma-mongodb/package.json +183 -0
  63. package/generated/prisma-mongodb/query-engine-debian-openssl-3.0.x +0 -0
  64. package/generated/prisma-mongodb/query-engine-rhel-openssl-3.0.x +0 -0
  65. package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
  66. package/generated/prisma-mongodb/runtime/binary.js +289 -0
  67. package/generated/prisma-mongodb/runtime/edge-esm.js +34 -0
  68. package/generated/prisma-mongodb/runtime/edge.js +34 -0
  69. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  70. package/generated/prisma-mongodb/runtime/index-browser.js +16 -0
  71. package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
  72. package/generated/prisma-mongodb/runtime/react-native.js +83 -0
  73. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +84 -0
  74. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +36 -0
  75. package/generated/prisma-mongodb/schema.prisma +362 -0
  76. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +4 -0
  77. package/generated/prisma-mongodb/wasm-worker-loader.mjs +4 -0
  78. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  79. package/generated/prisma-mongodb/wasm.js +341 -0
  80. package/generated/prisma-postgresql/client.d.ts +1 -0
  81. package/generated/prisma-postgresql/client.js +4 -0
  82. package/generated/prisma-postgresql/default.d.ts +1 -0
  83. package/generated/prisma-postgresql/default.js +4 -0
  84. package/generated/prisma-postgresql/edge.d.ts +1 -0
  85. package/generated/prisma-postgresql/edge.js +356 -0
  86. package/generated/prisma-postgresql/index-browser.js +338 -0
  87. package/generated/prisma-postgresql/index.d.ts +25072 -0
  88. package/generated/prisma-postgresql/index.js +381 -0
  89. package/generated/prisma-postgresql/package.json +183 -0
  90. package/generated/prisma-postgresql/query-engine-debian-openssl-3.0.x +0 -0
  91. package/generated/prisma-postgresql/query-engine-rhel-openssl-3.0.x +0 -0
  92. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  93. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  94. package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
  95. package/generated/prisma-postgresql/runtime/binary.js +289 -0
  96. package/generated/prisma-postgresql/runtime/edge-esm.js +34 -0
  97. package/generated/prisma-postgresql/runtime/edge.js +34 -0
  98. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  99. package/generated/prisma-postgresql/runtime/index-browser.js +16 -0
  100. package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
  101. package/generated/prisma-postgresql/runtime/react-native.js +83 -0
  102. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +84 -0
  103. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +36 -0
  104. package/generated/prisma-postgresql/schema.prisma +345 -0
  105. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +4 -0
  106. package/generated/prisma-postgresql/wasm-worker-loader.mjs +4 -0
  107. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  108. package/generated/prisma-postgresql/wasm.js +363 -0
  109. package/handlers/WEBHOOKS.md +653 -0
  110. package/handlers/app-definition-loader.js +38 -0
  111. package/handlers/app-handler-helpers.js +56 -0
  112. package/handlers/backend-utils.js +180 -0
  113. package/handlers/database-migration-handler.js +227 -0
  114. package/handlers/integration-event-dispatcher.js +54 -0
  115. package/handlers/routers/HEALTHCHECK.md +342 -0
  116. package/handlers/routers/auth.js +15 -0
  117. package/handlers/routers/db-migration.handler.js +29 -0
  118. package/handlers/routers/db-migration.js +256 -0
  119. package/handlers/routers/health.js +519 -0
  120. package/handlers/routers/integration-defined-routers.js +45 -0
  121. package/handlers/routers/integration-webhook-routers.js +67 -0
  122. package/handlers/routers/user.js +63 -0
  123. package/handlers/routers/websocket.js +57 -0
  124. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  125. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  126. package/handlers/workers/db-migration.js +352 -0
  127. package/handlers/workers/integration-defined-workers.js +27 -0
  128. package/index.js +77 -22
  129. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  130. package/integrations/index.js +12 -10
  131. package/integrations/integration-base.js +296 -54
  132. package/integrations/integration-router.js +381 -182
  133. package/integrations/options.js +1 -1
  134. package/integrations/repositories/integration-mapping-repository-factory.js +50 -0
  135. package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
  136. package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
  137. package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
  138. package/integrations/repositories/integration-mapping-repository.js +156 -0
  139. package/integrations/repositories/integration-repository-factory.js +44 -0
  140. package/integrations/repositories/integration-repository-interface.js +127 -0
  141. package/integrations/repositories/integration-repository-mongo.js +303 -0
  142. package/integrations/repositories/integration-repository-postgres.js +352 -0
  143. package/integrations/repositories/process-repository-factory.js +46 -0
  144. package/integrations/repositories/process-repository-interface.js +90 -0
  145. package/integrations/repositories/process-repository-mongo.js +190 -0
  146. package/integrations/repositories/process-repository-postgres.js +217 -0
  147. package/integrations/tests/doubles/dummy-integration-class.js +83 -0
  148. package/integrations/tests/doubles/test-integration-repository.js +99 -0
  149. package/integrations/use-cases/create-integration.js +83 -0
  150. package/integrations/use-cases/create-process.js +128 -0
  151. package/integrations/use-cases/delete-integration-for-user.js +101 -0
  152. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -0
  153. package/integrations/use-cases/get-integration-for-user.js +78 -0
  154. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  155. package/integrations/use-cases/get-integration-instance.js +83 -0
  156. package/integrations/use-cases/get-integrations-for-user.js +87 -0
  157. package/integrations/use-cases/get-possible-integrations.js +27 -0
  158. package/integrations/use-cases/get-process.js +87 -0
  159. package/integrations/use-cases/index.js +19 -0
  160. package/integrations/use-cases/load-integration-context.js +71 -0
  161. package/integrations/use-cases/update-integration-messages.js +44 -0
  162. package/integrations/use-cases/update-integration-status.js +32 -0
  163. package/integrations/use-cases/update-integration.js +93 -0
  164. package/integrations/use-cases/update-process-metrics.js +201 -0
  165. package/integrations/use-cases/update-process-state.js +119 -0
  166. package/integrations/utils/map-integration-dto.js +36 -0
  167. package/jest-global-setup-noop.js +3 -0
  168. package/jest-global-teardown-noop.js +3 -0
  169. package/logs/logger.js +0 -4
  170. package/{module-plugin → modules}/entity.js +1 -1
  171. package/{module-plugin → modules}/index.js +0 -8
  172. package/modules/module-factory.js +56 -0
  173. package/modules/module.js +221 -0
  174. package/modules/repositories/module-repository-factory.js +33 -0
  175. package/modules/repositories/module-repository-interface.js +129 -0
  176. package/modules/repositories/module-repository-mongo.js +377 -0
  177. package/modules/repositories/module-repository-postgres.js +426 -0
  178. package/modules/repositories/module-repository.js +316 -0
  179. package/{module-plugin → modules}/requester/requester.js +1 -0
  180. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  181. package/{module-plugin → modules}/test/mock-api/definition.js +12 -8
  182. package/modules/tests/doubles/test-module-factory.js +16 -0
  183. package/modules/tests/doubles/test-module-repository.js +39 -0
  184. package/modules/use-cases/get-entities-for-user.js +32 -0
  185. package/modules/use-cases/get-entity-options-by-id.js +59 -0
  186. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  187. package/modules/use-cases/get-module-instance-from-type.js +31 -0
  188. package/modules/use-cases/get-module.js +55 -0
  189. package/modules/use-cases/process-authorization-callback.js +122 -0
  190. package/modules/use-cases/refresh-entity-options.js +59 -0
  191. package/modules/use-cases/test-module-auth.js +55 -0
  192. package/modules/utils/map-module-dto.js +18 -0
  193. package/package.json +82 -50
  194. package/prisma-mongodb/schema.prisma +362 -0
  195. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  196. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  197. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  198. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  199. package/prisma-postgresql/schema.prisma +345 -0
  200. package/queues/queuer-util.js +28 -15
  201. package/syncs/manager.js +468 -443
  202. package/syncs/repositories/sync-repository-factory.js +38 -0
  203. package/syncs/repositories/sync-repository-interface.js +109 -0
  204. package/syncs/repositories/sync-repository-mongo.js +239 -0
  205. package/syncs/repositories/sync-repository-postgres.js +319 -0
  206. package/syncs/sync.js +0 -1
  207. package/token/repositories/token-repository-factory.js +33 -0
  208. package/token/repositories/token-repository-interface.js +131 -0
  209. package/token/repositories/token-repository-mongo.js +212 -0
  210. package/token/repositories/token-repository-postgres.js +257 -0
  211. package/token/repositories/token-repository.js +219 -0
  212. package/types/core/index.d.ts +2 -2
  213. package/types/integrations/index.d.ts +2 -6
  214. package/types/module-plugin/index.d.ts +5 -59
  215. package/types/syncs/index.d.ts +0 -2
  216. package/user/repositories/user-repository-factory.js +46 -0
  217. package/user/repositories/user-repository-interface.js +198 -0
  218. package/user/repositories/user-repository-mongo.js +291 -0
  219. package/user/repositories/user-repository-postgres.js +350 -0
  220. package/user/tests/doubles/test-user-repository.js +72 -0
  221. package/user/use-cases/authenticate-user.js +127 -0
  222. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  223. package/user/use-cases/create-individual-user.js +61 -0
  224. package/user/use-cases/create-organization-user.js +47 -0
  225. package/user/use-cases/create-token-for-user-id.js +30 -0
  226. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  227. package/user/use-cases/get-user-from-bearer-token.js +77 -0
  228. package/user/use-cases/get-user-from-x-frigg-headers.js +106 -0
  229. package/user/use-cases/login-user.js +122 -0
  230. package/user/user.js +93 -0
  231. package/utils/backend-path.js +38 -0
  232. package/utils/index.js +6 -0
  233. package/websocket/repositories/websocket-connection-repository-factory.js +37 -0
  234. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  235. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  236. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  237. package/websocket/repositories/websocket-connection-repository.js +161 -0
  238. package/database/models/State.js +0 -9
  239. package/database/models/Token.js +0 -70
  240. package/database/mongo.js +0 -45
  241. package/encrypt/Cryptor.test.js +0 -32
  242. package/encrypt/encrypt.js +0 -132
  243. package/encrypt/encrypt.test.js +0 -1069
  244. package/errors/base-error.test.js +0 -32
  245. package/errors/fetch-error.test.js +0 -79
  246. package/errors/halt-error.test.js +0 -11
  247. package/errors/validation-errors.test.js +0 -120
  248. package/integrations/create-frigg-backend.js +0 -31
  249. package/integrations/integration-factory.js +0 -251
  250. package/integrations/integration-mapping.js +0 -43
  251. package/integrations/integration-model.js +0 -46
  252. package/integrations/integration-user.js +0 -144
  253. package/integrations/test/integration-base.test.js +0 -144
  254. package/lambda/TimeoutCatcher.test.js +0 -68
  255. package/logs/logger.test.js +0 -76
  256. package/module-plugin/auther.js +0 -393
  257. package/module-plugin/credential.js +0 -22
  258. package/module-plugin/entity-manager.js +0 -70
  259. package/module-plugin/manager.js +0 -169
  260. package/module-plugin/module-factory.js +0 -61
  261. package/module-plugin/requester/requester.test.js +0 -28
  262. package/module-plugin/test/auther.test.js +0 -97
  263. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  264. /package/{module-plugin → modules}/requester/api-key.js +0 -0
  265. /package/{module-plugin → modules}/requester/basic.js +0 -0
  266. /package/{module-plugin → modules}/requester/oauth-2.js +0 -0
  267. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -1,36 +1,41 @@
1
+ /**
2
+ * Cryptor - Encryption Service Adapter
3
+ *
4
+ * Infrastructure Layer adapter for AWS KMS and local AES encryption.
5
+ * Provides envelope encryption pattern for field-level encryption.
6
+ *
7
+ * Envelope Encryption Pattern:
8
+ * 1. Generate Data Encryption Key (DEK) via KMS or locally
9
+ * 2. Encrypt field value with DEK using AES-256-CTR
10
+ * 3. Encrypt DEK with Master Key (KMS CMK or AES_KEY)
11
+ * 4. Return format: "keyId:encryptedText:encryptedKey"
12
+ *
13
+ * Benefits:
14
+ * - Reduces KMS API calls (unique DEK per operation)
15
+ * - Master key never leaves KMS
16
+ * - Enables key rotation without re-encrypting data
17
+ */
18
+
1
19
  const crypto = require('crypto');
2
- const AWS = require('aws-sdk');
3
- const { get, set } = require('lodash');
20
+ const { KMSClient, GenerateDataKeyCommand, DecryptCommand } = require('@aws-sdk/client-kms');
4
21
  const aes = require('./aes');
5
22
 
6
- const hasValue = (a) => a !== undefined && a !== null && a !== '';
7
-
8
23
  class Cryptor {
9
- constructor({ fields, shouldUseAws }) {
24
+ constructor({ shouldUseAws }) {
10
25
  this.shouldUseAws = shouldUseAws;
11
- this.fields = fields;
12
-
13
- this.permutationsByField = {};
14
-
15
- for (const field of fields) {
16
- this.permutationsByField[field] = this.calculatePermutations(
17
- field.split('.')
18
- );
19
- }
20
26
  }
21
27
 
22
28
  async generateDataKey() {
23
29
  if (this.shouldUseAws) {
24
- const kmsClient = new AWS.KMS();
25
- const dataKey = await kmsClient
26
- .generateDataKey({
27
- KeyId: process.env.KMS_KEY_ARN,
28
- KeySpec: 'AES_256',
29
- })
30
- .promise();
30
+ const kmsClient = new KMSClient({});
31
+ const command = new GenerateDataKeyCommand({
32
+ KeyId: process.env.KMS_KEY_ARN,
33
+ KeySpec: 'AES_256',
34
+ });
35
+ const dataKey = await kmsClient.send(command);
31
36
 
32
37
  const keyId = Buffer.from(dataKey.KeyId).toString('base64');
33
- const encryptedKey = dataKey.CiphertextBlob.toString('base64');
38
+ const encryptedKey = Buffer.from(dataKey.CiphertextBlob).toString('base64');
34
39
  const plaintext = dataKey.Plaintext;
35
40
  return { keyId, encryptedKey, plaintext };
36
41
  }
@@ -56,7 +61,7 @@ class Cryptor {
56
61
  const key = availableKeys[keyId];
57
62
 
58
63
  if (!key) {
59
- throw new Error(`No encryption key found with ID "${keyId}"`);
64
+ throw new Error('Encryption key not found');
60
65
  }
61
66
 
62
67
  return key;
@@ -64,13 +69,12 @@ class Cryptor {
64
69
 
65
70
  async decryptDataKey(keyId, encryptedKey) {
66
71
  if (this.shouldUseAws) {
67
- const kmsClient = new AWS.KMS();
68
- const dataKey = await kmsClient
69
- .decrypt({
70
- KeyId: keyId,
71
- CiphertextBlob: encryptedKey,
72
- })
73
- .promise();
72
+ const kmsClient = new KMSClient({});
73
+ const command = new DecryptCommand({
74
+ KeyId: keyId,
75
+ CiphertextBlob: encryptedKey,
76
+ });
77
+ const dataKey = await kmsClient.send(command);
74
78
 
75
79
  return dataKey.Plaintext;
76
80
  }
@@ -79,146 +83,9 @@ class Cryptor {
79
83
  return aes.decrypt(encryptedKey, key);
80
84
  }
81
85
 
82
- // If the field has a value in the document, apply async function f to that field.
83
- async setInDocument(doc, f) {
84
- // Use the Mongoose document get/set when available (not for insertMany)
85
- if (doc.get) {
86
- for (const field of this.fields) {
87
- const value = doc.get(field);
88
- if (hasValue(value)) {
89
- doc.set(field, await f(value));
90
- }
91
- }
92
- return;
93
- }
94
-
95
- // Otherwise use permutations.
96
- for (const field of this.fields) {
97
- const updatedDoc = await this.applyAll(doc, field, f);
98
- Object.assign(doc, updatedDoc);
99
- }
100
- }
101
-
102
- // Calculate all possible permutations for a nested field. For example a
103
- // field "deeply.nested.field" might be referred to in a Mongo query as
104
- // { deeply: { 'nested.field': {} } } or { 'deeply.nested.field': {} }
105
- // etc. For a given path, this gives all path parts to check in a format
106
- // that lodash understands when using get and set with an array of path
107
- // parts e.g. get(o, ['deeply', 'nested.parts'])
108
- calculatePermutations = (parts) => {
109
- if (!parts.length) return [];
110
- if (parts.length === 1) return [parts];
111
-
112
- const combos = [];
113
-
114
- for (let i = 0; i < parts.length; i += 1) {
115
- const frontPath = parts.slice(0, i + 1).join('.');
116
- const rest = parts.slice(i + 1);
117
-
118
- if (rest.length) {
119
- combos.push(
120
- ...this.calculatePermutations(rest).map((child) => [
121
- frontPath,
122
- ...child,
123
- ])
124
- );
125
- } else {
126
- combos.push([frontPath]);
127
- }
128
- }
129
-
130
- return combos;
131
- };
132
-
133
- // Encrypt all possible permutations of a field (possibly nested), if there
134
- // is a value at that path permutation.
135
- async applyAll(o, field, f) {
136
- const clone = { ...o };
137
- const permutations = this.permutationsByField[field];
138
-
139
- for (const path of permutations) {
140
- const value = get(o, path);
141
- if (hasValue(value)) {
142
- set(clone, path, await f(value));
143
- }
144
- }
145
-
146
- return clone;
147
- }
148
-
149
- async processFieldsInDocuments(docs, f) {
150
- const promises = docs
151
- .filter(Boolean)
152
- .flatMap((doc) => this.setInDocument(doc, f));
153
-
154
- return Promise.all(promises);
155
- }
156
-
157
- async encryptFieldsInDocuments(docs) {
158
- await this.processFieldsInDocuments(docs, this.encrypt.bind(this));
159
- }
160
-
161
- async decryptFieldsInDocuments(docs) {
162
- await this.processFieldsInDocuments(docs, this.decrypt.bind(this));
163
- }
164
-
165
- async encryptFieldsInQuery(query) {
166
- for (const field of this.fields) {
167
- const originalUpdate = query.getUpdate();
168
- const updatedUpdate = await this.applyAll(
169
- originalUpdate,
170
- field,
171
- this.encrypt.bind(this)
172
- );
173
-
174
- if (originalUpdate.$set) {
175
- const updatedSetUpdate = await this.applyAll(
176
- originalUpdate.$set,
177
- field,
178
- this.encrypt.bind(this)
179
- );
180
- updatedUpdate.$set = { ...updatedSetUpdate };
181
- }
182
-
183
- if (originalUpdate.$setOnInsert) {
184
- const updatedSetOnInsertUpdate = await this.applyAll(
185
- originalUpdate.$setOnInsert,
186
- field,
187
- this.encrypt.bind(this)
188
- );
189
- updatedUpdate.$setOnInsert = { ...updatedSetOnInsertUpdate };
190
- }
191
-
192
- query.setUpdate(updatedUpdate);
193
- }
194
- }
195
-
196
- expectNotToUpdateManyEncrypted(update) {
197
- for (const field of this.fields) {
198
- if (update.$set && hasValue(update.$set[field])) {
199
- throw new Error(
200
- 'Attempted to update encrypted field of multiple documents'
201
- );
202
- }
203
-
204
- if (update.$setOnInsert && hasValue(update.$setOnInsert[field])) {
205
- throw new Error(
206
- 'Attempted to update encrypted field of multiple documents'
207
- );
208
- }
209
-
210
- if (hasValue(update[field])) {
211
- throw new Error(
212
- 'Attempted to update encrypted field of multiple documents'
213
- );
214
- }
215
- }
216
- }
217
-
218
86
  async encrypt(text) {
219
87
  const { keyId, encryptedKey, plaintext } = await this.generateDataKey();
220
88
  const encryptedText = aes.encrypt(text, plaintext);
221
-
222
89
  return `${keyId}:${encryptedText}:${encryptedKey}`;
223
90
  }
224
91
 
@@ -228,7 +95,6 @@ class Cryptor {
228
95
  const encryptedText = `${split[1]}:${split[2]}`;
229
96
  const encryptedKey = Buffer.from(split[3], 'base64');
230
97
  const plaintext = await this.decryptDataKey(keyId, encryptedKey);
231
-
232
98
  return aes.decrypt(encryptedText, plaintext);
233
99
  }
234
100
  }
package/encrypt/index.js CHANGED
@@ -1,4 +1,3 @@
1
- const { Encrypt } = require('./encrypt');
2
1
  const { Cryptor } = require('./Cryptor');
3
2
 
4
- module.exports = { Encrypt, Cryptor };
3
+ module.exports = { Cryptor };
@@ -1,7 +1,5 @@
1
- const AWS = require('aws-sdk');
2
1
  const { mongoose } = require('../database/mongoose');
3
2
  const crypto = require('crypto');
4
- const { Encrypt } = require('./encrypt');
5
3
 
6
4
  const hexPattern = /^[a-f0-9]+$/i; // match hex strings of length >= 1
7
5
 
@@ -0,0 +1 @@
1
+ export * from "./index"
@@ -0,0 +1,4 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ module.exports = { ...require('.') }
@@ -0,0 +1 @@
1
+ export * from "./index"
@@ -0,0 +1,4 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ module.exports = { ...require('#main-entry-point') }
@@ -0,0 +1 @@
1
+ export * from "./default"