UNPKG

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