-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
64 lines (51 loc) · 1.65 KB
/
index.js
File metadata and controls
64 lines (51 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
var dgram = require('dgram');
var net = require('net');
var Buffer = require('buffer').Buffer;
var macBytes = 6;
exports.createMagicPacket = function(macAddress) {
var macBuffer = new Buffer(macBytes);
var i;
var numMacs = 16;
var buffer = new Buffer((1 + numMacs) * macBytes);
if(macAddress.length === (2 * macBytes + (macBytes - 1))) {
macAddress = macAddress.replace(new RegExp(macAddress[2], 'g'), '');
}
if(macAddress.length !== (2 * macBytes || macAddress.match(/[^a-fA-F0-9]/))) {
throw new Error('malformed MAC address \'' + macAddress + '\'');
}
for(var i = 0; i < macBytes; ++i) {
macBuffer[i] = parseInt(macAddress.substr((2 * i), 2), 16);
}
for(var i = 0; i < macBytes; ++i) {
buffer[i] = 0xff;
}
for(var i = 0; i < numMacs; ++i) {
macBuffer.copy(buffer, (i + 1) * macBytes, 0, macBuffer.length);
}
return buffer;
};
exports.wake = function(macAddress, options, callback) {
if(options.constructor === Function) {
callback = options;
options = {};
}
var _options = {
address: (options.address)? options.address : '255.255.255.255',
port: (options.port)? options.port : 9
};
var magicPacket = exports.createMagicPacket(macAddress);
var protocol = net.isIPv6(_options.address) ? 'udp6' : 'udp4';
var socket = dgram.createSocket(protocol);
socket.send(magicPacket, 0, magicPacket.length, _options.port, _options.address, function(error) {
if(!error) {
callback();
}
});
socket.on('error', function(error) {
callback('ERROR: '+error.stack);
socket.close();
});
socket.once('listening', function() {
socket.setBroadcast(true);
});
};