feat: open multi-part packages in browser

This commit is contained in:
2026-07-22 19:46:17 +02:00
parent 2c998952e5
commit 3b1777a5b3
11 changed files with 428 additions and 64 deletions

View File

@@ -4,6 +4,7 @@ import type {
ParseWorkerResponse,
ResourceWorkerResponse,
WorkerRequest,
WorkerCabinetPart,
WorkerFailure,
WorkerResponse,
} from './worker-protocol.js';
@@ -68,7 +69,8 @@ export class OneNoteWorkerClient {
parseSource(
kind: SourceKind,
fileName: string,
bytes: ArrayBuffer
bytes: ArrayBuffer,
cabinetParts: readonly WorkerCabinetPart[] = []
): Promise<ParseWorkerResponse> {
if (this.terminated) {
return Promise.reject(
@@ -78,6 +80,14 @@ export class OneNoteWorkerClient {
)
);
}
if (kind === 'one' && cabinetParts.length > 0) {
return Promise.reject(
new WorkerClientError(
'invalid-format',
'CAB companions can only be supplied with a .onepkg source.'
)
);
}
const requestId = `parse-${++this.requestSequence}`;
const request: ParseWorkerRequest = {
@@ -85,6 +95,9 @@ export class OneNoteWorkerClient {
requestId,
fileName,
bytes,
...(kind === 'onepkg' && cabinetParts.length > 0
? { cabinetParts: [...cabinetParts] }
: {}),
};
return new Promise((resolve, reject) => {
@@ -92,7 +105,10 @@ export class OneNoteWorkerClient {
resolve: (response) => resolve(response as ParseWorkerResponse),
reject,
});
this.worker.postMessage(request, [bytes]);
this.worker.postMessage(request, [
bytes,
...cabinetParts.map((part) => part.bytes),
]);
});
}