Skip to content

Instantly share code, notes, and snippets.

@pke
Created November 10, 2015 00:37
Show Gist options
  • Save pke/0b5f4224a8f569ada900 to your computer and use it in GitHub Desktop.
Save pke/0b5f4224a8f569ada900 to your computer and use it in GitHub Desktop.
readAsync from WinRT socket
readLineAsync = function(reader, timeout, buffer) {
var byte;
if (buffer == null) {
buffer = "";
}
logger.trace("readLineAsync: reader.unconsumedBufferLength=" + reader.unconsumedBufferLength + " buffer=" + buffer);
while (reader.unconsumedBufferLength) {
byte = reader.readByte();
if (byte === 0) {
logger.trace("End of stream reached, " + reader.unconsumedBufferLength + " left on reader");
return WinJS.Promise.as(buffer);
}
buffer += String.fromCharCode(byte);
}
logger.trace("readLineAsync: reading 4096 bytes");
return WinJS.Promise.timeout(timeout, reader.loadAsync(4096)).then(function(readBytes) {
logger.trace("readLineAsync: more " + readBytes + " read");
if (readBytes === 0) {
logger.trace("readLineAsync: 0 bytes read, returning " + buffer);
return WinJS.Promise.as(buffer);
} else {
logger.trace("readLineAsync: call again with " + buffer + " and " + reader.unconsumedBufferLength + " left on reader");
return WinJS.Promise.timeout().then(function() {
return readLineAsync(reader, timeout, buffer);
});
}
}, function(error) {
if (error.name === "Canceled") {
error.timeout = true;
logger.trace("readLineAsync: Canceled or timed-out");
} else {
logger.trace("readLineAsync: error", error);
}
return WinJS.Promise.wrapError(error);
});
};
lastLinePattern = /^\|0?18\|05\|00\|02\|\|$/;
readXmlAsync = function(reader, timeout) {
var done, xml;
xml = "";
done = false;
return new WinJS.Promise(function(c, e, p) {
var runner;
runner = function() {
if (done) {
return c(hex2a(xml));
} else {
return readLineAsync(reader, timeout).then(function(line) {
p(line);
if (lastLinePattern.test(line)) {
return done = true;
} else {
return xml += line;
}
}).then(runner, e, p);
}
};
return runner();
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment