'use strict' const { Buffer } = require('buffer') || {} const { Encoding } = require('./encoding') const textEndec = require('./text-endec') /** * @template TIn, TOut * @extends {Encoding} */ class BufferFormat extends Encoding { /** * @param {Omit, 'format'>} options */ constructor (options) { super({ ...options, format: 'buffer' }) } /** @override */ createViewTranscoder () { return new ViewFormat({ encode: this.encode, // Buffer is a view (UInt8Array) decode: (data) => this.decode( Buffer.from(data.buffer, data.byteOffset, data.byteLength) ), name: `${this.name}+view` }) } /** @override */ createBufferTranscoder () { return this } } /** * @extends {Encoding} * @template TIn, TOut */ class ViewFormat extends Encoding { /** * @param {Omit, 'format'>} options */ constructor (options) { super({ ...options, format: 'view' }) } /** @override */ createBufferTranscoder () { return new BufferFormat({ encode: (data) => { const view = this.encode(data) return Buffer.from(view.buffer, view.byteOffset, view.byteLength) }, decode: this.decode, // Buffer is a view (UInt8Array) name: `${this.name}+buffer` }) } /** @override */ createViewTranscoder () { return this } } /** * @extends {Encoding} * @template TIn, TOut */ class UTF8Format extends Encoding { /** * @param {Omit, 'format'>} options */ constructor (options) { super({ ...options, format: 'utf8' }) } /** @override */ createBufferTranscoder () { return new BufferFormat({ encode: (data) => Buffer.from(this.encode(data), 'utf8'), decode: (data) => this.decode(data.toString('utf8')), name: `${this.name}+buffer` }) } /** @override */ createViewTranscoder () { const { textEncoder, textDecoder } = textEndec() return new ViewFormat({ encode: (data) => textEncoder.encode(this.encode(data)), decode: (data) => this.decode(textDecoder.decode(data)), name: `${this.name}+view` }) } /** @override */ createUTF8Transcoder () { return this } } exports.BufferFormat = BufferFormat exports.ViewFormat = ViewFormat exports.UTF8Format = UTF8Format /** * @typedef {import('./encoding').IEncoding} IEncoding * @template TIn, TFormat, TOut */