(ad)
| 101 | } |
| 102 | |
| 103 | function convert(ad) { |
| 104 | const buffer = new ArrayBuffer(0, {maxByteLength: 31}); |
| 105 | const bytes = new Uint8Array(buffer); |
| 106 | for (let name in ad) { |
| 107 | let offset = bytes.length; |
| 108 | let value = ad[name]; |
| 109 | if (ArrayBuffer.isView(value)) |
| 110 | value = new Uint8Array(value.buffer, value.byteOffset, value.byteLength); |
| 111 | |
| 112 | switch (name) { |
| 113 | case "name": |
| 114 | value = ArrayBuffer.fromString(value); |
| 115 | buffer.resize(offset + value.byteLength + 2); |
| 116 | bytes[offset++] = value.byteLength + 1; |
| 117 | bytes[offset++] = 9; // local name |
| 118 | bytes.set(new Uint8Array(value), offset); |
| 119 | break; |
| 120 | |
| 121 | case "services": // array of 8, 16, and 32 bit UUIDs.... |
| 122 | value = value.map(uuid => { |
| 123 | uuid = Uint8Array.fromHex(uuid.replaceAll("-", "")); |
| 124 | if ((2 !== uuid.length) && (4 !== uuid.length) && (16 !== uuid.length)) |
| 125 | throw new Error("invalid UUID"); |
| 126 | return uuid; |
| 127 | }); |
| 128 | |
| 129 | [2, 4, 16].forEach(length => { |
| 130 | let i = value.filter(uuid => uuid.length === length); |
| 131 | if (i.length) { |
| 132 | buffer.resize(offset + i.length * length + 2); |
| 133 | bytes[offset++] = i.length * length + 1; |
| 134 | bytes[offset++] = (2 === length) ? 3 : ((4 === length) ? 5 : 7); // incomplete 16 / 32 / 128 |
| 135 | i.forEach(uuid => { |
| 136 | for (let j = 0; j < length; j++) |
| 137 | bytes[offset++] = uuid[(length - 1)- j]; |
| 138 | }); |
| 139 | } |
| 140 | }); |
| 141 | break; |
| 142 | |
| 143 | case "manufacturerData": |
| 144 | buffer.resize(offset + value.data.byteLength + 2 + 2); |
| 145 | bytes[offset++] = value.data.byteLength + 1 + 2; |
| 146 | bytes[offset++] = 255; // manufacturer data |
| 147 | bytes[offset++] = value.manufacturer; |
| 148 | bytes[offset++] = value.manufacturer >> 8; |
| 149 | value = value.data; |
| 150 | if (ArrayBuffer.isView(value)) |
| 151 | bytes.set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength), offset); |
| 152 | else |
| 153 | bytes.set(new Uint8Array(value.buffer), offset); |
| 154 | break; |
| 155 | |
| 156 | case "flags": |
| 157 | buffer.resize(offset + 2 + 1); |
| 158 | bytes[offset++] = 1 + 1; |
| 159 | bytes[offset++] = 1; // flags |
| 160 | bytes[offset++] = value; |
no test coverage detected