Baseline Widely available *
TransformStream
ã¯ã¹ããªã¼ã API ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ã夿ã¹ããªã¼ã ã®æ¦å¿µã§ãããã¤ããã§ã¼ã³ã®å
·ä½çãªå®è£
ã表ãã¾ãã
ããã¯ããã¼ã¿ã®ã¹ããªã¼ã ãããå½¢å¼ããå¥ã®å½¢å¼ã«å¤æããããã« ReadableStream.pipeThrough()
ã¡ã½ããã«æ¸¡ããã¨ãã§ãã¾ãã ä¾ãã°ãåç»ãã¬ã¼ã ããã³ã¼ãï¼ã¾ãã¯ã¨ã³ã³ã¼ãï¼ãããããã¼ã¿ãè§£åããããã¹ããªã¼ã ã XML ãã JSON ã«å¤æãããããããã«ä½¿ç¨ãã¾ãã
夿ã¢ã«ã´ãªãºã ã¯ããªãã¸ã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ãªãã·ã§ã³å¼æ°ã¨ãã¦æå®ããã¾ãã æä¾ãããªãå ´åãã¹ããªã¼ã ãéãã¦ãã¤ãå¦çããããã¼ã¿ã¯å¤æ´ããã¾ããã
TransformStream
ã¯ç§»è²å¯è½ãªãã¸ã§ã¯ãã§ãã
TransformStream()
æå®ããããã³ãã©ã¼ãã夿ã¹ããªã¼ã ã使ãã¦è¿å´ãã¾ãããªãã·ã§ã³ã§ã夿ãªãã¸ã§ã¯ãã¨ã¹ããªã¼ã ã®ãã¥ã¼ã¤ã³ã°æ¦ç¥ãæå®ãã¾ãã
TransformStream.readable
èªåå°ç¨
TransformStream
ã® readable
å´ã®ç«¯ç¹ã§ãã
TransformStream.writable
èªåå°ç¨
TransformStream
ã® writable
å´ã®ç«¯ç¹ã§ãã
ãªã
ä¾ ä½ãã uint8array ã«å¤æããã¹ããªã¼ã以ä¸ã®ä¾ã§ã¯ã夿ã¹ããªã¼ã ã¯åä¿¡ãããã¹ã¦ã®ãã£ã³ã¯ã Uint8Array
ã®å¤ã«æ¸¡ãã¾ãã
const transformContent = {
start() {}, // required.
async transform(chunk, controller) {
chunk = await chunk;
switch (typeof chunk) {
case "object":
// just say the stream is done I guess
if (chunk === null) {
controller.terminate();
} else if (ArrayBuffer.isView(chunk)) {
controller.enqueue(
new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),
);
} else if (
Array.isArray(chunk) &&
chunk.every((value) => typeof value === "number")
) {
controller.enqueue(new Uint8Array(chunk));
} else if (
typeof chunk.valueOf === "function" &&
chunk.valueOf() !== chunk
) {
this.transform(chunk.valueOf(), controller); // hack
} else if ("toJSON" in chunk) {
this.transform(JSON.stringify(chunk), controller);
}
break;
case "symbol":
controller.error("Cannot send a symbol as a chunk part");
break;
case "undefined":
controller.error("Cannot send undefined as a chunk part");
break;
default:
controller.enqueue(this.textencoder.encode(String(chunk)));
break;
}
},
flush() {
/* do any destructor work here */
},
};
class AnyToU8Stream extends TransformStream {
constructor() {
super({ ...transformContent, textencoder: new TextEncoder() });
}
}
TextEncoderStream ããã³ TextDecoderStream ã®ä»£æ¿
ãªããããã¯ãã¤ãã£ãã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ã£ã¦ãããã鿍奍ã§ããããã¯å¯¾å¿ãã¦ããªããã©ãããã©ã¼ã ã§ä»£æ¿ã¨ãããã¨ãæå³ãã¦ãã¾ãã
const tes = {
start() {
this.encoder = new TextEncoder();
},
transform(chunk, controller) {
controller.enqueue(this.encoder.encode(chunk));
},
};
let _jstes_wm = new WeakMap(); /* info holder */
class JSTextEncoderStream extends TransformStream {
constructor() {
let t = { ...tes };
super(t);
_jstes_wm.set(this, t);
}
get encoding() {
return _jstes_wm.get(this).encoder.encoding;
}
}
åæ§ã«ã TextDecoderStream
ã¯æ¬¡ã®ããã«æ¸ããã¨ãã§ãã¾ãã
const tds = {
start() {
this.decoder = new TextDecoder(this.encoding, this.options);
},
transform(chunk, controller) {
controller.enqueue(this.decoder.decode(chunk, { stream: true }));
},
};
let _jstds_wm = new WeakMap(); /* info holder */
class JSTextDecoderStream extends TransformStream {
constructor(encoding = "utf-8", { ...options } = {}) {
let t = { ...tds, encoding, options };
super(t);
_jstds_wm.set(this, t);
}
get encoding() {
return _jstds_wm.get(this).decoder.encoding;
}
get fatal() {
return _jstds_wm.get(this).decoder.fatal;
}
get ignoreBOM() {
return _jstds_wm.get(this).decoder.ignoreBOM;
}
}
è¤æ°ã® ReadableStreams ãäºãã«çµå
ããã¯ãè¤æ°ã®ã¹ããªã¼ã ãçµåã§ãã便å©ãªãã®ã§ããä¾ã§ã¯ããã°ã¬ãã·ãèªã¿è¾¼ã¿ãããã°ã¬ãã·ãã¹ããªã¼ãã³ã°ãæã¤ PWA ã®æ§ç¯ãå«ã¾ãã¾ãã
let responses = [
/* conjoined response tree */
];
let { readable, writable } = new TransformStream();
responses.reduce(
(a, res, i, arr) =>
a.then(() => res.pipeTo(writable, { preventClose: i + 1 !== arr.length })),
Promise.resolve(),
);
ããã¯ä»ã¸ã®å½±é¿ã«å¯¾ãã¦èæ§ããªããã¨ã«æ³¨æãã¦ãã ããã
仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§ é¢é£æ å ±RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4