UNPKG

@ldapjs/controls

Version:
104 lines (88 loc) 2.52 kB
'use strict' const { Ber, BerReader, BerWriter } = require('@ldapjs/asn1') const isObject = require('../is-object') const hasOwn = require('../has-own') const Control = require('../control') /** * @typedef {object} PagedResultsControlValue * @property {number} size The requested page size from a client, or the result * set size estimate from the server. * @property {Buffer} cookie Identifier for the result set. */ /** * Implements: * https://datatracker.ietf.org/doc/html/rfc2696#section-2 * * @extends Control */ class PagedResultsControl extends Control { static OID = '1.2.840.113556.1.4.319' /** * @typedef {ControlParams} PagedResultsParams * @property {PagedResultsControlValue | Buffer} [value] */ /** * Creates a new paged results control. * * @param {PagedResultsParams} [options] */ constructor (options = {}) { options.type = PagedResultsControl.OID super(options) this._value = { size: 0, cookie: Buffer.alloc(0) } if (hasOwn(options, 'value') === false) { return } if (Buffer.isBuffer(options.value)) { this.#parse(options.value) } else if (isObject(options.value)) { this.value = options.value } else { throw new TypeError('options.value must be a Buffer or Object') } } get value () { return this._value } set value (obj) { this._value = Object.assign({}, this._value, obj) if (typeof this._value.cookie === 'string') { this._value.cookie = Buffer.from(this._value.cookie) } } #parse (buffer) { const ber = new BerReader(buffer) /* istanbul ignore else */ if (ber.readSequence()) { this._value = {} this._value.size = ber.readInt() this._value.cookie = ber.readString(Ber.OctetString, true) // readString returns '' instead of a zero-length buffer if (!this._value.cookie) { this._value.cookie = Buffer.alloc(0) } } } _toBer (ber) { const writer = new BerWriter() writer.startSequence() writer.writeInt(this._value.size) if (this._value.cookie && this._value.cookie.length > 0) { writer.writeBuffer(this._value.cookie, Ber.OctetString) } else { // writeBuffer rejects zero-length buffers writer.writeString('') } writer.endSequence() ber.writeBuffer(writer.buffer, Ber.OctetString) return ber } _updatePlainObject (obj) { obj.controlValue = this.value return obj } } module.exports = PagedResultsControl