Compare commits

...
3 Commits
Author SHA1 Message Date
David Frank b197ea6198 release v1.0.4 (#4)
* changelog update
* 1.0.4
2019-09-23 18:40:13 +08:00
Richie Bendall c9b6fdba06 chore: Update code from node-fetch/add-fetch-blob (#3) 2019-09-23 18:26:29 +08:00
David Frank 78ec7f45c0 v1.0.3 (#2)
* sometimes the best ci cannot catch your silly export typo
* changelog update
* 1.0.3
2019-05-16 16:58:18 +08:00
4 changed files with 51 additions and 30 deletions
+8
View File
@@ -2,6 +2,14 @@
Changelog Changelog
========= =========
## v1.0.4
- Other: general code revwrite to pass linting, prepare for `node-fetch` release v3
## v1.0.3
- Fix: package.json export `blob.js` properly now
## v1.0.2 ## v1.0.2
- Other: fix test integration - Other: fix test integration
+40 -27
View File
@@ -1,28 +1,27 @@
// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js // Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
// Also based on https://github.com/bitinn/node-fetch/blob/v2.5.0/src/blob.js
// (MIT licensed) // (MIT licensed)
const Stream = require('stream'); const Stream = require('stream');
const Readable = Stream.Readable;
// Fix for "Readable" isn't a named export issue
const {Readable} = Stream;
const BUFFER = Symbol('buffer'); const BUFFER = Symbol('buffer');
const TYPE = Symbol('type'); const TYPE = Symbol('type');
class Blob { class Blob {
constructor() { constructor(...args) {
this[TYPE] = ''; this[TYPE] = '';
const blobParts = arguments[0]; const blobParts = args[0];
const options = arguments[1]; const options = args[1];
const buffers = []; const buffers = [];
/* eslint-disable-next-line no-unused-vars */
let size = 0; let size = 0;
if (blobParts) { if (blobParts) {
const a = blobParts; blobParts.forEach(element => {
const length = Number(a.length);
for (let i = 0; i < length; i++) {
const element = a[i];
let buffer; let buffer;
if (element instanceof Buffer) { if (element instanceof Buffer) {
buffer = element; buffer = element;
@@ -35,50 +34,62 @@ class Blob {
} else { } else {
buffer = Buffer.from(typeof element === 'string' ? element : String(element)); buffer = Buffer.from(typeof element === 'string' ? element : String(element));
} }
size += buffer.length; size += buffer.length;
buffers.push(buffer); buffers.push(buffer);
} });
} }
this[BUFFER] = Buffer.concat(buffers); this[BUFFER] = Buffer.concat(buffers);
let type = options && const type = options && options.type !== undefined && String(options.type).toLowerCase();
options.type !== undefined &&
String(options.type).toLowerCase();
if (type && !/[^\u0020-\u007E]/.test(type)) { if (type && !/[^\u0020-\u007E]/.test(type)) {
this[TYPE] = type; this[TYPE] = type;
} }
if (options && Buffer.isBuffer(options.buffer)) {
this[BUFFER] = options.buffer;
}
} }
get size() { get size() {
return this[BUFFER].length; return this[BUFFER].length;
} }
get type() { get type() {
return this[TYPE]; return this[TYPE];
} }
text() { text() {
return Promise.resolve(this[BUFFER].toString()) return Promise.resolve(this[BUFFER].toString());
} }
arrayBuffer() { arrayBuffer() {
const buf = this[BUFFER]; const buf = this[BUFFER];
const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
return Promise.resolve(ab); return Promise.resolve(ab);
} }
stream() { stream() {
const readable = new Readable(); const readable = new Readable();
readable._read = () => {}; readable._read = () => { };
readable.push(this[BUFFER]); readable.push(this[BUFFER]);
readable.push(null); readable.push(null);
return readable; return readable;
} }
toString() {
return '[object Blob]'
}
slice() {
const size = this.size;
const start = arguments[0]; toString() {
const end = arguments[1]; return '[object Blob]';
let relativeStart, relativeEnd; }
slice(...args) {
const {size} = this;
const start = args[0];
const end = args[1];
let relativeStart;
let relativeEnd;
if (start === undefined) { if (start === undefined) {
relativeStart = 0; relativeStart = 0;
} else if (start < 0) { } else if (start < 0) {
@@ -86,6 +97,7 @@ class Blob {
} else { } else {
relativeStart = Math.min(start, size); relativeStart = Math.min(start, size);
} }
if (end === undefined) { if (end === undefined) {
relativeEnd = size; relativeEnd = size;
} else if (end < 0) { } else if (end < 0) {
@@ -93,6 +105,7 @@ class Blob {
} else { } else {
relativeEnd = Math.min(end, size); relativeEnd = Math.min(end, size);
} }
const span = Math.max(relativeEnd - relativeStart, 0); const span = Math.max(relativeEnd - relativeStart, 0);
const buffer = this[BUFFER]; const buffer = this[BUFFER];
@@ -100,16 +113,16 @@ class Blob {
relativeStart, relativeStart,
relativeStart + span relativeStart + span
); );
const blob = new Blob([], { type: arguments[2] }); const blob = new Blob([], {type: args[2]});
blob[BUFFER] = slicedBuffer; blob[BUFFER] = slicedBuffer;
return blob; return blob;
} }
} }
Object.defineProperties(Blob.prototype, { Object.defineProperties(Blob.prototype, {
size: { enumerable: true }, size: {enumerable: true},
type: { enumerable: true }, type: {enumerable: true},
slice: { enumerable: true } slice: {enumerable: true}
}); });
Object.defineProperty(Blob.prototype, Symbol.toStringTag, { Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "fetch-blob", "name": "fetch-blob",
"version": "1.0.2", "version": "1.0.4",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
+2 -2
View File
@@ -1,8 +1,8 @@
{ {
"name": "fetch-blob", "name": "fetch-blob",
"version": "1.0.2", "version": "1.0.4",
"description": "A Blob implementation on node.js, originally from node-fetch", "description": "A Blob implementation on node.js, originally from node-fetch",
"main": "index.js", "main": "blob.js",
"scripts": { "scripts": {
"test": "ava", "test": "ava",
"report": "nyc ava", "report": "nyc ava",