UNPKG

7.09 kBJavaScriptView Raw
1import * as Base64JS from './base64-js.js';
2const WASM = `
3AGFzbQEAAAABFwRgAABgAX8Bf2ACf38Bf2AEf39/fwF/AwYFAAECAQMFAwEAAgYrB38BQaCLBAt/AEGA
4CAt/AEGRCwt/AEGACAt/AEGgiwQLfwBBAAt/AEEBCwe7AQwGbWVtb3J5AgARX193YXNtX2NhbGxfY3Rv
5cnMAABBCYXNlNjRkZWNvZGVfbGVuAAEMQmFzZTY0ZGVjb2RlAAIQQmFzZTY0ZW5jb2RlX2xlbgADDEJh
6c2U2NGVuY29kZQAEDF9fZHNvX2hhbmRsZQMBCl9fZGF0YV9lbmQDAg1fX2dsb2JhbF9iYXNlAwMLX19o
7ZWFwX2Jhc2UDBA1fX21lbW9yeV9iYXNlAwUMX190YWJsZV9iYXNlAwYKqAcFAgALPgEDf0EAIQEDQCAA
8IAFqIQIgAUEBaiIDIQEgAi0AAEGAiICAAGotAABBwABJDQALIANBAmpBBG1BA2xBAWoLxQMBBH9BAyEC
9A0AgASACaiEDIAJBAWoiBCECIANBfWotAABBgIiAgABqLQAAQcAASQ0ACwJAIARBfGoiAkEFSA0AIAQh
10AgNAIAAgAUEBaiIDLQAAQYCIgIAAai0AAEEEdiABLQAAQYCIgIAAai0AAEECdHI6AAAgAEEBaiABQQJq
11IgUtAABBgIiAgABqLQAAQQJ2IAMtAABBgIiAgABqLQAAQQR0cjoAACAAQQJqIAFBA2otAABBgIiAgABq
12LQAAIAUtAABBgIiAgABqLQAAQQZ0cjoAACAAQQNqIQAgAUEEaiEBIAJBfGoiAkEISg0ACyACQXxqIQIL
13AkAgAkECSA0AIAAgAS0AAUGAiICAAGotAABBBHYgAS0AAEGAiICAAGotAABBAnRyOgAAAkAgAkECRw0A
14IABBAWohAAwBCyAAIAEtAAJBgIiAgABqLQAAQQJ2IAEtAAFBgIiAgABqLQAAQQR0cjoAAQJAIAJBBE4N
15ACAAQQJqIQAMAQsgACABLQADQYCIgIAAai0AACABLQACQYCIgIAAai0AAEEGdHI6AAIgAEEDaiEACyAA
16QQA6AAAgBEF/akEEbUEDbEEAIAJrQQNxawsQACAAQQJqQQNtQQJ0QQFyC4sDAQZ/QYCKgIAAQdCKgIAA
17IANBAUYbIQRBACEFIAAhBgJAIAJBA0gNACACQX5qIQdBACEFIAAhBgNAIAYgBCABIAVqIggtAABBAnZq
18LQAAOgAAIAZBAWogBCAILQAAQQR0QTBxIAhBAWoiCS0AAEEEdnJqLQAAOgAAIAZBAmogBCAJLQAAQQJ0
19QTxxIAhBAmoiCC0AAEEGdnJqLQAAOgAAIAZBA2ogBCAILQAAQT9xai0AADoAACAGQQRqIQYgBUEDaiIF
20IAdIDQALCwJAIAUgAk4NACAGIAQgASAFaiIILQAAQQJ2ai0AADoAACAILQAAQQR0QTBxIQkCQAJAAkAg
21BSACQX9qRw0AIAYgBCAJai0AADoAASADRQ0BIAZBAmohBgwDCyAGIAQgCSAIQQFqIggtAABBBHZyai0A
22ADoAASAGIAQgCC0AAEECdEE8cWotAAA6AAIgA0UNASAGQQNqIQYMAgsgBkE9OgACCyAGQT06AAMgBkEE
23aiEGCyAGQQA6AAAgBiAAa0EBagsLmQMBAEGACAuRA0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
24QEBAQEBAQEBAQEBAQEA+QD5APzQ1Njc4OTo7PD1AQEBAQEBAAAECAwQFBgcICQoLDA0ODxAREhMUFRYX
25GBlAQEBAP0AaGxwdHh8gISIjJCUmJygpKissLS4vMDEyM0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
26QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
27QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBQkNERUZHSElKS0xN
28Tk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fAAAAAAAAAAAA
29AAAAAAAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXow
30MTIzNDU2Nzg5Ky8AAHsEbmFtZQFUBQARX193YXNtX2NhbGxfY3RvcnMBEEJhc2U2NGRlY29kZV9sZW4C
31DEJhc2U2NGRlY29kZQMQQmFzZTY0ZW5jb2RlX2xlbgQMQmFzZTY0ZW5jb2RlBxIBAA9fX3N0YWNrX3Bv
32aW50ZXIJCgEABy5yb2RhdGEALwlwcm9kdWNlcnMBDHByb2Nlc3NlZC1ieQEOSG9tZWJyZXcgY2xhbmcG
33MTMuMC4x
34`.replace(/\n/g, '').trim();
35const BYTES_PER_PAGE = 64 * 1024;
36function ensureMemory(memory, pointer, targetLength) {
37 const availableMemory = memory.buffer.byteLength - pointer;
38 if (availableMemory < targetLength) {
39 const nPages = Math.ceil((targetLength - availableMemory) / BYTES_PER_PAGE);
40 memory.grow(nPages);
41 }
42}
43const textEncodeInto = 'encodeInto' in TextEncoder.prototype
44 ? (encoder, uint8, str) => (encoder.encodeInto(str, uint8), uint8)
45 : (encoder, uint8, str) => (uint8.set(encoder.encode(str)), uint8);
46function textEncodeIntoMemory(instance, memory, str, encoder) {
47 const pBufCoded = instance.exports.__heap_base.value;
48 const bufCodedLen = str.length;
49 ensureMemory(memory, pBufCoded, bufCodedLen);
50 const bufCoded = new Uint8Array(memory.buffer, pBufCoded, bufCodedLen + 1);
51 textEncodeInto(encoder, bufCoded, str);
52 bufCoded[bufCodedLen] = 0;
53 return [pBufCoded, bufCodedLen];
54}
55function decode(instance, str, encoder) {
56 const { exports } = instance;
57 const memory = exports.memory;
58 const c_Base64decode_len = exports.Base64decode_len;
59 const c_Base64decode = exports.Base64decode;
60 // console.time('textEncodeIntoMemory');
61 const [pBufCoded, bufCodedLen] = textEncodeIntoMemory(instance, memory, str, encoder);
62 // console.timeEnd('textEncodeIntoMemory');
63 // console.time('c_Base64decode_len');
64 const pBufPlain = pBufCoded + bufCodedLen;
65 const bufPlainLen = c_Base64decode_len(pBufCoded);
66 ensureMemory(memory, pBufPlain, bufPlainLen);
67 // console.timeEnd('c_Base64decode_len');
68 // console.time('c_Base64decode');
69 const lenReal = c_Base64decode(pBufPlain, pBufCoded);
70 const bufPlain = new Uint8Array(memory.buffer, pBufPlain, lenReal);
71 // console.timeEnd('c_Base64decode');
72 // Return a copy to avoid returning a view directly into WASM memory.
73 // console.time('slice');
74 const ret = bufPlain.slice();
75 // console.timeEnd('slice');
76 return ret;
77}
78const bs2u8 = (bs) => bs instanceof ArrayBuffer
79 ? new Uint8Array(bs)
80 : new Uint8Array(bs.buffer, bs.byteOffset, bs.byteLength);
81function writeIntoMemory(instance, memory, bufferSource) {
82 const pString = instance.exports.__heap_base.value;
83 const stringLen = bufferSource.byteLength;
84 ensureMemory(memory, pString, stringLen);
85 // +1 so we so we have an extra byte for the string termination char '\0'
86 const string = new Uint8Array(memory.buffer, pString, stringLen + 1);
87 string.set(bs2u8(bufferSource));
88 string[stringLen] = 0;
89 return [pString, stringLen];
90}
91function encode(instance, bufferSource, urlFriendly) {
92 // console.time('wasm');
93 const { exports } = instance;
94 const memory = exports.memory;
95 const c_Base64encode_len = exports.Base64encode_len;
96 const c_Base64encode = exports.Base64encode;
97 const [pString, stringLen] = writeIntoMemory(instance, memory, bufferSource);
98 const pEncoded = pString + stringLen;
99 const encodedLen = c_Base64encode_len(stringLen);
100 ensureMemory(memory, pEncoded, encodedLen);
101 const encodedLenReal = c_Base64encode(pEncoded, pString, stringLen, urlFriendly ? 1 : 0);
102 // console.timeEnd('wasm');
103 // -1 so we don't include string termination char '\0'
104 const encoded = new Uint8Array(memory.buffer, pEncoded, encodedLenReal - 1);
105 // NOTE: Interestingly, most of the runtime is spent building the string.
106 // As far as I know, this is still the fastest way.
107 // console.time('text');
108 const str = new TextDecoder().decode(encoded);
109 // console.timeEnd('text');
110 return str;
111}
112let decodedWASM = null;
113export class WASMImpl {
114 constructor() {
115 Object.defineProperty(this, "instance", {
116 enumerable: true,
117 configurable: true,
118 writable: true,
119 value: void 0
120 });
121 Object.defineProperty(this, "encoder", {
122 enumerable: true,
123 configurable: true,
124 writable: true,
125 value: new TextEncoder()
126 });
127 }
128 async init() {
129 decodedWASM || (decodedWASM = Base64JS.decode(WASM));
130 const { instance } = await WebAssembly.instantiate(decodedWASM);
131 this.instance = instance;
132 return this;
133 }
134 encode(bufferSource, urlFriendly) {
135 return encode(this.instance, bufferSource, urlFriendly);
136 }
137 decode(input) {
138 return decode(this.instance, input, this.encoder);
139 }
140}
141// `jsImpl` is a singleton because it doesn't have any state
142export { Base64JS as jsImpl };
143//# sourceMappingURL=base64.js.map
\No newline at end of file