UNPKG

2.68 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4function ItoI(a) {
5 return a;
6}
7function innerCreateMedium(defaults, middleware) {
8 if (middleware === void 0) { middleware = ItoI; }
9 var buffer = [];
10 var assigned = false;
11 var medium = {
12 read: function () {
13 if (assigned) {
14 throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.');
15 }
16 if (buffer.length) {
17 return buffer[buffer.length - 1];
18 }
19 return defaults;
20 },
21 useMedium: function (data) {
22 var item = middleware(data, assigned);
23 buffer.push(item);
24 return function () {
25 buffer = buffer.filter(function (x) { return x !== item; });
26 };
27 },
28 assignSyncMedium: function (cb) {
29 assigned = true;
30 while (buffer.length) {
31 var cbs = buffer;
32 buffer = [];
33 cbs.forEach(cb);
34 }
35 buffer = {
36 push: function (x) { return cb(x); },
37 filter: function () { return buffer; },
38 };
39 },
40 assignMedium: function (cb) {
41 assigned = true;
42 var pendingQueue = [];
43 if (buffer.length) {
44 var cbs = buffer;
45 buffer = [];
46 cbs.forEach(cb);
47 pendingQueue = buffer;
48 }
49 var executeQueue = function () {
50 var cbs = pendingQueue;
51 pendingQueue = [];
52 cbs.forEach(cb);
53 };
54 var cycle = function () { return Promise.resolve().then(executeQueue); };
55 cycle();
56 buffer = {
57 push: function (x) {
58 pendingQueue.push(x);
59 cycle();
60 },
61 filter: function (filter) {
62 pendingQueue = pendingQueue.filter(filter);
63 return buffer;
64 },
65 };
66 },
67 };
68 return medium;
69}
70function createMedium(defaults, middleware) {
71 if (middleware === void 0) { middleware = ItoI; }
72 return innerCreateMedium(defaults, middleware);
73}
74exports.createMedium = createMedium;
75function createSidecarMedium(options) {
76 if (options === void 0) { options = {}; }
77 var medium = innerCreateMedium(null);
78 medium.options = tslib_1.__assign({ async: true, ssr: false }, options);
79 return medium;
80}
81exports.createSidecarMedium = createSidecarMedium;