UNPKG

3 kBJavaScriptView Raw
1var assert = require('assert-plus');
2var util = require('util');
3
4var asn1 = require('asn1');
5
6var Control = require('./control');
7
8
9///--- Globals
10
11var BerReader = asn1.BerReader;
12var BerWriter = asn1.BerWriter;
13
14
15///--- API
16
17function ServerSideSortingRequestControl(options) {
18 assert.optionalObject(options);
19 options = options || {};
20 options.type = ServerSideSortingRequestControl.OID;
21 if (options.value) {
22 if (Buffer.isBuffer(options.value)) {
23 this.parse(options.value);
24 } else if (Array.isArray(options.value)) {
25 assert.arrayOfObject(options.value, 'options.value must be Objects');
26 for (var i = 0; i < options.value.length; i++) {
27 if (!options.value[i].hasOwnProperty('attributeType')) {
28 throw new Error('Missing required key: attributeType');
29 }
30 }
31 this._value = options.value;
32 } else if (typeof (options.value) === 'object') {
33 if (!options.value.hasOwnProperty('attributeType')) {
34 throw new Error('Missing required key: attributeType');
35 }
36 this._value = [options.value];
37 } else {
38 throw new TypeError('options.value must be a Buffer, Array or Object');
39 }
40 options.value = null;
41 }
42 Control.call(this, options);
43}
44util.inherits(ServerSideSortingRequestControl, Control);
45Object.defineProperties(ServerSideSortingRequestControl.prototype, {
46 value: {
47 get: function () { return this._value || []; },
48 configurable: false
49 }
50});
51
52ServerSideSortingRequestControl.prototype.parse = function parse(buffer) {
53 assert.ok(buffer);
54
55 var ber = new BerReader(buffer);
56 var item;
57 if (ber.readSequence(0x30)) {
58 this._value = [];
59
60 while (ber.readSequence(0x30)) {
61 item = {};
62 item.attributeType = ber.readString(asn1.Ber.OctetString);
63 if (ber.peek() == 0x80) {
64 item.orderingRule = ber.readString(0x80);
65 }
66 if (ber.peek() == 0x81) {
67 item.reverseOrder = (ber._readTag(0x81) === 0 ? false : true);
68 }
69 this._value.push(item);
70 }
71 return true;
72 }
73 return false;
74};
75
76ServerSideSortingRequestControl.prototype._toBer = function (ber) {
77 assert.ok(ber);
78
79 if (!this._value || this.value.length === 0)
80 return;
81
82 var writer = new BerWriter();
83 writer.startSequence(0x30);
84 for (var i = 0; i < this.value.length; i++) {
85 var item = this.value[i];
86 writer.startSequence(0x30);
87 if (item.attributeType) {
88 writer.writeString(item.attributeType, asn1.Ber.OctetString);
89 }
90 if (item.orderingRule) {
91 writer.writeString(item.orderingRule, 0x80);
92 }
93 if (item.reverseOrder) {
94 writer.writeBoolean(item.reverseOrder, 0x81);
95 }
96 writer.endSequence();
97 }
98 writer.endSequence();
99 ber.writeBuffer(writer.buffer, 0x04);
100};
101
102ServerSideSortingRequestControl.prototype._json = function (obj) {
103 obj.controlValue = this.value;
104 return obj;
105};
106
107ServerSideSortingRequestControl.OID = '1.2.840.113556.1.4.473';
108
109
110///---Exports
111
112module.exports = ServerSideSortingRequestControl;