From 3fcfeb9b99a11b8d02ea4af84f6b0e82438cadde Mon Sep 17 00:00:00 2001 From: ICheered Date: Sat, 5 Aug 2023 15:19:17 +0200 Subject: [PATCH] Create types.d.ts for camera type definition --- package.json | 2 +- src/camera.js | 56 +------------------------------------------------- src/types.d.ts | 25 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 56 deletions(-) create mode 100644 src/types.d.ts diff --git a/package.json b/package.json index b76f041..f8c5306 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "WebAssembly implementation of gphoto2 and libusb to control DSLR cameras over USB on the Web", "type": "module", "main": "src/camera.js", - "types": "src/libapi.mjs.d.ts", + "types": "src/types.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/src/camera.js b/src/camera.js index 90500a7..a7097d8 100644 --- a/src/camera.js +++ b/src/camera.js @@ -16,11 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -/** - * @typedef {import('./libapi.mjs').Config} Config - * @typedef {import('./libapi.mjs').SupportedOps} SupportedOps - * @typedef {import('./libapi.mjs').Context} Context - */ import initModule from "../build/libapi.mjs"; export function rethrowIfCritical(err) { @@ -36,21 +31,13 @@ const INTERFACE_SUBCLASS = 1; // MTP let ModulePromise = null; -/** - * This class provides methods for interacting with the camera. - */ class Camera { constructor() { - /** @type {Promise} */ this.queue = Promise.resolve(); this.Module = null; this.context = null; } - /** - * This method shows the camera picker. - * @returns {Promise} - */ async showCameraPicker() { // @ts-ignore await navigator.usb.requestDevice({ @@ -63,10 +50,6 @@ class Camera { }); } - /** - * This method connects to the camera. - * @returns {Promise} - */ async connect() { if (!ModulePromise) { ModulePromise = initModule() @@ -75,41 +58,22 @@ class Camera { this.context = await new this.Module.Context(); } - /** - * This method schedules an exclusive async operation on the global context. - * @template T - * @param {(ctx: Context) => Promise} op - * @returns {Promise} - * @private - */ async schedule(op) { let res = this.queue.then(() => op(this.context)); this.queue = res.catch(rethrowIfCritical); return res; } - /** - * This method disconnects from the camera. - * @returns {Promise} - */ async disconnect() { if (!this.context.isDeleted()) { this.context.delete(); } } - /** - * This method gets the camera configuration. - * @returns {Promise} - */ async getConfig() { return this.schedule((context) => context.configToJS()); } - /** - * This method gets the supported operations of the camera. - * @returns {Promise} - */ async getSupportedOps() { if (this.context) { return await this.context.supportedOps(); @@ -117,12 +81,6 @@ class Camera { throw new Error("You need to connect to the camera first"); } - /** - * This method sets a configuration value on the camera. - * @param {string} name - * @param {number | string | boolean} value - * @returns {Promise} - */ async setConfigValue(name, value) { const uiTimeout = new Promise((resolve) => setTimeout(resolve, 800)); const setResult = this.schedule((context) => @@ -131,29 +89,17 @@ class Camera { return Promise.all([setResult, uiTimeout]); } - /** - * This method captures a preview as a Blob. - * @returns {Promise} - */ async capturePreviewAsBlob() { return this.schedule((context) => context.capturePreviewAsBlob()); } - /** - * This method captures an image as a File. - * @returns {Promise} - */ async captureImageAsFile() { return this.schedule((context) => context.captureImageAsFile()); } - /** - * This method consumes camera events. - * @returns {Promise} - */ async consumeEvents() { return this.schedule((context) => context.consumeEvents()); } } -export default Camera; +export { Camera }; diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 0000000..6dc706e --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1,25 @@ +// Import types Context and SupportedOps ./libapi.mjs.d.ts +import type { Config, Context, SupportedOps } from './libapi.mjs.d.ts'; + +export declare class Camera { + constructor(); + + showCameraPicker(): Promise; + connect(): Promise; + disconnect(): Promise; + + getConfig(): Promise; + + getSupportedOps(): SupportedOps; + + setConfigValue(name: string, value: number | string | boolean): Promise; + + capturePreviewAsBlob(): Promise; + captureImageAsFile(): Promise; + consumeEvents(): Promise; + + private rethrowIfCritical(err: any): void; // any error type can be replaced by more specific if available + private schedule(op: (ctx: any) => Promise): Promise; // ctx and T types can be replaced by more specific if available +} + +export type { Config, Context, SupportedOps };