firebase-token-generator
Version:
A utility to generate signed Firebase Authentication Tokens
58 lines (53 loc) • 1.74 kB
JavaScript
goog.provide('fb.tokengenerator.utf8');
// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they
// automatically replaced '\r\n' with '\n', and they didn't handle surrogate pairs,
// so it's been modified.
fb.tokengenerator.utf8.stringToByteArray = function(str) {
var out = [], p = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
// Is this the lead surrogate in a surrogate pair?
if (c >= 0xd800 && c <= 0xdbff) {
var high = c - 0xd800; // the high 10 bits.
i++;
fb.core.util.assert(i < str.length, 'Surrogate pair missing trail surrogate.');
var low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.
c = 0x10000 + (high << 10) + low;
}
if (c < 128) {
out[p++] = c;
} else if (c < 2048) {
out[p++] = (c >> 6) | 192;
out[p++] = (c & 63) | 128;
} else if (c < 65536) {
out[p++] = (c >> 12) | 224;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
} else {
out[p++] = (c >> 18) | 240;
out[p++] = ((c >> 12) & 63) | 128;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
}
}
return out;
};
// Calculate length without actually converting; useful for doing cheaper validation.
fb.tokengenerator.utf8.stringLength = function(str) {
var p = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if (c < 128) {
p++;
} else if (c < 2048) {
p += 2;
} else if (c >= 0xd800 && c <= 0xdbff) {
// Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.
p += 4;
i++; // skip trail surrogate.
} else {
p += 3;
}
}
return p;
};