Source: core/System.js

import { Utils } from '@uino/base-thing';

/**
 * @class System
 * The system.
 * @memberof THING
 */
class System {

	#wasmLoader = null;

	constructor() {
	}

	// #region Private

	// #endregion

	update(deltaTime) {
		if (this.#wasmLoader) {
			this.#wasmLoader.update(deltaTime);
		}
	}

	loadWasmModule(wasmRootPath, workerOptions = {}, callbackOptions = {}) {
		let wasmLoader = this.#wasmLoader;

		// Prevent to call multiple times
		if (wasmLoader) {
			let loadingPromise = wasmLoader.loadingPromise;
			if (loadingPromise.resolved) {
				return Promise.resolve({ module: wasmLoader.module, wasmOptions: wasmLoader.options });
			}
			else {
				return loadingPromise;
			}
		}
		else {
			// Start to load WASM module
			let wasmLoader = Utils.createObject('WasmLoader');
			if (!wasmLoader) {
				return Promise.reject('Create wasm loader failed');
			}

			this.#wasmLoader = wasmLoader;

			return new Promise(async (resolve, reject) => {
				let module = await wasmLoader.init({
					wasmRootPath,
					workerOptions,
					callbackOptions
				});

				let wasmOptions = wasmLoader.options;

				resolve({ module, wasmOptions });
			});
		}
	}

	login(method, url, requestHeaders, postFields) {
		return this.#wasmLoader.resourceDownloader.login(method, url, requestHeaders, postFields).catch(() => {
			Utils.error('Login failed, please check if the url is valid');
		});
	}

	/**
	 * Check whether it's encrypted resource data.
	 * @param {ArrayBuffer} arrayBuffer The resource data
	 * @returns {Boolean}
	 * @example
	 * 	let file = await THING.Utils.loadBinaryFileAsync("./models/theme/frame.js");
	 * 	console.log(file);
	 *  let result = THING.Utils._system.isEncryptedResourceData(file);
	 * 	console.log(result);
	 * @private
	 */
	isEncryptedResourceData(arrayBuffer) {
		let resourceDownloader = this.#wasmLoader.resourceDownloader;

		return resourceDownloader.isEncryptedResourceData(arrayBuffer);
	}

	/**
	 * Decrypt resource.
	 * @param {ArrayBuffer} arrayBuffer The resource data
	 * @returns {Promise<Uint8Array>}
	 * @example
	 * 	let file = await THING.Utils.loadBinaryFileAsync("./models/theme/frame.js");
	 * 	console.log(file);
	 * 	if (THING.Utils._system.isEncryptedResourceData(file)) {
	 * 		let data = await THING.Utils._system.decryptedResource(file);
	 * 		console.log(data);
	 * 	}
	 * @private
	 */
	decryptedResource(arrayBuffer) {
		return new Promise((resolve, reject) => {
			let resourceDownloader = this.#wasmLoader.resourceDownloader;

			let data = resourceDownloader.decryptedResource(arrayBuffer);
			resolve(data);
		});
	}

	get httpRequestHeaders() {
		return this.#wasmLoader.resourceDownloader.httpRequestHeaders;
	}
	set httpRequestHeaders(value) {
		this.#wasmLoader.resourceDownloader.httpRequestHeaders = value;
	}

	get onGetResourceTypeFromUrl() {
		return this.#wasmLoader.resourceDownloader.onGetResourceTypeFromUrl;
	}
	set onGetResourceTypeFromUrl(value) {
		this.#wasmLoader.resourceDownloader.onGetResourceTypeFromUrl = value;
	}

}

export { System }