'use strict' const ModuleError = require('module-error') const formats = new Set(['buffer', 'view', 'utf8']) /** * @template TIn, TFormat, TOut * @abstract */ class Encoding { /** * @param {IEncoding} options */ constructor (options) { /** @type {(data: TIn) => TFormat} */ this.encode = options.encode || this.encode /** @type {(data: TFormat) => TOut} */ this.decode = options.decode || this.decode /** @type {string} */ this.name = options.name || this.name /** @type {string} */ this.format = options.format || this.format if (typeof this.encode !== 'function') { throw new TypeError("The 'encode' property must be a function") } if (typeof this.decode !== 'function') { throw new TypeError("The 'decode' property must be a function") } this.encode = this.encode.bind(this) this.decode = this.decode.bind(this) if (typeof this.name !== 'string' || this.name === '') { throw new TypeError("The 'name' property must be a string") } if (typeof this.format !== 'string' || !formats.has(this.format)) { throw new TypeError("The 'format' property must be one of 'buffer', 'view', 'utf8'") } if (options.createViewTranscoder) { this.createViewTranscoder = options.createViewTranscoder } if (options.createBufferTranscoder) { this.createBufferTranscoder = options.createBufferTranscoder } if (options.createUTF8Transcoder) { this.createUTF8Transcoder = options.createUTF8Transcoder } } get commonName () { return /** @type {string} */ (this.name.split('+')[0]) } /** @return {BufferFormat} */ createBufferTranscoder () { throw new ModuleError(`Encoding '${this.name}' cannot be transcoded to 'buffer'`, { code: 'LEVEL_ENCODING_NOT_SUPPORTED' }) } /** @return {ViewFormat} */ createViewTranscoder () { throw new ModuleError(`Encoding '${this.name}' cannot be transcoded to 'view'`, { code: 'LEVEL_ENCODING_NOT_SUPPORTED' }) } /** @return {UTF8Format} */ createUTF8Transcoder () { throw new ModuleError(`Encoding '${this.name}' cannot be transcoded to 'utf8'`, { code: 'LEVEL_ENCODING_NOT_SUPPORTED' }) } } exports.Encoding = Encoding /** * @typedef {import('./encoding').IEncoding} IEncoding * @template TIn, TFormat, TOut */ /** * @typedef {import('./formats').BufferFormat} BufferFormat * @template TIn, TOut */ /** * @typedef {import('./formats').ViewFormat} ViewFormat * @template TIn, TOut */ /** * @typedef {import('./formats').UTF8Format} UTF8Format * @template TIn, TOut */