EdgeAIG's picture
download
raw
4.12 kB
/**
* Marks encoded worker message fields that should move through `postMessage` as
* transfer-list entries.
*
* Worker messages still pass through schema encoding and structured clone, but
* schemas wrapped with `schema` can also report backing resources such as
* `ArrayBuffer`, `ImageData.data.buffer`, or `MessagePort` to a `Collector`.
* Worker platforms then pass the collected values as the transfer list for the
* same `postMessage` call, avoiding copies for large payloads and ports.
*
* @since 4.0.0
*/
import * as Context from "../../Context.js";
import * as Effect from "../../Effect.js";
import { dual } from "../../Function.js";
import * as Schema from "../../Schema.js";
import * as SchemaGetter from "../../SchemaGetter.js";
/**
* Service for collecting `Transferable` objects while encoding worker messages
* so they can be passed to `postMessage` transfer lists.
*
* @category models
* @since 4.0.0
*/
export class Collector extends /*#__PURE__*/Context.Service()("effect/workers/Transferable/Collector") {}
/**
* Creates a mutable `Collector` service directly, exposing unsafe synchronous
* methods for reading, adding, and clearing collected transferables.
*
* @category constructors
* @since 4.0.0
*/
export const makeCollectorUnsafe = () => {
let tranferables = [];
const unsafeAddAll = transfers => {
tranferables.push(...transfers);
};
const unsafeRead = () => tranferables;
const unsafeClear = () => {
const prev = tranferables;
tranferables = [];
return prev;
};
return Collector.of({
addAllUnsafe: unsafeAddAll,
addAll: transferables => Effect.sync(() => unsafeAddAll(transferables)),
readUnsafe: unsafeRead,
read: Effect.sync(unsafeRead),
clearUnsafe: unsafeClear,
clear: Effect.sync(unsafeClear)
});
};
/**
* Effect that creates a fresh `Collector` service for accumulating
* transferables.
*
* @category constructors
* @since 4.0.0
*/
export const makeCollector = /*#__PURE__*/Effect.sync(makeCollectorUnsafe);
/**
* Adds transferables to the current `Collector` when one is present in the
* context, and does nothing otherwise.
*
* @category accessors
* @since 4.0.0
*/
export const addAll = tranferables => Effect.contextWith(services => {
const collector = Context.getOrUndefined(services, Collector);
if (!collector) return Effect.void;
collector.addAllUnsafe(tranferables);
return Effect.void;
});
/**
* Creates a schema getter that records transferables derived from a value in
* the current `Collector` while passing the value through unchanged.
*
* @category getters
* @since 4.0.0
*/
export const getterAddAll = f => SchemaGetter.transformOrFail(e => Effect.contextWith(services => {
const collector = Context.getOrUndefined(services, Collector);
if (!collector) return Effect.succeed(e);
collector.addAllUnsafe(f(e));
return Effect.succeed(e);
}));
/**
* Wraps a schema so encoding records transferables selected from the encoded
* value, enabling worker messages to populate a `postMessage` transfer list.
*
* @category schemas
* @since 4.0.0
*/
export const schema = /*#__PURE__*/dual(2, (self, f) => self.annotate({
toCodecJson: () => passthroughLink
}).pipe(Schema.decode({
decode: SchemaGetter.passthrough(),
encode: getterAddAll(f)
})));
const passthroughLink = /*#__PURE__*/Schema.link()(Schema.Any, {
decode: /*#__PURE__*/SchemaGetter.passthrough(),
encode: /*#__PURE__*/SchemaGetter.passthrough()
});
/**
* Schema for transferring `ImageData` values with their pixel data buffer.
*
* @category schemas
* @since 4.0.0
*/
export const ImageData = /*#__PURE__*/schema(Schema.Any, _ => [_.data.buffer]);
/**
* Schema for transferring `MessagePort` values as transferable objects.
*
* @category schemas
* @since 4.0.0
*/
export const MessagePort = /*#__PURE__*/schema(Schema.Any, _ => [_]);
/**
* Schema for transferring `Uint8Array` values with their backing buffer.
*
* @category schemas
* @since 4.0.0
*/
export const Uint8Array = /*#__PURE__*/schema(Schema.Uint8Array, _ => [_.buffer]);
//# sourceMappingURL=Transferable.js.map

Xet Storage Details

Size:
4.12 kB
·
Xet hash:
9bc02e99286320c2e562db70dbab77f6a2fd4af59930fe07ef083678d41f1bf7

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.