diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..e6108ed --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +lib/contrib/* diff --git a/lib/contrib/base64-arraybuffer.ts b/lib/contrib/base64-arraybuffer.ts new file mode 100644 index 0000000..5c5c6c1 --- /dev/null +++ b/lib/contrib/base64-arraybuffer.ts @@ -0,0 +1,64 @@ +// imported from https://github.com/socketio/base64-arraybuffer +const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +// Use a lookup table to find the index. +const lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); +for (let i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; +} + +export const encode = (arraybuffer: ArrayBuffer): string => { + let bytes = new Uint8Array(arraybuffer), + i, + len = bytes.length, + base64 = ''; + + for (i = 0; i < len; i += 3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; + base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; + base64 += chars[bytes[i + 2] & 63]; + } + + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + '='; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + '=='; + } + + return base64; +}; + +export const decode = (base64: string): ArrayBuffer => { + let bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + + if (base64[base64.length - 1] === '=') { + bufferLength--; + if (base64[base64.length - 2] === '=') { + bufferLength--; + } + } + + const arraybuffer = new ArrayBuffer(bufferLength), + bytes = new Uint8Array(arraybuffer); + + for (i = 0; i < len; i += 4) { + encoded1 = lookup[base64.charCodeAt(i)]; + encoded2 = lookup[base64.charCodeAt(i + 1)]; + encoded3 = lookup[base64.charCodeAt(i + 2)]; + encoded4 = lookup[base64.charCodeAt(i + 3)]; + + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + + return arraybuffer; +}; diff --git a/lib/decodePacket.browser.ts b/lib/decodePacket.browser.ts index 71e3480..704c147 100644 --- a/lib/decodePacket.browser.ts +++ b/lib/decodePacket.browser.ts @@ -5,7 +5,7 @@ import { BinaryType, RawData } from "./commons.js"; -import { decode } from "@socket.io/base64-arraybuffer"; +import { decode } from "./contrib/base64-arraybuffer.js"; const withNativeArrayBuffer = typeof ArrayBuffer === "function"; diff --git a/package-lock.json b/package-lock.json index b977e41..9305cab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,6 @@ "name": "engine.io-parser", "version": "5.0.3", "license": "MIT", - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, "devDependencies": { "@babel/core": "~7.9.6", "@babel/preset-env": "~7.9.6", @@ -1410,14 +1407,6 @@ "node": ">=8" } }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", @@ -12648,11 +12637,6 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" - }, "@tsconfig/node10": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", diff --git a/package.json b/package.json index cd8def4..e1b521d 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,6 @@ "zuul": "3.11.1", "zuul-ngrok": "4.0.0" }, - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, "scripts": { "compile": "rimraf ./build && tsc && tsc -p tsconfig.esm.json && ./postcompile.sh", "test": "npm run format:check && npm run compile && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi",