@lingbi/studio 0.4.0 → 0.5.0
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/Application.d.ts +69 -21
- package/DownloadSaveSink.d.ts +21 -0
- package/EditedArchiveResourceContext.d.ts +32 -0
- package/ImportPerformanceMode.d.ts +5 -0
- package/ModelDownloadController.d.ts +21 -0
- package/ModelExportContext.d.ts +20 -0
- package/ModelExportContextFactory.d.ts +21 -0
- package/StudioToolbarState.d.ts +20 -0
- package/StudioWorkspace.d.ts +27 -8
- package/archive/ArchiveImportCentralDirectoryValidator.d.ts +21 -0
- package/archive/ArchiveImportChunkAcknowledgement.d.ts +12 -0
- package/archive/ArchiveImportCrc32.d.ts +8 -0
- package/archive/ArchiveImportError.d.ts +9 -0
- package/archive/ArchiveImportFileResult.d.ts +7 -0
- package/archive/ArchiveImportJobRequest.d.ts +4 -0
- package/archive/ArchiveImportJobValidator.d.ts +8 -0
- package/archive/ArchiveImportModelFormat.d.ts +1 -0
- package/archive/ArchiveImportPathValidator.d.ts +22 -0
- package/archive/ArchiveImportResult.d.ts +6 -0
- package/archive/ArchiveImportResultAccumulator.d.ts +17 -0
- package/archive/ArchiveImportRole.d.ts +1 -0
- package/archive/ArchiveImportRoleResult.d.ts +6 -0
- package/archive/ArchiveImportSignatureValidator.d.ts +7 -0
- package/archive/ArchiveImportWorkerClient.d.ts +23 -0
- package/archive/ArchiveImportWorkerClientTask.d.ts +17 -0
- package/archive/ArchiveImportWorkerEndpoint.d.ts +13 -0
- package/archive/ArchiveImportWorkerEntry.d.ts +1 -0
- package/archive/ArchiveImportWorkerFactory.d.ts +4 -0
- package/archive/ArchiveImportWorkerMessage.d.ts +48 -0
- package/archive/ArchiveImportWorkerMessageParser.d.ts +16 -0
- package/archive/ArchiveImportWorkerPort.d.ts +5 -0
- package/archive/ArchiveImportWorkerRuntime.d.ts +47 -0
- package/archive/ArchiveImportWorkerTask.d.ts +38 -0
- package/archive/BrowserArchiveImportWorkerEndpoint.d.ts +15 -0
- package/archive/BrowserArchiveImportWorkerFactory.d.ts +5 -0
- package/archive/BrowserArchiveImportWorkerPort.d.ts +7 -0
- package/assets/ArchiveImportWorkerEntry-Dh4RZo22.js +1548 -0
- package/assets/ManifoldWorkerEntry-BulSBVFW.js +3028 -0
- package/assets/ModelExportWorkerEntry-DwhcdDU3.js +3457 -0
- package/export/BrowserExportWorkerPort.d.ts +7 -0
- package/export/BrowserModelExportWorkerEndpoint.d.ts +15 -0
- package/export/BrowserModelExportWorkerFactory.d.ts +6 -0
- package/export/ByteChunkWriter.d.ts +11 -0
- package/export/ExportChunkAcknowledgement.d.ts +13 -0
- package/export/ExportJobRequest.d.ts +6 -0
- package/export/ExportJobValidator.d.ts +17 -0
- package/export/ExportModelFormat.d.ts +1 -0
- package/export/ExportModelRole.d.ts +1 -0
- package/export/ExportResourceFile.d.ts +6 -0
- package/export/ExportRoleRequest.d.ts +25 -0
- package/export/ExportWorkerMessage.d.ts +41 -0
- package/export/ExportWorkerMessageParser.d.ts +29 -0
- package/export/ExportWorkerPort.d.ts +6 -0
- package/export/ExportWorkerTask.d.ts +15 -0
- package/export/GeneratedMtlWriter.d.ts +10 -0
- package/export/GeneratedObjModelBaker.d.ts +12 -0
- package/export/GeneratedTextChunkWriter.d.ts +10 -0
- package/export/MatrixTransformer.d.ts +21 -0
- package/export/ModelExportError.d.ts +14 -0
- package/export/ModelExportWorkerClient.d.ts +24 -0
- package/export/ModelExportWorkerClientListener.d.ts +5 -0
- package/export/ModelExportWorkerClientTask.d.ts +14 -0
- package/export/ModelExportWorkerEndpoint.d.ts +14 -0
- package/export/ModelExportWorkerEntry.d.ts +1 -0
- package/export/ModelExportWorkerFactory.d.ts +4 -0
- package/export/ModelExportWorkerRuntime.d.ts +47 -0
- package/export/ObjModelBaker.d.ts +27 -0
- package/export/PlyHeaderParser.d.ts +64 -0
- package/export/PlyModelBaker.d.ts +52 -0
- package/index.d.ts +1 -4
- package/index.js +11144 -6143
- package/package.json +1 -1
- package/ObjImportSource.d.ts +0 -7
- package/ObjResourceListSource.d.ts +0 -5
- package/ObjResourceSceneSource.d.ts +0 -14
- package/ObjSceneSource.d.ts +0 -14
package/Application.d.ts
CHANGED
|
@@ -1,39 +1,87 @@
|
|
|
1
|
+
import { ImportPerformanceMode } from './ImportPerformanceMode';
|
|
1
2
|
import type { ModelResourceSceneSource } from './ModelResourceSceneSource';
|
|
2
3
|
import type { ObjImportResult } from './ObjImportResult';
|
|
3
|
-
import type { ObjImportSource } from './ObjImportSource';
|
|
4
|
-
import type { ObjResourceListSource } from './ObjResourceListSource';
|
|
5
|
-
import type { ObjResourceSceneSource } from './ObjResourceSceneSource';
|
|
6
|
-
import type { ObjSceneSource } from './ObjSceneSource';
|
|
7
4
|
export declare class Application {
|
|
5
|
+
private archiveImportController;
|
|
6
|
+
private archiveImporting;
|
|
7
|
+
private booleanEditConfirmationVisible;
|
|
8
8
|
private disposed;
|
|
9
|
-
private
|
|
9
|
+
private downloadController;
|
|
10
|
+
private downloadError;
|
|
11
|
+
private downloadSuccess;
|
|
12
|
+
private downloading;
|
|
13
|
+
private readonly exportContextFactory;
|
|
14
|
+
private exportSceneContext;
|
|
15
|
+
private editedArchiveResourceContext;
|
|
16
|
+
private importGeneration;
|
|
17
|
+
private importPerformanceMode;
|
|
10
18
|
private lastPublishedInset;
|
|
19
|
+
private lastPublishedToolbarBusinessStateKey;
|
|
20
|
+
private lastPublishedToolbarState;
|
|
21
|
+
private latestRendererWorkspaceState;
|
|
22
|
+
private nextArchiveTaskId;
|
|
23
|
+
private nextDownloadTaskId;
|
|
11
24
|
private renderer;
|
|
12
25
|
private workspace;
|
|
13
26
|
mount(container: HTMLElement): void;
|
|
14
|
-
|
|
27
|
+
setImportPerformanceMode(mode: ImportPerformanceMode): void;
|
|
15
28
|
importModelResourceScene(source: ModelResourceSceneSource): Promise<ObjImportResult>;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Imports one ZIP produced by Studio's download command as a preserved-pose
|
|
31
|
+
* stone-and-base scene. The caller chooses this entry explicitly; the
|
|
32
|
+
* archive is never inspected for an implicit baked marker.
|
|
33
|
+
*/
|
|
34
|
+
importEditedModelArchive(file: File): Promise<ObjImportResult>;
|
|
19
35
|
resetView(): void;
|
|
20
36
|
takeScreenshot(): Promise<Blob>;
|
|
21
37
|
dispose(): void;
|
|
22
|
-
private
|
|
23
|
-
private
|
|
24
|
-
private
|
|
38
|
+
private cancelDownload;
|
|
39
|
+
private cancelArchiveImport;
|
|
40
|
+
private completeModelResourceSceneImport;
|
|
41
|
+
private completeEditedArchiveImport;
|
|
42
|
+
private completeEditedArchiveImportFailure;
|
|
43
|
+
private commitExportSceneContext;
|
|
44
|
+
private clearExportSceneContext;
|
|
45
|
+
private createExportJob;
|
|
46
|
+
private createExportJobRequest;
|
|
47
|
+
private createCancelledImportResult;
|
|
48
|
+
private createExportRole;
|
|
49
|
+
private createGeneratedBaseExportRole;
|
|
50
|
+
private getGeneratedMaterialFileName;
|
|
51
|
+
private isModelFile;
|
|
25
52
|
private getRenderer;
|
|
53
|
+
private handleDownloadFailure;
|
|
54
|
+
private handleDownloadSuccess;
|
|
55
|
+
private handleDownloadRequested;
|
|
56
|
+
private handleBooleanRequested;
|
|
57
|
+
private handleModelVisibilityRequested;
|
|
58
|
+
private createExportJobFromCurrentScene;
|
|
59
|
+
private handleDownloadStateChanged;
|
|
60
|
+
private handleEditExited;
|
|
61
|
+
private handleEditRequested;
|
|
62
|
+
private handleBooleanEditConfirmed;
|
|
63
|
+
private handleBooleanEditCancelled;
|
|
64
|
+
private handleRendererWorkspaceStateChanged;
|
|
26
65
|
private hasValidSceneSource;
|
|
27
|
-
private releaseRuntime;
|
|
28
|
-
private mapObjImportResult;
|
|
29
|
-
private mapObjImportSource;
|
|
30
|
-
private mapModelResourceSceneSource;
|
|
31
66
|
private mapModelResourceListSource;
|
|
32
|
-
private
|
|
33
|
-
private
|
|
34
|
-
private
|
|
35
|
-
private mapUpAxis;
|
|
67
|
+
private mapImportPerformanceMode;
|
|
68
|
+
private mapModelResourceSceneSource;
|
|
69
|
+
private mapObjImportResult;
|
|
36
70
|
private mapStoneBasePoseMode;
|
|
37
|
-
private
|
|
71
|
+
private mapUpAxis;
|
|
38
72
|
private mapWarnings;
|
|
73
|
+
private clearBooleanEditConfirmation;
|
|
74
|
+
private publishWorkspaceState;
|
|
75
|
+
private createToolbarBusinessStateKey;
|
|
76
|
+
private isSameToolbarState;
|
|
77
|
+
private isSameModelVisibility;
|
|
78
|
+
private shouldDeferToolbarState;
|
|
79
|
+
private canDownload;
|
|
80
|
+
private isExportReady;
|
|
81
|
+
private assertNotDisposed;
|
|
82
|
+
private releaseRuntime;
|
|
83
|
+
private isCurrentImportGeneration;
|
|
84
|
+
private mapEditedArchiveError;
|
|
85
|
+
private startImportGeneration;
|
|
86
|
+
private invalidateImportGeneration;
|
|
39
87
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser save target for a ZIP stream. Chromium writes directly to the user
|
|
3
|
+
* selected file; other browsers retain chunks only for the final Blob fallback.
|
|
4
|
+
*/
|
|
5
|
+
export declare class DownloadSaveSink {
|
|
6
|
+
private aborted;
|
|
7
|
+
private readonly blobChunks;
|
|
8
|
+
private completed;
|
|
9
|
+
private readonly nativeWritable;
|
|
10
|
+
private constructor();
|
|
11
|
+
static create(): Promise<DownloadSaveSink>;
|
|
12
|
+
get usesNativeStream(): boolean;
|
|
13
|
+
abort(): Promise<void>;
|
|
14
|
+
complete(): Promise<void>;
|
|
15
|
+
write(chunk: Uint8Array): Promise<void>;
|
|
16
|
+
private static createNativeSink;
|
|
17
|
+
private static getBrowserFilePicker;
|
|
18
|
+
private static hasBrowserFilePicker;
|
|
19
|
+
private downloadBlob;
|
|
20
|
+
private revokeObjectUrl;
|
|
21
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ModelUpAxis, StoneBasePoseMode } from '@lingbi/renderer';
|
|
2
|
+
import type { ArchiveImportResult } from './archive/ArchiveImportResult';
|
|
3
|
+
import type { ModelExportSceneCandidate } from './ModelExportContext';
|
|
4
|
+
export interface EditedArchiveRendererResourceFile {
|
|
5
|
+
readonly fetchUrl: string;
|
|
6
|
+
readonly fileName: string;
|
|
7
|
+
}
|
|
8
|
+
interface EditedArchiveRendererResourceList {
|
|
9
|
+
readonly files: readonly EditedArchiveRendererResourceFile[];
|
|
10
|
+
readonly upAxis: ModelUpAxis.Z;
|
|
11
|
+
}
|
|
12
|
+
export interface EditedArchiveRendererSource {
|
|
13
|
+
readonly base: EditedArchiveRendererResourceList;
|
|
14
|
+
readonly poseMode: StoneBasePoseMode.PreservePose;
|
|
15
|
+
readonly stone: EditedArchiveRendererResourceList;
|
|
16
|
+
}
|
|
17
|
+
/** Owns local Blob URLs created from one validated edited-result archive. */
|
|
18
|
+
export declare class EditedArchiveResourceContext {
|
|
19
|
+
readonly candidate: ModelExportSceneCandidate;
|
|
20
|
+
readonly rendererSource: EditedArchiveRendererSource;
|
|
21
|
+
private disposed;
|
|
22
|
+
private readonly objectUrls;
|
|
23
|
+
constructor(result: ArchiveImportResult);
|
|
24
|
+
dispose(): void;
|
|
25
|
+
private createFile;
|
|
26
|
+
private createRoleResources;
|
|
27
|
+
private findRole;
|
|
28
|
+
private getMimeType;
|
|
29
|
+
private getUrl;
|
|
30
|
+
private matchesRole;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ExportJobRequest } from './export/ExportJobRequest';
|
|
2
|
+
/**
|
|
3
|
+
* Owns one browser download lifecycle. It keeps the Worker, native file
|
|
4
|
+
* stream and stale task messages together so Application only manages UI and
|
|
5
|
+
* renderer resource context.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ModelDownloadController {
|
|
8
|
+
private readonly onDownloadFailed;
|
|
9
|
+
private readonly onDownloadSucceeded;
|
|
10
|
+
private readonly onDownloadStateChanged;
|
|
11
|
+
private activeTask;
|
|
12
|
+
private disposed;
|
|
13
|
+
constructor(onDownloadFailed: () => void, onDownloadSucceeded: () => void, onDownloadStateChanged: (downloading: boolean) => void);
|
|
14
|
+
cancel(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
start(createJob: () => ExportJobRequest | undefined): void;
|
|
17
|
+
writeZipChunk(taskId: number, chunk: Uint8Array): Promise<void>;
|
|
18
|
+
private completeTask;
|
|
19
|
+
private run;
|
|
20
|
+
private isCurrentTask;
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type ModelExportFormat = 'obj' | 'ply';
|
|
2
|
+
export type ModelExportRole = 'base' | 'stone';
|
|
3
|
+
export interface ModelExportFile {
|
|
4
|
+
readonly fileName: string;
|
|
5
|
+
readonly isModel: boolean;
|
|
6
|
+
readonly url: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ModelExportRoleContext {
|
|
9
|
+
readonly files: readonly ModelExportFile[];
|
|
10
|
+
readonly format: ModelExportFormat;
|
|
11
|
+
readonly role: ModelExportRole;
|
|
12
|
+
}
|
|
13
|
+
export interface ModelExportSceneCandidate {
|
|
14
|
+
readonly base?: ModelExportRoleContext;
|
|
15
|
+
readonly stone: ModelExportRoleContext;
|
|
16
|
+
}
|
|
17
|
+
/** Resource context committed only after Renderer commits the same scene. */
|
|
18
|
+
export interface ModelExportSceneContext extends ModelExportSceneCandidate {
|
|
19
|
+
readonly revision: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ModelExportSceneCandidate, ModelExportSceneContext } from './ModelExportContext';
|
|
2
|
+
import type { ModelResourceListSource } from './ModelResourceListSource';
|
|
3
|
+
interface ModelExportSceneSource {
|
|
4
|
+
readonly base?: ModelResourceListSource;
|
|
5
|
+
readonly stone?: ModelResourceListSource;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Copies and validates the caller-owned resource list before it enters the
|
|
9
|
+
* Renderer. It retains only data Studio needs for a later download.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ModelExportContextFactory {
|
|
12
|
+
commit(candidate: ModelExportSceneCandidate, revision: number): ModelExportSceneContext | undefined;
|
|
13
|
+
create(source: ModelExportSceneSource): ModelExportSceneCandidate | undefined;
|
|
14
|
+
private createFile;
|
|
15
|
+
private createRoleContext;
|
|
16
|
+
private getFileName;
|
|
17
|
+
private getModelFormat;
|
|
18
|
+
private parseResourceUrl;
|
|
19
|
+
private isStringArray;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Studio-owned state projected onto the bottom toolbar. */
|
|
2
|
+
export interface StudioToolbarState {
|
|
3
|
+
readonly booleanEnabled?: boolean;
|
|
4
|
+
readonly booleanInProgress?: boolean;
|
|
5
|
+
readonly booleanReediting?: boolean;
|
|
6
|
+
readonly booleanResultInvalidated?: boolean;
|
|
7
|
+
readonly booleanEditConfirmationVisible?: boolean;
|
|
8
|
+
readonly downloadEnabled: boolean;
|
|
9
|
+
readonly downloadError?: string;
|
|
10
|
+
readonly downloadInProgress?: boolean;
|
|
11
|
+
readonly downloadSuccess?: string;
|
|
12
|
+
readonly editActive: boolean;
|
|
13
|
+
readonly editEnabled: boolean;
|
|
14
|
+
readonly editVisible: boolean;
|
|
15
|
+
readonly modelVisibility?: {
|
|
16
|
+
readonly baseVisible: boolean;
|
|
17
|
+
readonly enabled: boolean;
|
|
18
|
+
readonly stoneVisible: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
package/StudioWorkspace.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { StudioToolbarState } from './StudioToolbarState';
|
|
2
|
+
type StudioModelRole = 'base' | 'stone';
|
|
1
3
|
/**
|
|
2
4
|
* Studio-owned chrome around the render canvas: the viewport, the bottom
|
|
3
5
|
* toolbar with its edit control, and the floating edit-status bubble that
|
|
@@ -6,21 +8,38 @@
|
|
|
6
8
|
*/
|
|
7
9
|
export declare class StudioWorkspace {
|
|
8
10
|
readonly canvas: HTMLCanvasElement;
|
|
9
|
-
private static readonly
|
|
11
|
+
private static readonly SVG_NAMESPACE;
|
|
12
|
+
private static readonly BOTTOM_TOOLBAR_BOTTOM_OFFSET;
|
|
13
|
+
private static readonly BOTTOM_TOOLBAR_HEIGHT;
|
|
14
|
+
private static readonly BOTTOM_TOOLBAR_VIEWPORT_GAP;
|
|
15
|
+
private static readonly BOTTOM_TOOLBAR_VIEWPORT_BOTTOM_INSET;
|
|
16
|
+
private readonly booleanButtonElement;
|
|
17
|
+
private readonly booleanOperationOverlayElement;
|
|
18
|
+
private readonly booleanOperationStatusElement;
|
|
19
|
+
private readonly booleanEditConfirmationElement;
|
|
10
20
|
private readonly bottomToolbarElement;
|
|
21
|
+
private readonly downloadButtonElement;
|
|
22
|
+
private readonly downloadStatusElement;
|
|
23
|
+
private readonly downloadSuccessElement;
|
|
11
24
|
private readonly editButtonElement;
|
|
12
25
|
private readonly editStatusElement;
|
|
26
|
+
private readonly modelButtonElement;
|
|
27
|
+
private readonly modelVisibilityElement;
|
|
28
|
+
private readonly stoneVisibilityButtonElement;
|
|
29
|
+
private readonly baseVisibilityButtonElement;
|
|
13
30
|
private readonly listenerAbortController;
|
|
14
31
|
private readonly rootElement;
|
|
15
32
|
private readonly styleElement;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* it; editing floats a hint bubble with a dedicated exit above it.
|
|
21
|
-
*/
|
|
22
|
-
setEditButtonState(visible: boolean, enabled: boolean, active: boolean): void;
|
|
33
|
+
private modelPanelVisible;
|
|
34
|
+
constructor(container: HTMLElement, onEditRequested: () => void, onEditExited: () => void, onDownloadRequested: () => void, onBooleanRequested?: () => void, onBooleanEditConfirmed?: () => void, onBooleanEditCancelled?: () => void, onModelVisibilityRequested?: (role: StudioModelRole, visible: boolean) => void);
|
|
35
|
+
/** Applies Application's combined renderer and download state. */
|
|
36
|
+
setToolbarState(state: StudioToolbarState): void;
|
|
23
37
|
getViewportBottomInset(): number;
|
|
24
38
|
dispose(): void;
|
|
25
39
|
private wrapClick;
|
|
40
|
+
private toggleModelVisibilityPanel;
|
|
41
|
+
private wrapModelVisibilityClick;
|
|
42
|
+
private updateModelVisibilityButton;
|
|
43
|
+
private createVisibilityIcon;
|
|
26
44
|
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ArchiveImportChecksumEntry {
|
|
2
|
+
readonly byteLength: number;
|
|
3
|
+
readonly crc32: number;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
}
|
|
6
|
+
/** Checks central-directory sizes and CRC values without buffering model data. */
|
|
7
|
+
export declare class ArchiveImportCentralDirectoryValidator {
|
|
8
|
+
private readonly pathValidator;
|
|
9
|
+
validate(file: File, entries: readonly ArchiveImportChecksumEntry[], signal?: AbortSignal): Promise<void>;
|
|
10
|
+
private decodeName;
|
|
11
|
+
private findEndRecord;
|
|
12
|
+
private invalidArchive;
|
|
13
|
+
private parseCentralRecord;
|
|
14
|
+
private readCentralDirectory;
|
|
15
|
+
private readEndRecord;
|
|
16
|
+
private validatePath;
|
|
17
|
+
private validateRecords;
|
|
18
|
+
private readUint16;
|
|
19
|
+
private readUint32;
|
|
20
|
+
private throwIfAborted;
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class ArchiveImportChunkAcknowledgement {
|
|
2
|
+
readonly chunkId: number;
|
|
3
|
+
readonly promise: Promise<void>;
|
|
4
|
+
readonly taskId: number;
|
|
5
|
+
private rejectPromise;
|
|
6
|
+
private resolvePromise;
|
|
7
|
+
private settled;
|
|
8
|
+
constructor(taskId: number, chunkId: number);
|
|
9
|
+
acknowledge(): void;
|
|
10
|
+
cancel(): void;
|
|
11
|
+
private initializePromise;
|
|
12
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare enum ArchiveImportErrorCode {
|
|
2
|
+
Cancelled = "cancelled",
|
|
3
|
+
InvalidSource = "invalid-source",
|
|
4
|
+
Protocol = "protocol"
|
|
5
|
+
}
|
|
6
|
+
export declare class ArchiveImportError extends Error {
|
|
7
|
+
readonly code: ArchiveImportErrorCode;
|
|
8
|
+
constructor(code: ArchiveImportErrorCode, message: string);
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ArchiveImportModelFormat } from './ArchiveImportModelFormat';
|
|
2
|
+
export interface ArchiveImportFileResult {
|
|
3
|
+
readonly chunks: readonly Uint8Array<ArrayBuffer>[];
|
|
4
|
+
readonly fileName: string;
|
|
5
|
+
readonly format?: ArchiveImportModelFormat;
|
|
6
|
+
readonly isModel: boolean;
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ArchiveImportJobRequest } from './ArchiveImportJobRequest';
|
|
2
|
+
/** Validates the small structured-clone request before a Worker task starts. */
|
|
3
|
+
export declare class ArchiveImportJobValidator {
|
|
4
|
+
validate(job: ArchiveImportJobRequest): void;
|
|
5
|
+
private isReadableFile;
|
|
6
|
+
private getRecord;
|
|
7
|
+
private isRecord;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type ArchiveImportModelFormat = 'obj' | 'ply';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ArchiveImportModelFormat } from './ArchiveImportModelFormat';
|
|
2
|
+
import type { ArchiveImportRole } from './ArchiveImportRole';
|
|
3
|
+
export type ArchiveImportPath = {
|
|
4
|
+
readonly kind: 'directory';
|
|
5
|
+
readonly role: ArchiveImportRole;
|
|
6
|
+
} | {
|
|
7
|
+
readonly fileName: string;
|
|
8
|
+
readonly format?: ArchiveImportModelFormat;
|
|
9
|
+
readonly isModel: boolean;
|
|
10
|
+
readonly kind: 'file';
|
|
11
|
+
readonly role: ArchiveImportRole;
|
|
12
|
+
};
|
|
13
|
+
/** Enforces the two-level stone/base archive contract. */
|
|
14
|
+
export declare class ArchiveImportPathValidator {
|
|
15
|
+
parse(path: string): ArchiveImportPath;
|
|
16
|
+
private getModelFormat;
|
|
17
|
+
private hasControlCharacter;
|
|
18
|
+
private invalidPath;
|
|
19
|
+
private isDrivePath;
|
|
20
|
+
private parseDirectory;
|
|
21
|
+
private parseRole;
|
|
22
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ArchiveImportRoleResult } from './ArchiveImportRoleResult';
|
|
2
|
+
export interface ArchiveImportResult {
|
|
3
|
+
readonly roles: readonly ArchiveImportRoleResult[];
|
|
4
|
+
}
|
|
5
|
+
export type { ArchiveImportFileResult } from './ArchiveImportFileResult';
|
|
6
|
+
export type { ArchiveImportRoleResult } from './ArchiveImportRoleResult';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ArchiveImportResult } from './ArchiveImportResult';
|
|
2
|
+
import type { ArchiveImportEntryChunkMessage, ArchiveImportEntryStartMessage } from './ArchiveImportWorkerMessage';
|
|
3
|
+
/** Reassembles ordered Worker entry chunks and performs a second protocol check. */
|
|
4
|
+
export declare class ArchiveImportResultAccumulator {
|
|
5
|
+
private activeEntry;
|
|
6
|
+
private readonly entries;
|
|
7
|
+
private lastChunkId;
|
|
8
|
+
private lastEntryId;
|
|
9
|
+
private lastRoleIndex;
|
|
10
|
+
acceptChunk(message: ArchiveImportEntryChunkMessage): void;
|
|
11
|
+
complete(): ArchiveImportResult;
|
|
12
|
+
startEntry(message: ArchiveImportEntryStartMessage): void;
|
|
13
|
+
private createFileResult;
|
|
14
|
+
private createRoleResults;
|
|
15
|
+
private protocolError;
|
|
16
|
+
private hasControlCharacter;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type ArchiveImportRole = 'base' | 'stone';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ArchiveImportFileResult } from './ArchiveImportFileResult';
|
|
2
|
+
import type { ArchiveImportRole } from './ArchiveImportRole';
|
|
3
|
+
export interface ArchiveImportRoleResult {
|
|
4
|
+
readonly files: readonly ArchiveImportFileResult[];
|
|
5
|
+
readonly role: ArchiveImportRole;
|
|
6
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ArchiveImportJobRequest } from './ArchiveImportJobRequest';
|
|
2
|
+
import type { ArchiveImportResult } from './ArchiveImportResult';
|
|
3
|
+
import type { ArchiveImportWorkerEndpointErrorListener, ArchiveImportWorkerEndpointMessageListener } from './ArchiveImportWorkerEndpoint';
|
|
4
|
+
import type { ArchiveImportWorkerFactory } from './ArchiveImportWorkerFactory';
|
|
5
|
+
/** Main-thread side of the archive import protocol and chunk accumulator. */
|
|
6
|
+
export declare class ArchiveImportWorkerClient implements ArchiveImportWorkerEndpointErrorListener, ArchiveImportWorkerEndpointMessageListener {
|
|
7
|
+
private activeTask;
|
|
8
|
+
private disposed;
|
|
9
|
+
private readonly jobValidator;
|
|
10
|
+
private lastStartedTaskId;
|
|
11
|
+
private readonly messageParser;
|
|
12
|
+
private readonly workerFactory;
|
|
13
|
+
constructor(workerFactory?: ArchiveImportWorkerFactory);
|
|
14
|
+
cancel(taskId?: number): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
handleWorkerEndpointError(message: string): void;
|
|
17
|
+
handleWorkerEndpointMessage(message: unknown): void;
|
|
18
|
+
start(job: ArchiveImportJobRequest): Promise<ArchiveImportResult>;
|
|
19
|
+
private acceptChunk;
|
|
20
|
+
private rejectTask;
|
|
21
|
+
private resolveTask;
|
|
22
|
+
private toError;
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ArchiveImportResult } from './ArchiveImportResult';
|
|
2
|
+
import { ArchiveImportResultAccumulator } from './ArchiveImportResultAccumulator';
|
|
3
|
+
import type { ArchiveImportWorkerEndpoint } from './ArchiveImportWorkerEndpoint';
|
|
4
|
+
/** Completion state for one archive import Worker task. */
|
|
5
|
+
export declare class ArchiveImportWorkerClientTask {
|
|
6
|
+
readonly accumulator: ArchiveImportResultAccumulator;
|
|
7
|
+
readonly completion: Promise<ArchiveImportResult>;
|
|
8
|
+
readonly endpoint: ArchiveImportWorkerEndpoint;
|
|
9
|
+
readonly taskId: number;
|
|
10
|
+
private rejectCompletion;
|
|
11
|
+
private resolveCompletion;
|
|
12
|
+
private settled;
|
|
13
|
+
constructor(taskId: number, endpoint: ArchiveImportWorkerEndpoint);
|
|
14
|
+
reject(reason: unknown): void;
|
|
15
|
+
resolve(result: ArchiveImportResult): void;
|
|
16
|
+
private initializeCompletion;
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ArchiveImportInboundMessage } from './ArchiveImportWorkerMessage';
|
|
2
|
+
export interface ArchiveImportWorkerEndpointErrorListener {
|
|
3
|
+
handleWorkerEndpointError(message: string): void;
|
|
4
|
+
}
|
|
5
|
+
export interface ArchiveImportWorkerEndpointMessageListener {
|
|
6
|
+
handleWorkerEndpointMessage(message: unknown): void;
|
|
7
|
+
}
|
|
8
|
+
export interface ArchiveImportWorkerEndpoint {
|
|
9
|
+
postMessage(message: ArchiveImportInboundMessage): void;
|
|
10
|
+
setErrorListener(listener: ArchiveImportWorkerEndpointErrorListener): void;
|
|
11
|
+
setMessageListener(listener: ArchiveImportWorkerEndpointMessageListener): void;
|
|
12
|
+
terminate(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ArchiveImportModelFormat } from './ArchiveImportModelFormat';
|
|
2
|
+
import type { ArchiveImportRole } from './ArchiveImportRole';
|
|
3
|
+
export interface ArchiveImportStartMessage {
|
|
4
|
+
readonly file: File;
|
|
5
|
+
readonly taskId: number;
|
|
6
|
+
readonly type: 'start';
|
|
7
|
+
}
|
|
8
|
+
export interface ArchiveImportAcknowledgeChunkMessage {
|
|
9
|
+
readonly chunkId: number;
|
|
10
|
+
readonly taskId: number;
|
|
11
|
+
readonly type: 'acknowledge-chunk';
|
|
12
|
+
}
|
|
13
|
+
export interface ArchiveImportCancelMessage {
|
|
14
|
+
readonly taskId: number;
|
|
15
|
+
readonly type: 'cancel';
|
|
16
|
+
}
|
|
17
|
+
export type ArchiveImportInboundMessage = ArchiveImportAcknowledgeChunkMessage | ArchiveImportCancelMessage | ArchiveImportStartMessage;
|
|
18
|
+
export interface ArchiveImportEntryStartMessage {
|
|
19
|
+
readonly entryId: number;
|
|
20
|
+
readonly fileName: string;
|
|
21
|
+
readonly format?: ArchiveImportModelFormat;
|
|
22
|
+
readonly isModel: boolean;
|
|
23
|
+
readonly role: ArchiveImportRole;
|
|
24
|
+
readonly taskId: number;
|
|
25
|
+
readonly type: 'entry-start';
|
|
26
|
+
}
|
|
27
|
+
export interface ArchiveImportEntryChunkMessage {
|
|
28
|
+
readonly chunk: ArrayBuffer;
|
|
29
|
+
readonly chunkId: number;
|
|
30
|
+
readonly entryId: number;
|
|
31
|
+
readonly final: boolean;
|
|
32
|
+
readonly taskId: number;
|
|
33
|
+
readonly type: 'entry-chunk';
|
|
34
|
+
}
|
|
35
|
+
export interface ArchiveImportCancelledMessage {
|
|
36
|
+
readonly taskId: number;
|
|
37
|
+
readonly type: 'cancelled';
|
|
38
|
+
}
|
|
39
|
+
export interface ArchiveImportCompleteMessage {
|
|
40
|
+
readonly taskId: number;
|
|
41
|
+
readonly type: 'complete';
|
|
42
|
+
}
|
|
43
|
+
export interface ArchiveImportErrorMessage {
|
|
44
|
+
readonly message: string;
|
|
45
|
+
readonly taskId: number;
|
|
46
|
+
readonly type: 'error';
|
|
47
|
+
}
|
|
48
|
+
export type ArchiveImportOutboundMessage = ArchiveImportCancelledMessage | ArchiveImportCompleteMessage | ArchiveImportEntryChunkMessage | ArchiveImportEntryStartMessage | ArchiveImportErrorMessage;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ArchiveImportInboundMessage, ArchiveImportOutboundMessage } from './ArchiveImportWorkerMessage';
|
|
2
|
+
/** Narrows structured-clone data at the archive Worker boundary. */
|
|
3
|
+
export declare class ArchiveImportWorkerMessageParser {
|
|
4
|
+
parseInbound(value: unknown): ArchiveImportInboundMessage | undefined;
|
|
5
|
+
parseOutbound(value: unknown): ArchiveImportOutboundMessage | undefined;
|
|
6
|
+
private getRecord;
|
|
7
|
+
private isFileLike;
|
|
8
|
+
private isFormat;
|
|
9
|
+
private isPositiveSafeInteger;
|
|
10
|
+
private isRecord;
|
|
11
|
+
private parseAcknowledgement;
|
|
12
|
+
private parseCancellation;
|
|
13
|
+
private parseEntryChunk;
|
|
14
|
+
private parseEntryStart;
|
|
15
|
+
private parseStart;
|
|
16
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ArchiveImportOutboundMessage } from './ArchiveImportWorkerMessage';
|
|
2
|
+
export interface ArchiveImportWorkerPort {
|
|
3
|
+
addEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;
|
|
4
|
+
postMessage(message: ArchiveImportOutboundMessage, transfer?: readonly Transferable[]): void;
|
|
5
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ArchiveImportWorkerPort } from './ArchiveImportWorkerPort';
|
|
2
|
+
/** Streams a ZIP file through fflate and returns validated role files by chunk. */
|
|
3
|
+
export declare class ArchiveImportWorkerRuntime {
|
|
4
|
+
private readonly inputChunkSize;
|
|
5
|
+
private activeTask;
|
|
6
|
+
private readonly jobValidator;
|
|
7
|
+
private latestStartedTaskId;
|
|
8
|
+
private readonly centralDirectoryValidator;
|
|
9
|
+
private readonly messageParser;
|
|
10
|
+
private readonly pathValidator;
|
|
11
|
+
private readonly port;
|
|
12
|
+
constructor(port: ArchiveImportWorkerPort);
|
|
13
|
+
attach(): void;
|
|
14
|
+
private acknowledgeChunk;
|
|
15
|
+
private cancelTask;
|
|
16
|
+
private copyChunk;
|
|
17
|
+
private createUnzip;
|
|
18
|
+
private drainMessages;
|
|
19
|
+
private handleArchiveStream;
|
|
20
|
+
private handleDirectoryData;
|
|
21
|
+
private handleEntryData;
|
|
22
|
+
private handleFile;
|
|
23
|
+
private handleInboundMessage;
|
|
24
|
+
private handleCancellation;
|
|
25
|
+
private handleChunkAcknowledgement;
|
|
26
|
+
private handleDirectory;
|
|
27
|
+
private handleMessage;
|
|
28
|
+
private handleStart;
|
|
29
|
+
private isCurrentTask;
|
|
30
|
+
private postCancelled;
|
|
31
|
+
private postComplete;
|
|
32
|
+
private postError;
|
|
33
|
+
private processInputChunk;
|
|
34
|
+
private pushToUnzip;
|
|
35
|
+
private queueEntryChunk;
|
|
36
|
+
private queueEntryStart;
|
|
37
|
+
private registerEntry;
|
|
38
|
+
private runTask;
|
|
39
|
+
private sendQueuedMessage;
|
|
40
|
+
private throwIfCancelled;
|
|
41
|
+
private assertRoleOrder;
|
|
42
|
+
private validateArchive;
|
|
43
|
+
private validateChecksums;
|
|
44
|
+
private cancelReader;
|
|
45
|
+
private getErrorMessage;
|
|
46
|
+
private isCancelledError;
|
|
47
|
+
}
|