@bgord/bun 1.4.2 → 1.4.3
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/dist/encryption-bun.adapter.d.ts +4 -2
- package/dist/encryption-bun.adapter.d.ts.map +1 -1
- package/dist/encryption-bun.adapter.js +11 -0
- package/dist/encryption-bun.adapter.js.map +1 -1
- package/dist/encryption-noop.adapter.d.ts +4 -2
- package/dist/encryption-noop.adapter.d.ts.map +1 -1
- package/dist/encryption-noop.adapter.js +3 -0
- package/dist/encryption-noop.adapter.js.map +1 -1
- package/dist/encryption.port.d.ts +1 -0
- package/dist/encryption.port.d.ts.map +1 -1
- package/dist/prerequisites/node.js +1 -1
- package/dist/prerequisites/node.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/encryption-bun.adapter.ts +20 -0
- package/src/encryption-noop.adapter.ts +5 -0
- package/src/encryption.port.ts +1 -0
- package/src/prerequisites/node.ts +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as tools from "@bgord/tools";
|
|
1
2
|
import type { CryptoKeyProviderPort } from "./crypto-key-provider.port";
|
|
2
3
|
import type { EncryptionPort, EncryptionRecipe } from "./encryption.port";
|
|
3
4
|
export declare const EncryptionBunAdapterError: {
|
|
@@ -9,8 +10,9 @@ type Dependencies = {
|
|
|
9
10
|
export declare class EncryptionBunAdapter implements EncryptionPort {
|
|
10
11
|
private readonly deps;
|
|
11
12
|
constructor(deps: Dependencies);
|
|
12
|
-
encrypt(recipe: EncryptionRecipe): Promise<
|
|
13
|
-
decrypt(recipe: EncryptionRecipe): Promise<
|
|
13
|
+
encrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
14
|
+
decrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
15
|
+
view(input: tools.FilePathRelative | tools.FilePathAbsolute): Promise<ArrayBuffer>;
|
|
14
16
|
}
|
|
15
17
|
export {};
|
|
16
18
|
//# sourceMappingURL=encryption-bun.adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption-bun.adapter.d.ts","sourceRoot":"","sources":["../src/encryption-bun.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,yBAAyB;;CAA+D,CAAC;AAEtG,KAAK,YAAY,GAAG;IAAE,iBAAiB,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEjE,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAEzC,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAsBhC,OAAO,CAAC,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"encryption-bun.adapter.d.ts","sourceRoot":"","sources":["../src/encryption-bun.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,yBAAyB;;CAA+D,CAAC;AAEtG,KAAK,YAAY,GAAG;IAAE,iBAAiB,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEjE,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAEzC,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAsBhC,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAuBhC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;CAkBlE"}
|
|
@@ -30,5 +30,16 @@ export class EncryptionBunAdapter {
|
|
|
30
30
|
await Bun.write(recipe.output.get(), new Uint8Array(decrypted));
|
|
31
31
|
return recipe.output;
|
|
32
32
|
}
|
|
33
|
+
async view(input) {
|
|
34
|
+
const key = await this.deps.CryptoKeyProvider.get();
|
|
35
|
+
const bytes = new Uint8Array(await Bun.file(input.get()).arrayBuffer());
|
|
36
|
+
if (bytes.length < EncryptionIV.LENGTH + 1)
|
|
37
|
+
throw new Error(EncryptionBunAdapterError.InvalidPayload);
|
|
38
|
+
const iv = bytes.subarray(0, EncryptionIV.LENGTH);
|
|
39
|
+
const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength);
|
|
40
|
+
const ciphertext = bytes.subarray(EncryptionIV.LENGTH);
|
|
41
|
+
const ciphertextBuffer = ciphertext.buffer.slice(ciphertext.byteOffset, ciphertext.byteOffset + ciphertext.byteLength);
|
|
42
|
+
return crypto.subtle.decrypt({ name: "AES-GCM", iv: ivBuffer }, key, ciphertextBuffer);
|
|
43
|
+
}
|
|
33
44
|
}
|
|
34
45
|
//# sourceMappingURL=encryption-bun.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption-bun.adapter.js","sourceRoot":"","sources":["../src/encryption-bun.adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encryption-bun.adapter.js","sourceRoot":"","sources":["../src/encryption-bun.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type * as tools from "@bgord/tools";
|
|
1
2
|
import type { EncryptionPort, EncryptionRecipe } from "./encryption.port";
|
|
2
3
|
export declare class EncryptionNoopAdapter implements EncryptionPort {
|
|
3
|
-
encrypt(recipe: EncryptionRecipe): Promise<
|
|
4
|
-
decrypt(recipe: EncryptionRecipe): Promise<
|
|
4
|
+
encrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
5
|
+
decrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
6
|
+
view(_input: tools.FilePathRelative | tools.FilePathAbsolute): Promise<ArrayBuffer>;
|
|
5
7
|
}
|
|
6
8
|
//# sourceMappingURL=encryption-noop.adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption-noop.adapter.d.ts","sourceRoot":"","sources":["../src/encryption-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,qBAAa,qBAAsB,YAAW,cAAc;IACpD,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAIhC,OAAO,CAAC,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"encryption-noop.adapter.d.ts","sourceRoot":"","sources":["../src/encryption-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,qBAAa,qBAAsB,YAAW,cAAc;IACpD,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAIhC,OAAO,CAAC,MAAM,EAAE,gBAAgB;IAIhC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;CAGnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption-noop.adapter.js","sourceRoot":"","sources":["../src/encryption-noop.adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encryption-noop.adapter.js","sourceRoot":"","sources":["../src/encryption-noop.adapter.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,OAAO,CAAC,MAAwB;QACpC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAwB;QACpC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAuD;QAChE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -6,5 +6,6 @@ export type EncryptionRecipe = {
|
|
|
6
6
|
export interface EncryptionPort {
|
|
7
7
|
encrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
8
8
|
decrypt(recipe: EncryptionRecipe): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
|
|
9
|
+
view(input: tools.FilePathRelative | tools.FilePathAbsolute): Promise<ArrayBuffer>;
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=encryption.port.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.port.d.ts","sourceRoot":"","sources":["../src/encryption.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CACzD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5F,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"encryption.port.d.ts","sourceRoot":"","sources":["../src/encryption.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CACzD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5F,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5F,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACpF"}
|
|
@@ -17,7 +17,7 @@ export class PrerequisiteNode {
|
|
|
17
17
|
if (!this.enabled)
|
|
18
18
|
return prereqs.Verification.undetermined(stopwatch.stop());
|
|
19
19
|
try {
|
|
20
|
-
const current = tools.PackageVersion.
|
|
20
|
+
const current = tools.PackageVersion.fromVersionString(this.current);
|
|
21
21
|
if (current.isGreaterThanOrEqual(this.version))
|
|
22
22
|
return prereqs.Verification.success(stopwatch.stop());
|
|
23
23
|
return prereqs.Verification.failure(stopwatch.stop(), { message: `Version: ${this.current}` });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/prerequisites/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,MAAM,CAAC;IACd,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEjB,OAAO,CAAuB;IAC9B,OAAO,CAAS;IAEjC,YAAY,MAA2F;QACrG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/prerequisites/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,MAAM,CAAC;IACd,KAAK,CAAgC;IACrC,OAAO,GAAa,IAAI,CAAC;IAEjB,OAAO,CAAuB;IAC9B,OAAO,CAAS;IAEjC,YAAY,MAA2F;QACrG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErE,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACtG,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;gBACpD,OAAO,EAAE,2BAA2B,IAAI,CAAC,OAAO,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|