_createTexture( buffers, config = {} ) {

			let worker;
			let taskID;
			const taskConfig = config;
			let taskCost = 0;

			for ( let i = 0; i < buffers.length; i ++ ) {

				taskCost += buffers[ i ].byteLength;

			}

			const texturePending = this._allocateWorker( taskCost ).then( _worker => {

				worker = _worker;
				taskID = this.workerNextTaskID ++;
				return new Promise( ( resolve, reject ) => {

					worker._callbacks[ taskID ] = {
						resolve,
						reject
					};
					worker.postMessage( {
						type: 'transcode',
						id: taskID,
						buffers: buffers,
						taskConfig: taskConfig
					}, buffers );

				} );

			} ).then( message => {

				const {
					mipmaps,
					width,
					height,
					format
				} = message;
				const texture = new THREE.CompressedTexture( mipmaps, width, height, format, THREE.UnsignedByteType );
				texture.minFilter = mipmaps.length === 1 ? THREE.LinearFilter : THREE.LinearMipmapLinearFilter;
				texture.magFilter = THREE.LinearFilter;
				texture.generateMipmaps = false;
				texture.needsUpdate = true;
				return texture;

			} ); // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)


			texturePending.catch( () => true ).then( () => {

				if ( worker && taskID ) {

					worker._taskLoad -= taskCost;
					delete worker._callbacks[ taskID ];

				}

			} ); // Cache the task result.

			_taskCache.set( buffers[ 0 ], {
				promise: texturePending
			} );

			return texturePending;

		}
@param {ArrayBuffer[]} buffers
@param {object?} config
@return {Promise<CompressedTexture>}