MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / convert

Function convert

modules/io/ble/server/esp32/bleserver.js:103–178  ·  view source on GitHub ↗
(ad)

Source from the content-addressed store, hash-verified

101}
102
103function 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;

Callers 1

startAdvertisingMethod · 0.70

Calls 6

fromStringMethod · 0.80
mapMethod · 0.80
fromHexMethod · 0.80
setMethod · 0.65
filterMethod · 0.45
toStringMethod · 0.45

Tested by

no test coverage detected