diff --git a/packages/core/package.json b/packages/core/package.json index b9f88f5222a629b2b9eb6954674cea700fa5cfdd..76c7da7850799b938a84d3133729fe1f4dd06e52 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -30,6 +30,7 @@ "wink-nlp": "^1.14.3" }, "devDependencies": { + "@aws-crypto/sha256-js": "^5.2.0", "@types/jest": "^29.5.11", "@types/lodash": "^4.14.202", "@types/node": "^18.19.6", diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index a588c51a5e58a774913fb6e07cc5d807b7768d95..ba47f35818154dfca746d93395def6a02f577c71 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -1,7 +1,6 @@ import _ from "lodash"; -import { createHash } from "node:crypto"; import path from "node:path"; -import { randomUUID } from "./env"; +import { createSHA256, randomUUID } from "./env"; export enum NodeRelationship { SOURCE = "SOURCE", @@ -194,13 +193,13 @@ export class TextNode<T extends Metadata = Metadata> extends BaseNode<T> { * @returns */ generateHash() { - const hashFunction = createHash("sha256"); + const hashFunction = createSHA256(); hashFunction.update(`type=${this.getType()}`); hashFunction.update( `startCharIdx=${this.startCharIdx} endCharIdx=${this.endCharIdx}`, ); hashFunction.update(this.getContent(MetadataMode.ALL)); - return hashFunction.digest("base64"); + return hashFunction.digest(); } getType(): ObjectType { diff --git a/packages/core/src/env/index.edge-light.ts b/packages/core/src/env/index.edge-light.ts index 509d269e82886d40e2fa3ce96517a6a7458ff11a..c880100ab3bc484a4fc5d39d596d7586960ad81b 100644 --- a/packages/core/src/env/index.edge-light.ts +++ b/packages/core/src/env/index.edge-light.ts @@ -1,3 +1,11 @@ +import { Sha256 } from "@aws-crypto/sha256-js"; + +export interface SHA256 { + update(data: string | Uint8Array): void; + // to base64 + digest(): string; +} + export const EOL = "\n"; export function ok(value: unknown, message?: string): asserts value { @@ -9,6 +17,18 @@ export function ok(value: unknown, message?: string): asserts value { } } +export function createSHA256(): SHA256 { + const sha256 = new Sha256(); + return { + update(data: string | Uint8Array): void { + sha256.update(data); + }, + digest() { + return globalThis.btoa(sha256.digestSync().toString()); + }, + }; +} + export function randomUUID(): string { return crypto.randomUUID(); } diff --git a/packages/core/src/env/index.ts b/packages/core/src/env/index.ts index d3759e07bfff0a0fae8ee565fe84b1df245bd057..267e4d23935505758291f9e34c682291efd85a96 100644 --- a/packages/core/src/env/index.ts +++ b/packages/core/src/env/index.ts @@ -1,5 +1,18 @@ import { ok } from "node:assert"; -import { randomUUID } from "node:crypto"; +import { createHash, randomUUID } from "node:crypto"; import { EOL } from "node:os"; +import type { SHA256 } from "./index.edge-light"; + +export function createSHA256(): SHA256 { + const hash = createHash("sha256"); + return { + update(data: string | Uint8Array): void { + hash.update(data); + }, + digest() { + return hash.digest("base64"); + }, + }; +} export { EOL, ok, randomUUID }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 432450928fae5dfe8e69dc7a2d2f43f687589441..699849d9fa4ea9beea0750c17e3eb3f21879d34e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: version: 2.27.1 '@turbo/gen': specifier: ^1.11.2 - version: 1.11.2(@types/node@20.11.5)(typescript@5.3.3) + version: 1.11.2(@types/node@18.19.6)(typescript@5.3.3) '@types/jest': specifier: ^29.5.11 version: 29.5.11 @@ -32,7 +32,7 @@ importers: version: 8.0.3 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5) + version: 29.7.0(@types/node@18.19.6) lint-staged: specifier: ^15.2.0 version: 15.2.0 @@ -225,6 +225,9 @@ importers: specifier: ^1.14.3 version: 1.14.3 devDependencies: + '@aws-crypto/sha256-js': + specifier: ^5.2.0 + version: 5.2.0 '@types/jest': specifier: ^29.5.11 version: 29.5.11 @@ -557,6 +560,31 @@ packages: - encoding dev: false + /@aws-crypto/sha256-js@5.2.0: + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.496.0 + tslib: 2.6.2 + dev: true + + /@aws-crypto/util@5.2.0: + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + dependencies: + '@aws-sdk/types': 3.496.0 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: true + + /@aws-sdk/types@3.496.0: + resolution: {integrity: sha512-umkGadK4QuNQaMoDICMm7NKRI/mYSXiyPjcn3d53BhsuArYU/52CebGQKdt4At7SwwsiVJZw9RNBHyN5Mm0HVw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: true + /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -2846,7 +2874,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.25 + '@types/react': 18.2.48 prop-types: 15.8.1 react: 17.0.2 @@ -4000,6 +4028,36 @@ packages: p-map: 4.0.0 webpack-sources: 3.2.3 + /@smithy/is-array-buffer@2.1.1: + resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@smithy/types@2.9.1: + resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@smithy/util-buffer-from@2.1.1: + resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.1.1 + tslib: 2.6.2 + dev: true + + /@smithy/util-utf8@2.1.1: + resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + dev: true + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.0): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} @@ -4320,7 +4378,7 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@turbo/gen@1.11.2(@types/node@20.11.5)(typescript@5.3.3): + /@turbo/gen@1.11.2(@types/node@18.19.6)(typescript@5.3.3): resolution: {integrity: sha512-zV4vwedEujiAcACPnFXnKat8IqDo0EVJpMbS3W5CiokUBv35vw5PjldjqKcdh0GIiUTlriWGwRU6FZ8pzBg+kg==} hasBin: true dependencies: @@ -4332,7 +4390,7 @@ packages: minimatch: 9.0.3 node-plop: 0.26.3 proxy-agent: 6.3.1 - ts-node: 10.9.2(@types/node@20.11.5)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.6)(typescript@5.3.3) update-check: 1.5.4 validate-npm-package-name: 5.0.0 transitivePeerDependencies: @@ -4618,12 +4676,6 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@20.11.5: - resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} - dependencies: - undici-types: 5.26.5 - dev: true - /@types/node@20.9.0: resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} dependencies: @@ -6778,7 +6830,7 @@ packages: sha.js: 2.4.11 dev: true - /create-jest@29.7.0(@types/node@20.11.5): + /create-jest@29.7.0(@types/node@18.19.6): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6787,7 +6839,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.5) + jest-config: 29.7.0(@types/node@18.19.6) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10366,7 +10418,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.11.5): + /jest-cli@29.7.0(@types/node@18.19.6): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10380,10 +10432,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.5) + create-jest: 29.7.0(@types/node@18.19.6) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.5) + jest-config: 29.7.0(@types/node@18.19.6) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -10434,46 +10486,6 @@ packages: - supports-color dev: true - /jest-config@29.7.0(@types/node@20.11.5): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.23.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.11.5 - babel-jest: 29.7.0(@babel/core@7.23.7) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10763,7 +10775,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@20.11.5): + /jest@29.7.0(@types/node@18.19.6): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10776,7 +10788,7 @@ packages: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.5) + jest-cli: 29.7.0(@types/node@18.19.6) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15478,7 +15490,7 @@ packages: '@babel/core': 7.23.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.5) + jest: 29.7.0(@types/node@18.19.6) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -15519,7 +15531,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.2(@types/node@20.11.5)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@18.19.6)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -15538,7 +15550,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.5 + '@types/node': 18.19.6 acorn: 8.11.3 acorn-walk: 8.3.1 arg: 4.1.3