Skip to content

Instantly share code, notes, and snippets.

@leebyron
Last active August 8, 2017 18:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leebyron/85115c44c89bf2c202ae8e6450978654 to your computer and use it in GitHub Desktop.
Save leebyron/85115c44c89bf2c202ae8e6450978654 to your computer and use it in GitHub Desktop.
requirebin sketch
const Observable = require("zen-observable");
let sink;
const list = [];
const error = new Error();
new Observable(_sink => {
sink = _sink;
return () => list.push('cleanup');
}).subscribe({
next: val => {
list.push('next:' + val);
throw error;
},
error: err => {
list.push('error-handler:');
list.push(err);
},
complete: () => list.push('complete'),
});
try {
sink.next(1);
} catch (e) {
list.push('try-catch:');
list.push(e);
}
try {
sink.next(2);
} catch (e) {
list.push('try-catch:');
list.push(e);
}
console.log(list);
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict'; (function(fn, name) { if (typeof exports !== 'undefined') fn(exports, module); else if (typeof self !== 'undefined') fn(name === '*' ? self : (name ? self[name] = {} : {})); })(function(exports, module) { // === Symbol Support ===
function hasSymbol(name) {
return typeof Symbol === "function" && Boolean(Symbol[name]);
}
function getSymbol(name) {
return hasSymbol(name) ? Symbol[name] : "@@" + name;
}
// Ponyfill Symbol.observable for interoperability with other libraries
if (typeof Symbol === "function" && !Symbol.observable) {
Symbol.observable = Symbol("observable");
}
// === Abstract Operations ===
function getMethod(obj, key) {
var value = obj[key];
if (value == null)
return undefined;
if (typeof value !== "function")
throw new TypeError(value + " is not a function");
return value;
}
function getSpecies(obj) {
var ctor = obj.constructor;
if (ctor !== undefined) {
ctor = ctor[getSymbol("species")];
if (ctor === null) {
ctor = undefined;
}
}
return ctor !== undefined ? ctor : Observable;
}
function addMethods(target, methods) {
Object.keys(methods).forEach(function(k) {
var desc = Object.getOwnPropertyDescriptor(methods, k);
desc.enumerable = false;
Object.defineProperty(target, k, desc);
});
}
function cleanupSubscription(subscription) {
// Assert: observer._observer is undefined
var cleanup = subscription._cleanup;
if (!cleanup)
return;
// Drop the reference to the cleanup function so that we won't call it
// more than once
subscription._cleanup = undefined;
// Call the cleanup function
cleanup();
}
function subscriptionClosed(subscription) {
return subscription._observer === undefined;
}
function closeSubscription(subscription) {
if (subscriptionClosed(subscription))
return;
subscription._observer = undefined;
cleanupSubscription(subscription);
}
function cleanupFromSubscription(subscription) {
return function() { subscription.unsubscribe() };
}
function Subscription(observer, subscriber) {
// Assert: subscriber is callable
// The observer must be an object
if (Object(observer) !== observer)
throw new TypeError("Observer must be an object");
this._cleanup = undefined;
this._observer = observer;
var start = getMethod(observer, "start");
if (start)
start.call(observer, this);
if (subscriptionClosed(this))
return;
observer = new SubscriptionObserver(this);
try {
// Call the subscriber function
var cleanup$0 = subscriber.call(undefined, observer);
// The return value must be undefined, null, a subscription object, or a function
if (cleanup$0 != null) {
if (typeof cleanup$0.unsubscribe === "function")
cleanup$0 = cleanupFromSubscription(cleanup$0);
else if (typeof cleanup$0 !== "function")
throw new TypeError(cleanup$0 + " is not a function");
this._cleanup = cleanup$0;
}
} catch (e) {
// If an error occurs during startup, then attempt to send the error
// to the observer
observer.error(e);
return;
}
// If the stream is already finished, then perform cleanup
if (subscriptionClosed(this))
cleanupSubscription(this);
}
addMethods(Subscription.prototype = {}, {
get closed() { return subscriptionClosed(this) },
unsubscribe: function() { closeSubscription(this) },
});
function SubscriptionObserver(subscription) {
this._subscription = subscription;
}
addMethods(SubscriptionObserver.prototype = {}, {
get closed() { return subscriptionClosed(this._subscription) },
next: function(value) {
var subscription = this._subscription;
// If the stream is closed, then return undefined
if (subscriptionClosed(subscription))
return undefined;
var observer = subscription._observer;
var m = getMethod(observer, "next");
// If the observer doesn't support "next", then return undefined
if (!m)
return undefined;
// Send the next value to the sink
return m.call(observer, value);
},
error: function(value) {
var subscription = this._subscription;
// If the stream is closed, throw the error to the caller
if (subscriptionClosed(subscription))
throw value;
var observer = subscription._observer;
subscription._observer = undefined;
try {
var m$0 = getMethod(observer, "error");
// If the sink does not support "error", then throw the error to the caller
if (!m$0)
throw value;
value = m$0.call(observer, value);
} catch (e) {
try { cleanupSubscription(subscription) }
finally { throw e }
}
cleanupSubscription(subscription);
return value;
},
complete: function(value) {
var subscription = this._subscription;
// If the stream is closed, then return undefined
if (subscriptionClosed(subscription))
return undefined;
var observer = subscription._observer;
subscription._observer = undefined;
try {
var m$1 = getMethod(observer, "complete");
// If the sink does not support "complete", then return undefined
value = m$1 ? m$1.call(observer, value) : undefined;
} catch (e) {
try { cleanupSubscription(subscription) }
finally { throw e }
}
cleanupSubscription(subscription);
return value;
},
});
function Observable(subscriber) {
// The stream subscriber must be a function
if (typeof subscriber !== "function")
throw new TypeError("Observable initializer must be a function");
this._subscriber = subscriber;
}
addMethods(Observable.prototype, {
subscribe: function(observer) { for (var args = [], __$0 = 1; __$0 < arguments.length; ++__$0) args.push(arguments[__$0]);
if (typeof observer === 'function') {
observer = {
next: observer,
error: args[0],
complete: args[1],
};
}
return new Subscription(observer, this._subscriber);
},
forEach: function(fn) { var __this = this;
return new Promise(function(resolve, reject) {
if (typeof fn !== "function")
return Promise.reject(new TypeError(fn + " is not a function"));
__this.subscribe({
_subscription: null,
start: function(subscription) {
if (Object(subscription) !== subscription)
throw new TypeError(subscription + " is not an object");
this._subscription = subscription;
},
next: function(value) {
var subscription = this._subscription;
if (subscription.closed)
return;
try {
return fn(value);
} catch (err) {
reject(err);
subscription.unsubscribe();
}
},
error: reject,
complete: resolve,
});
});
},
map: function(fn) { var __this = this;
if (typeof fn !== "function")
throw new TypeError(fn + " is not a function");
var C = getSpecies(this);
return new C(function(observer) { return __this.subscribe({
next: function(value) {
if (observer.closed)
return;
try { value = fn(value) }
catch (e) { return observer.error(e) }
return observer.next(value);
},
error: function(e) { return observer.error(e) },
complete: function(x) { return observer.complete(x) },
}); });
},
filter: function(fn) { var __this = this;
if (typeof fn !== "function")
throw new TypeError(fn + " is not a function");
var C = getSpecies(this);
return new C(function(observer) { return __this.subscribe({
next: function(value) {
if (observer.closed)
return;
try { if (!fn(value)) return undefined }
catch (e) { return observer.error(e) }
return observer.next(value);
},
error: function(e) { return observer.error(e) },
complete: function() { return observer.complete() },
}); });
},
reduce: function(fn) { var __this = this;
if (typeof fn !== "function")
throw new TypeError(fn + " is not a function");
var C = getSpecies(this);
var hasSeed = arguments.length > 1;
var hasValue = false;
var seed = arguments[1];
var acc = seed;
return new C(function(observer) { return __this.subscribe({
next: function(value) {
if (observer.closed)
return;
var first = !hasValue;
hasValue = true;
if (!first || hasSeed) {
try { acc = fn(acc, value) }
catch (e) { return observer.error(e) }
} else {
acc = value;
}
},
error: function(e) { observer.error(e) },
complete: function() {
if (!hasValue && !hasSeed) {
observer.error(new TypeError("Cannot reduce an empty sequence"));
return;
}
observer.next(acc);
observer.complete();
},
}); });
},
flatMap: function(fn) { var __this = this;
if (typeof fn !== "function")
throw new TypeError(fn + " is not a function");
var C = getSpecies(this);
return new C(function(observer) {
var completed = false;
var subscriptions = [];
// Subscribe to the outer Observable
var outer = __this.subscribe({
next: function(value) {
if (fn) {
try {
value = fn(value);
} catch (x) {
observer.error(x);
return;
}
}
// Subscribe to the inner Observable
Observable.from(value).subscribe({
_subscription: null,
start: function(s) { subscriptions.push(this._subscription = s) },
next: function(value) { observer.next(value) },
error: function(e) { observer.error(e) },
complete: function() {
var i = subscriptions.indexOf(this._subscription);
if (i >= 0)
subscriptions.splice(i, 1);
closeIfDone();
}
});
},
error: function(e) {
return observer.error(e);
},
complete: function() {
completed = true;
closeIfDone();
}
});
function closeIfDone() {
if (completed && subscriptions.length === 0)
observer.complete();
}
return function() {
subscriptions.forEach(function(s) { return s.unsubscribe(); });
outer.unsubscribe();
};
});
},
});
Object.defineProperty(Observable.prototype, getSymbol("observable"), {
value: function() { return this },
writable: true,
configurable: true,
});
addMethods(Observable, {
from: function(x) {
var C = typeof this === "function" ? this : Observable;
if (x == null)
throw new TypeError(x + " is not an object");
var method = getMethod(x, getSymbol("observable"));
if (method) {
var observable$0 = method.call(x);
if (Object(observable$0) !== observable$0)
throw new TypeError(observable$0 + " is not an object");
if (observable$0.constructor === C)
return observable$0;
return new C(function(observer) { return observable$0.subscribe(observer); });
}
if (hasSymbol("iterator") && (method = getMethod(x, getSymbol("iterator")))) {
return new C(function(observer) {
for (var __$0 = (method.call(x))[Symbol.iterator](), __$1; __$1 = __$0.next(), !__$1.done;) { var item$0 = __$1.value;
observer.next(item$0);
if (observer.closed)
return;
}
observer.complete();
});
}
if (Array.isArray(x)) {
return new C(function(observer) {
for (var i$0 = 0; i$0 < x.length; ++i$0) {
observer.next(x[i$0]);
if (observer.closed)
return;
}
observer.complete();
});
}
throw new TypeError(x + " is not observable");
},
of: function() { for (var items = [], __$0 = 0; __$0 < arguments.length; ++__$0) items.push(arguments[__$0]);
var C = typeof this === "function" ? this : Observable;
return new C(function(observer) {
for (var i$1 = 0; i$1 < items.length; ++i$1) {
observer.next(items[i$1]);
if (observer.closed)
return;
}
observer.complete();
});
},
});
Object.defineProperty(Observable, getSymbol("species"), {
get: function() { return this },
configurable: true,
});
exports.Observable = Observable;
}, "*");
},{}],"zen-observable":[function(require,module,exports){
module.exports = require("./zen-observable.js").Observable;
},{"./zen-observable.js":1}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInplbi1vYnNlcnZhYmxlLmpzIiwiemVuLW9ic2VydmFibGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamZBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnOyAoZnVuY3Rpb24oZm4sIG5hbWUpIHsgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykgZm4oZXhwb3J0cywgbW9kdWxlKTsgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSBmbihuYW1lID09PSAnKicgPyBzZWxmIDogKG5hbWUgPyBzZWxmW25hbWVdID0ge30gOiB7fSkpOyB9KShmdW5jdGlvbihleHBvcnRzLCBtb2R1bGUpIHsgLy8gPT09IFN5bWJvbCBTdXBwb3J0ID09PVxuXG5mdW5jdGlvbiBoYXNTeW1ib2wobmFtZSkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIEJvb2xlYW4oU3ltYm9sW25hbWVdKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3ltYm9sKG5hbWUpIHtcbiAgcmV0dXJuIGhhc1N5bWJvbChuYW1lKSA/IFN5bWJvbFtuYW1lXSA6IFwiQEBcIiArIG5hbWU7XG59XG5cbi8vIFBvbnlmaWxsIFN5bWJvbC5vYnNlcnZhYmxlIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmICFTeW1ib2wub2JzZXJ2YWJsZSkge1xuICBTeW1ib2wub2JzZXJ2YWJsZSA9IFN5bWJvbChcIm9ic2VydmFibGVcIik7XG59XG5cbi8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG5mdW5jdGlvbiBnZXRNZXRob2Qob2JqLCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gb2JqW2tleV07XG5cbiAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgdmFyIGN0b3IgPSBvYmouY29uc3RydWN0b3I7XG4gIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjdG9yID0gY3RvcltnZXRTeW1ib2woXCJzcGVjaWVzXCIpXTtcbiAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgY3RvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGN0b3IgIT09IHVuZGVmaW5lZCA/IGN0b3IgOiBPYnNlcnZhYmxlO1xufVxuXG5mdW5jdGlvbiBhZGRNZXRob2RzKHRhcmdldCwgbWV0aG9kcykge1xuICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobWV0aG9kcywgayk7XG4gICAgZGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgaywgZGVzYyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICAvLyBBc3NlcnQ6ICBvYnNlcnZlci5fb2JzZXJ2ZXIgaXMgdW5kZWZpbmVkXG5cbiAgdmFyIGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2NsZWFudXA7XG5cbiAgaWYgKCFjbGVhbnVwKVxuICAgIHJldHVybjtcblxuICAvLyBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNsZWFudXAgZnVuY3Rpb24gc28gdGhhdCB3ZSB3b24ndCBjYWxsIGl0XG4gIC8vIG1vcmUgdGhhbiBvbmNlXG4gIHN1YnNjcmlwdGlvbi5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblxuICAvLyBDYWxsIHRoZSBjbGVhbnVwIGZ1bmN0aW9uXG4gIGNsZWFudXAoKTtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vYnNlcnZlciA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKVxuICAgIHJldHVybjtcblxuICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBGcm9tU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpIH07XG59XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICAvLyBBc3NlcnQ6IHN1YnNjcmliZXIgaXMgY2FsbGFibGVcblxuICAvLyBUaGUgb2JzZXJ2ZXIgbXVzdCBiZSBhbiBvYmplY3RcbiAgaWYgKE9iamVjdChvYnNlcnZlcikgIT09IG9ic2VydmVyKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYnNlcnZlciBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblxuICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICB0aGlzLl9vYnNlcnZlciA9IG9ic2VydmVyO1xuXG4gIHZhciBzdGFydCA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJzdGFydFwiKTtcblxuICBpZiAoc3RhcnQpXG4gICAgc3RhcnQuY2FsbChvYnNlcnZlciwgdGhpcyk7XG5cbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzKSlcbiAgICByZXR1cm47XG5cbiAgb2JzZXJ2ZXIgPSBuZXcgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIodGhpcyk7XG5cbiAgdHJ5IHtcbiAgICAvLyBDYWxsIHRoZSBzdWJzY3JpYmVyIGZ1bmN0aW9uXG4gICAgdmFyIGNsZWFudXAkMCA9IHN1YnNjcmliZXIuY2FsbCh1bmRlZmluZWQsIG9ic2VydmVyKTtcblxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSB1bmRlZmluZWQsIG51bGwsIGEgc3Vic2NyaXB0aW9uIG9iamVjdCwgb3IgYSBmdW5jdGlvblxuICAgIGlmIChjbGVhbnVwJDAgIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwJDAudW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY2xlYW51cCQwID0gY2xlYW51cEZyb21TdWJzY3JpcHRpb24oY2xlYW51cCQwKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBjbGVhbnVwJDAgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjbGVhbnVwJDAgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgICAgdGhpcy5fY2xlYW51cCA9IGNsZWFudXAkMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHN0YXJ0dXAsIHRoZW4gYXR0ZW1wdCB0byBzZW5kIHRoZSBlcnJvclxuICAgIC8vIHRvIHRoZSBvYnNlcnZlclxuICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBmaW5pc2hlZCwgdGhlbiBwZXJmb3JtIGNsZWFudXBcbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzKSlcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xufVxuXG5hZGRNZXRob2RzKFN1YnNjcmlwdGlvbi5wcm90b3R5cGUgPSB7fSwge1xuICBnZXQgY2xvc2VkKCkgeyByZXR1cm4gc3Vic2NyaXB0aW9uQ2xvc2VkKHRoaXMpIH0sXG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbigpIHsgY2xvc2VTdWJzY3JpcHRpb24odGhpcykgfSxcbn0pO1xuXG5mdW5jdGlvbiBTdWJzY3JpcHRpb25PYnNlcnZlcihzdWJzY3JpcHRpb24pIHtcbiAgdGhpcy5fc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xufVxuXG5hZGRNZXRob2RzKFN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHt9LCB7XG5cbiAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzLl9zdWJzY3JpcHRpb24pIH0sXG5cbiAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSlcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLCBcIm5leHRcIik7XG5cbiAgICAvLyBJZiB0aGUgb2JzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IFwibmV4dFwiLCB0aGVuIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIW0pXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gU2VuZCB0aGUgbmV4dCB2YWx1ZSB0byB0aGUgc2lua1xuICAgIHJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRocm93IHRoZSBlcnJvciB0byB0aGUgY2FsbGVyXG4gICAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKVxuICAgICAgdGhyb3cgdmFsdWU7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG0kMCA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJlcnJvclwiKTtcblxuICAgICAgLy8gSWYgdGhlIHNpbmsgZG9lcyBub3Qgc3VwcG9ydCBcImVycm9yXCIsIHRoZW4gdGhyb3cgdGhlIGVycm9yIHRvIHRoZSBjYWxsZXJcbiAgICAgIGlmICghbSQwKVxuICAgICAgICB0aHJvdyB2YWx1ZTtcblxuICAgICAgdmFsdWUgPSBtJDAuY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB9XG4gICAgICBmaW5hbGx5IHsgdGhyb3cgZSB9XG4gICAgfVxuXG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBjb21wbGV0ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSlcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG0kMSA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJjb21wbGV0ZVwiKTtcblxuICAgICAgLy8gSWYgdGhlIHNpbmsgZG9lcyBub3Qgc3VwcG9ydCBcImNvbXBsZXRlXCIsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgdmFsdWUgPSBtJDEgPyBtJDEuY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB9XG4gICAgICBmaW5hbGx5IHsgdGhyb3cgZSB9XG4gICAgfVxuXG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxufSk7XG5cbmZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICAvLyBUaGUgc3RyZWFtIHN1YnNjcmliZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXG4gIGlmICh0eXBlb2Ygc3Vic2NyaWJlciAhPT0gXCJmdW5jdGlvblwiKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYnNlcnZhYmxlIGluaXRpYWxpemVyIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbn1cblxuYWRkTWV0aG9kcyhPYnNlcnZhYmxlLnByb3RvdHlwZSwge1xuXG4gIHN1YnNjcmliZTogZnVuY3Rpb24ob2JzZXJ2ZXIpIHsgZm9yICh2YXIgYXJncyA9IFtdLCBfXyQwID0gMTsgX18kMCA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrX18kMCkgYXJncy5wdXNoKGFyZ3VtZW50c1tfXyQwXSk7IFxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBvYnNlcnZlcixcbiAgICAgICAgZXJyb3I6IGFyZ3NbMF0sXG4gICAgICAgIGNvbXBsZXRlOiBhcmdzWzFdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gIH0sXG5cbiAgZm9yRWFjaDogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKSk7XG5cbiAgICAgIF9fdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBfc3Vic2NyaXB0aW9uOiBudWxsLFxuXG4gICAgICAgIHN0YXJ0OiBmdW5jdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBpZiAoT2JqZWN0KHN1YnNjcmlwdGlvbikgIT09IHN1YnNjcmlwdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3Vic2NyaXB0aW9uICsgXCIgaXMgbm90IGFuIG9iamVjdFwiKTtcblxuICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgfSxcblxuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJzY3JpcHRpb247XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLmNsb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICBtYXA6IGZ1bmN0aW9uKGZuKSB7IHZhciBfX3RoaXMgPSB0aGlzOyBcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG5cbiAgICB2YXIgQyA9IGdldFNwZWNpZXModGhpcyk7XG5cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHsgcmV0dXJuIF9fdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdHJ5IHsgdmFsdWUgPSBmbih2YWx1ZSkgfVxuICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSkgfVxuXG4gICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9LFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlKHgpIH0sXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIGZpbHRlcjogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgIHZhciBDID0gZ2V0U3BlY2llcyh0aGlzKTtcblxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikgeyByZXR1cm4gX190aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0cnkgeyBpZiAoIWZuKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZCB9XG4gICAgICAgIGNhdGNoIChlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3I6IGZ1bmN0aW9uKGUpIHsgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpIH0sXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7IHJldHVybiBvYnNlcnZlci5jb21wbGV0ZSgpIH0sXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIHJlZHVjZTogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgIHZhciBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICB2YXIgaGFzU2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxO1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHZhciBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBhY2MgPSBzZWVkO1xuXG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uKG9ic2VydmVyKSB7IHJldHVybiBfX3RoaXMuc3Vic2NyaWJlKHtcblxuICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdmFyIGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmaXJzdCB8fCBoYXNTZWVkKSB7XG4gICAgICAgICAgdHJ5IHsgYWNjID0gZm4oYWNjLCB2YWx1ZSkgfVxuICAgICAgICAgIGNhdGNoIChlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IG9ic2VydmVyLmVycm9yKGUpIH0sXG5cbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSAmJiAhaGFzU2VlZCkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVkdWNlIGFuIGVtcHR5IHNlcXVlbmNlXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LFxuXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIGZsYXRNYXA6IGZ1bmN0aW9uKGZuKSB7IHZhciBfX3RoaXMgPSB0aGlzOyBcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG5cbiAgICB2YXIgQyA9IGdldFNwZWNpZXModGhpcyk7XG5cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgb3V0ZXIgT2JzZXJ2YWJsZVxuICAgICAgdmFyIG91dGVyID0gX190aGlzLnN1YnNjcmliZSh7XG5cbiAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih4KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgaW5uZXIgT2JzZXJ2YWJsZVxuICAgICAgICAgIE9ic2VydmFibGUuZnJvbSh2YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIF9zdWJzY3JpcHRpb246IG51bGwsXG5cbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbihzKSB7IHN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLl9zdWJzY3JpcHRpb24gPSBzKSB9LFxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHsgb2JzZXJ2ZXIubmV4dCh2YWx1ZSkgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IG9ic2VydmVyLmVycm9yKGUpIH0sXG5cbiAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YodGhpcy5fc3Vic2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuXG4gICAgICAgICAgICAgIGNsb3NlSWZEb25lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgY2xvc2VJZkRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsb3NlSWZEb25lKCkge1xuICAgICAgICBpZiAoY29tcGxldGVkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMudW5zdWJzY3JpYmUoKTsgfSk7XG4gICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9LFxuXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUucHJvdG90eXBlLCBnZXRTeW1ib2woXCJvYnNlcnZhYmxlXCIpLCB7XG4gIHZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbn0pO1xuXG5hZGRNZXRob2RzKE9ic2VydmFibGUsIHtcblxuICBmcm9tOiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PT0gXCJmdW5jdGlvblwiID8gdGhpcyA6IE9ic2VydmFibGU7XG5cbiAgICBpZiAoeCA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgXCIgaXMgbm90IGFuIG9iamVjdFwiKTtcblxuICAgIHZhciBtZXRob2QgPSBnZXRNZXRob2QoeCwgZ2V0U3ltYm9sKFwib2JzZXJ2YWJsZVwiKSk7XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB2YXIgb2JzZXJ2YWJsZSQwID0gbWV0aG9kLmNhbGwoeCk7XG5cbiAgICAgIGlmIChPYmplY3Qob2JzZXJ2YWJsZSQwKSAhPT0gb2JzZXJ2YWJsZSQwKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG9ic2VydmFibGUkMCArIFwiIGlzIG5vdCBhbiBvYmplY3RcIik7XG5cbiAgICAgIGlmIChvYnNlcnZhYmxlJDAuY29uc3RydWN0b3IgPT09IEMpXG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlJDA7XG5cbiAgICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikgeyByZXR1cm4gb2JzZXJ2YWJsZSQwLnN1YnNjcmliZShvYnNlcnZlcik7IH0pO1xuICAgIH1cblxuICAgIGlmIChoYXNTeW1ib2woXCJpdGVyYXRvclwiKSAmJiAobWV0aG9kID0gZ2V0TWV0aG9kKHgsIGdldFN5bWJvbChcIml0ZXJhdG9yXCIpKSkpIHtcbiAgICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikge1xuICAgICAgICBmb3IgKHZhciBfXyQwID0gKG1ldGhvZC5jYWxsKHgpKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9fJDE7IF9fJDEgPSBfXyQwLm5leHQoKSwgIV9fJDEuZG9uZTspIHsgdmFyIGl0ZW0kMCA9IF9fJDEudmFsdWU7IFxuICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbSQwKTtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgICAgZm9yICh2YXIgaSQwID0gMDsgaSQwIDwgeC5sZW5ndGg7ICsraSQwKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2kkMF0pO1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgXCIgaXMgbm90IG9ic2VydmFibGVcIik7XG4gIH0sXG5cbiAgb2Y6IGZ1bmN0aW9uKCkgeyBmb3IgKHZhciBpdGVtcyA9IFtdLCBfXyQwID0gMDsgX18kMCA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrX18kMCkgaXRlbXMucHVzaChhcmd1bWVudHNbX18kMF0pOyBcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzIDogT2JzZXJ2YWJsZTtcblxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikge1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaXRlbXMubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2kkMV0pO1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfSxcblxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlLCBnZXRTeW1ib2woXCJzcGVjaWVzXCIpLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0sXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbn0pO1xuXG5leHBvcnRzLk9ic2VydmFibGUgPSBPYnNlcnZhYmxlO1xuXG5cbn0sIFwiKlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3plbi1vYnNlcnZhYmxlLmpzXCIpLk9ic2VydmFibGU7XG4iXX0=
const Observable = require("zen-observable");
let sink;
const list = [];
const error = new Error();
new Observable(_sink => {
sink = _sink;
return () => list.push('cleanup');
}).subscribe({
next: val => {
list.push('next:' + val);
throw error;
},
error: err => {
list.push('error-handler:');
list.push(err);
},
complete: () => list.push('complete'),
});
try {
sink.next(1);
} catch (e) {
list.push('try-catch:');
list.push(e);
}
try {
sink.next(2);
} catch (e) {
list.push('try-catch:');
list.push(e);
}
console.log(list);
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"zen-observable": "0.5.2"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
@leebyron
Copy link
Author

leebyron commented Aug 8, 2017

xstream:

const xc = require("xstream").default;

xc.create({
  start: _sink => {
    sink = _sink;
  },
  stop: () => list.push('cleanup'),
})

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment