Use bufferless transforms

Don't pull the input stream as much while the output stream isn't being
read yet.

This should reduce memory usage somewhat when streaming.
This commit is contained in:
Daniel Huigens 2025-09-01 17:33:54 +02:00 committed by larabr
parent 9764b268b3
commit afa7e083de
No known key found for this signature in database
GPG Key ID: 2A4BEC40729185DD
4 changed files with 17 additions and 15 deletions

9
package-lock.json generated
View File

@ -16,7 +16,7 @@
"@openpgp/jsdoc": "^4.0.4", "@openpgp/jsdoc": "^4.0.4",
"@openpgp/seek-bzip": "^1.0.5-git", "@openpgp/seek-bzip": "^1.0.5-git",
"@openpgp/tweetnacl": "^1.0.4-2", "@openpgp/tweetnacl": "^1.0.4-2",
"@openpgp/web-stream-tools": "~0.2.1", "@openpgp/web-stream-tools": "~0.3.0",
"@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-alias": "^5.1.1",
"@rollup/plugin-commonjs": "^28.0.9", "@rollup/plugin-commonjs": "^28.0.9",
"@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-node-resolve": "^16.0.3",
@ -1429,11 +1429,10 @@
"license": "Unlicense" "license": "Unlicense"
}, },
"node_modules/@openpgp/web-stream-tools": { "node_modules/@openpgp/web-stream-tools": {
"version": "0.2.1", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/@openpgp/web-stream-tools/-/web-stream-tools-0.2.1.tgz", "resolved": "https://registry.npmjs.org/@openpgp/web-stream-tools/-/web-stream-tools-0.3.0.tgz",
"integrity": "sha512-gE6+8mVrpKOa9RurAP+TToUo/DCGLNfpnRiq/YuA5Dq/rUAVSeM6Ejrgl25qpRiOQb/qcGyM25m1l9eE4aPdfw==", "integrity": "sha512-WGCcIti5uAwySkdny5IJ975Vu6fS45LE9Ce3M7vylIWOZwzL4qFUFclskZ6JU7rQ1zgoze6CQ//QKFc/ML2uqw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">= 18.0.0" "node": ">= 18.0.0"
}, },

View File

@ -70,7 +70,7 @@
"@openpgp/jsdoc": "^4.0.4", "@openpgp/jsdoc": "^4.0.4",
"@openpgp/seek-bzip": "^1.0.5-git", "@openpgp/seek-bzip": "^1.0.5-git",
"@openpgp/tweetnacl": "^1.0.4-2", "@openpgp/tweetnacl": "^1.0.4-2",
"@openpgp/web-stream-tools": "~0.2.1", "@openpgp/web-stream-tools": "~0.3.0",
"@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-alias": "^5.1.1",
"@rollup/plugin-commonjs": "^28.0.9", "@rollup/plugin-commonjs": "^28.0.9",
"@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-node-resolve": "^16.0.3",

View File

@ -988,12 +988,12 @@ AkLaG/AkATpuH+DMkYDmKbDLGgD+N4yuxXBJmBfC2IBe4J1S2Gg=
format: 'object' format: 'object'
}); });
await loadStreamsPolyfill(); await loadStreamsPolyfill();
const { signatures: [sigInfo] } = await openpgp.verify({ const { data, signatures: [sigInfo] } = await openpgp.verify({
verificationKeys: expiredKey, verificationKeys: expiredKey,
message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }), message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }),
config: { minRSABits: 1024 } config: { minRSABits: 1024 }
}); });
await stream.readToEnd(data);
await expect(sigInfo.verified).to.be.rejectedWith(/Primary key is expired/); await expect(sigInfo.verified).to.be.rejectedWith(/Primary key is expired/);
}); });
@ -1019,11 +1019,12 @@ aMsUdQBgnPAcSGVsbG8gV29ybGQgOik=
format: 'object' format: 'object'
}); });
await loadStreamsPolyfill(); await loadStreamsPolyfill();
const { signatures: [sigInfo] } = await openpgp.verify({ const { data, signatures: [sigInfo] } = await openpgp.verify({
verificationKeys: expiredKey, verificationKeys: expiredKey,
message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }), message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }),
config: { minRSABits: 1024 } config: { minRSABits: 1024 }
}); });
await stream.readToEnd(data);
await expect(sigInfo.verified).to.be.rejectedWith(/Primary key is expired/); await expect(sigInfo.verified).to.be.rejectedWith(/Primary key is expired/);
}); });
@ -1049,11 +1050,12 @@ eSvSZutLuKKbidSYMLhWROPlwKc2GU2ws6PrLZAyCAel/lU=
format: 'object' format: 'object'
}); });
await loadStreamsPolyfill(); await loadStreamsPolyfill();
const { signatures: [sigInfo] } = await openpgp.verify({ const { data, signatures: [sigInfo] } = await openpgp.verify({
verificationKeys: expiredKey, verificationKeys: expiredKey,
message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }), message: await openpgp.readMessage({ armoredMessage: stream.toStream(armoredMessage) }),
config: { minRSABits: 1024 } config: { minRSABits: 1024 }
}); });
await stream.readToEnd(data);
expect(await sigInfo.verified).to.be.true; expect(await sigInfo.verified).to.be.true;
}); });
@ -1078,11 +1080,12 @@ eSvSZutLuKKbidSYMLhWROPlwKc2GU2ws6PrLZAyCAel/lU=
date: key.keyPacket.created, date: key.keyPacket.created,
format: 'object' format: 'object'
}); });
const { signatures: [sigInfo] } = await openpgp.verify({ const { data, signatures: [sigInfo] } = await openpgp.verify({
verificationKeys: expiredKey, verificationKeys: expiredKey,
message: await openpgp.readMessage({ armoredMessage }), message: await openpgp.readMessage({ armoredMessage }),
config: { minRSABits: 1024 } config: { minRSABits: 1024 }
}); });
await stream.readToEnd(data);
expect(await sigInfo.verified).to.be.true; expect(await sigInfo.verified).to.be.true;
}); });

View File

@ -223,10 +223,10 @@ import {
} catch {} } catch {}
const webTextStream = new WebReadableStream<string>(); const webTextStream = new WebReadableStream<string>();
const messageFromWebTextStream = await createMessage({ text: webTextStream }); const messageFromWebTextStream = await createMessage({ text: webTextStream });
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(await encrypt({ message: messageFromWebTextStream, passwords: 'password', format: 'armored' })) as WebStream<string>;
messageFromWebTextStream.getText() as WebStream<string>; messageFromWebTextStream.getText() as WebStream<string>;
messageFromWebTextStream.getLiteralData() as WebStream<Uint8Array>; messageFromWebTextStream.getLiteralData() as WebStream<Uint8Array>;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(await encrypt({ message: messageFromWebTextStream, passwords: 'password', format: 'armored' })) as WebStream<string>;
// Streaming - encrypt binary message (binary output) // Streaming - encrypt binary message (binary output)
try { try {
@ -237,10 +237,10 @@ import {
} catch {} } catch {}
const webBinaryStream = new WebReadableStream<Uint8Array>(); const webBinaryStream = new WebReadableStream<Uint8Array>();
const messageFromWebBinaryStream = await createMessage({ binary: webBinaryStream }); const messageFromWebBinaryStream = await createMessage({ binary: webBinaryStream });
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(await encrypt({ message: messageFromWebBinaryStream, passwords: 'password', format: 'binary' })) as WebStream<Uint8Array>;
messageFromWebBinaryStream.getText() as WebStream<string>; messageFromWebBinaryStream.getText() as WebStream<string>;
messageFromWebBinaryStream.getLiteralData() as WebStream<Uint8Array>; messageFromWebBinaryStream.getLiteralData() as WebStream<Uint8Array>;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(await encrypt({ message: messageFromWebBinaryStream, passwords: 'password', format: 'binary' })) as WebStream<Uint8Array>;
console.log('TypeScript definitions are correct'); console.log('TypeScript definitions are correct');
})().catch(e => { })().catch(e => {