mirror of
				https://github.com/1disk/edp445.git
				synced 2024-08-14 22:47:02 +00:00 
			
		
		
		
	Changed alot of things.
This commit is contained in:
		
							parent
							
								
									a5a0523e5a
								
							
						
					
					
						commit
						3513d5390c
					
				
					 2016 changed files with 336930 additions and 9 deletions
				
			
		
							
								
								
									
										70
									
								
								node_modules/asap/CHANGES.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								node_modules/asap/CHANGES.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | |||
| 
 | ||||
| ## 2.0.6 | ||||
| 
 | ||||
| Version 2.0.4 adds support for React Native by clarifying in package.json that | ||||
| the browser environment does not support Node.js domains. | ||||
| Why this is necessary, we leave as an exercise for the user. | ||||
| 
 | ||||
| ## 2.0.3 | ||||
| 
 | ||||
| Version 2.0.3 fixes a bug when adjusting the capacity of the task queue. | ||||
| 
 | ||||
| ## 2.0.1-2.02 | ||||
| 
 | ||||
| Version 2.0.1 fixes a bug in the way redirects were expressed that affected the | ||||
| function of Browserify, but which Mr would tolerate. | ||||
| 
 | ||||
| ## 2.0.0 | ||||
| 
 | ||||
| Version 2 of ASAP is a full rewrite with a few salient changes. | ||||
| First, the ASAP source is CommonJS only and designed with [Browserify][] and | ||||
| [Browserify-compatible][Mr] module loaders in mind. | ||||
| 
 | ||||
| [Browserify]: https://github.com/substack/node-browserify | ||||
| [Mr]: https://github.com/montagejs/mr | ||||
| 
 | ||||
| The new version has been refactored in two dimensions. | ||||
| Support for Node.js and browsers have been separated, using Browserify | ||||
| redirects and ASAP has been divided into two modules. | ||||
| The "raw" layer depends on the tasks to catch thrown exceptions and unravel | ||||
| Node.js domains. | ||||
| 
 | ||||
| The full implementation of ASAP is loadable as `require("asap")` in both Node.js | ||||
| and browsers. | ||||
| 
 | ||||
| The raw layer that lacks exception handling overhead is loadable as | ||||
| `require("asap/raw")`. | ||||
| The interface is the same for both layers. | ||||
| 
 | ||||
| Tasks are no longer required to be functions, but can rather be any object that | ||||
| implements `task.call()`. | ||||
| With this feature you can recycle task objects to avoid garbage collector churn | ||||
| and avoid closures in general. | ||||
| 
 | ||||
| The implementation has been rigorously documented so that our successors can | ||||
| understand the scope of the problem that this module solves and all of its | ||||
| nuances, ensuring that the next generation of implementations know what details | ||||
| are essential. | ||||
| 
 | ||||
| -   [asap.js](https://github.com/kriskowal/asap/blob/master/asap.js) | ||||
| -   [raw.js](https://github.com/kriskowal/asap/blob/master/raw.js) | ||||
| -   [browser-asap.js](https://github.com/kriskowal/asap/blob/master/browser-asap.js) | ||||
| -   [browser-raw.js](https://github.com/kriskowal/asap/blob/master/browser-raw.js) | ||||
| 
 | ||||
| The new version has also been rigorously tested across a broad spectrum of | ||||
| browsers, in both the window and worker context. | ||||
| The following charts capture the browser test results for the most recent | ||||
| release. | ||||
| The first chart shows test results for ASAP running in the main window context. | ||||
| The second chart shows test results for ASAP running in a web worker context. | ||||
| Test results are inconclusive (grey) on browsers that do not support web | ||||
| workers. | ||||
| These data are captured automatically by [Continuous | ||||
| Integration][]. | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| [Continuous Integration]: https://github.com/kriskowal/asap/blob/master/CONTRIBUTING.md | ||||
| 
 | ||||
							
								
								
									
										21
									
								
								node_modules/asap/LICENSE.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node_modules/asap/LICENSE.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| 
 | ||||
| Copyright 2009–2014 Contributors. All rights reserved. | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to | ||||
| deal in the Software without restriction, including without limitation the | ||||
| rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| sell copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in | ||||
| all copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||||
| IN THE SOFTWARE. | ||||
| 
 | ||||
							
								
								
									
										237
									
								
								node_modules/asap/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								node_modules/asap/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,237 @@ | |||
| # ASAP | ||||
| 
 | ||||
| [](https://travis-ci.org/kriskowal/asap) | ||||
| 
 | ||||
| Promise and asynchronous observer libraries, as well as hand-rolled callback | ||||
| programs and libraries, often need a mechanism to postpone the execution of a | ||||
| callback until the next available event. | ||||
| (See [Designing API’s for Asynchrony][Zalgo].) | ||||
| The `asap` function executes a task **as soon as possible** but not before it | ||||
| returns, waiting only for the completion of the current event and previously | ||||
| scheduled tasks. | ||||
| 
 | ||||
| ```javascript | ||||
| asap(function () { | ||||
|     // ... | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| [Zalgo]: http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony | ||||
| 
 | ||||
| This CommonJS package provides an `asap` module that exports a function that | ||||
| executes a task function *as soon as possible*. | ||||
| 
 | ||||
| ASAP strives to schedule events to occur before yielding for IO, reflow, | ||||
| or redrawing. | ||||
| Each event receives an independent stack, with only platform code in parent | ||||
| frames and the events run in the order they are scheduled. | ||||
| 
 | ||||
| ASAP provides a fast event queue that will execute tasks until it is | ||||
| empty before yielding to the JavaScript engine's underlying event-loop. | ||||
| When a task gets added to a previously empty event queue, ASAP schedules a flush | ||||
| event, preferring for that event to occur before the JavaScript engine has an | ||||
| opportunity to perform IO tasks or rendering, thus making the first task and | ||||
| subsequent tasks semantically indistinguishable. | ||||
| ASAP uses a variety of techniques to preserve this invariant on different | ||||
| versions of browsers and Node.js. | ||||
| 
 | ||||
| By design, ASAP prevents input events from being handled until the task | ||||
| queue is empty. | ||||
| If the process is busy enough, this may cause incoming connection requests to be | ||||
| dropped, and may cause existing connections to inform the sender to reduce the | ||||
| transmission rate or stall. | ||||
| ASAP allows this on the theory that, if there is enough work to do, there is no | ||||
| sense in looking for trouble. | ||||
| As a consequence, ASAP can interfere with smooth animation. | ||||
| If your task should be tied to the rendering loop, consider using | ||||
| `requestAnimationFrame` instead. | ||||
| A long sequence of tasks can also effect the long running script dialog. | ||||
| If this is a problem, you may be able to use ASAP’s cousin `setImmediate` to | ||||
| break long processes into shorter intervals and periodically allow the browser | ||||
| to breathe. | ||||
| `setImmediate` will yield for IO, reflow, and repaint events. | ||||
| It also returns a handler and can be canceled. | ||||
| For a `setImmediate` shim, consider [YuzuJS setImmediate][setImmediate]. | ||||
| 
 | ||||
| [setImmediate]: https://github.com/YuzuJS/setImmediate | ||||
| 
 | ||||
| Take care. | ||||
| ASAP can sustain infinite recursive calls without warning. | ||||
| It will not halt from a stack overflow, and it will not consume unbounded | ||||
| memory. | ||||
| This is behaviorally equivalent to an infinite loop. | ||||
| Just as with infinite loops, you can monitor a Node.js process for this behavior | ||||
| with a heart-beat signal. | ||||
| As with infinite loops, a very small amount of caution goes a long way to | ||||
| avoiding problems. | ||||
| 
 | ||||
| ```javascript | ||||
| function loop() { | ||||
|     asap(loop); | ||||
| } | ||||
| loop(); | ||||
| ``` | ||||
| 
 | ||||
| In browsers, if a task throws an exception, it will not interrupt the flushing | ||||
| of high-priority tasks. | ||||
| The exception will be postponed to a later, low-priority event to avoid | ||||
| slow-downs. | ||||
| In Node.js, if a task throws an exception, ASAP will resume flushing only if—and | ||||
| only after—the error is handled by `domain.on("error")` or | ||||
| `process.on("uncaughtException")`. | ||||
| 
 | ||||
| ## Raw ASAP | ||||
| 
 | ||||
| Checking for exceptions comes at a cost. | ||||
| The package also provides an `asap/raw` module that exports the underlying | ||||
| implementation which is faster but stalls if a task throws an exception. | ||||
| This internal version of the ASAP function does not check for errors. | ||||
| If a task does throw an error, it will stall the event queue unless you manually | ||||
| call `rawAsap.requestFlush()` before throwing the error, or any time after. | ||||
| 
 | ||||
| In Node.js, `asap/raw` also runs all tasks outside any domain. | ||||
| If you need a task to be bound to your domain, you will have to do it manually. | ||||
| 
 | ||||
| ```js | ||||
| if (process.domain) { | ||||
|     task = process.domain.bind(task); | ||||
| } | ||||
| rawAsap(task); | ||||
| ``` | ||||
| 
 | ||||
| ## Tasks | ||||
| 
 | ||||
| A task may be any object that implements `call()`. | ||||
| A function will suffice, but closures tend not to be reusable and can cause | ||||
| garbage collector churn. | ||||
| Both `asap` and `rawAsap` accept task objects to give you the option of | ||||
| recycling task objects or using higher callable object abstractions. | ||||
| See the `asap` source for an illustration. | ||||
| 
 | ||||
| 
 | ||||
| ## Compatibility | ||||
| 
 | ||||
| ASAP is tested on Node.js v0.10 and in a broad spectrum of web browsers. | ||||
| The following charts capture the browser test results for the most recent | ||||
| release. | ||||
| The first chart shows test results for ASAP running in the main window context. | ||||
| The second chart shows test results for ASAP running in a web worker context. | ||||
| Test results are inconclusive (grey) on browsers that do not support web | ||||
| workers. | ||||
| These data are captured automatically by [Continuous | ||||
| Integration][]. | ||||
| 
 | ||||
| [Continuous Integration]: https://github.com/kriskowal/asap/blob/master/CONTRIBUTING.md | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ## Caveats | ||||
| 
 | ||||
| When a task is added to an empty event queue, it is not always possible to | ||||
| guarantee that the task queue will begin flushing immediately after the current | ||||
| event. | ||||
| However, once the task queue begins flushing, it will not yield until the queue | ||||
| is empty, even if the queue grows while executing tasks. | ||||
| 
 | ||||
| The following browsers allow the use of [DOM mutation observers][] to access | ||||
| the HTML [microtask queue][], and thus begin flushing ASAP's task queue | ||||
| immediately at the end of the current event loop turn, before any rendering or | ||||
| IO: | ||||
| 
 | ||||
| [microtask queue]: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#microtask-queue | ||||
| [DOM mutation observers]: http://dom.spec.whatwg.org/#mutation-observers | ||||
| 
 | ||||
| - Android 4–4.3 | ||||
| - Chrome 26–34 | ||||
| - Firefox 14–29 | ||||
| - Internet Explorer 11 | ||||
| - iPad Safari 6–7.1 | ||||
| - iPhone Safari 7–7.1 | ||||
| - Safari 6–7 | ||||
| 
 | ||||
| In the absense of mutation observers, there are a few browsers, and situations | ||||
| like web workers in some of the above browsers,  where [message channels][] | ||||
| would be a useful way to avoid falling back to timers. | ||||
| Message channels give direct access to the HTML [task queue][], so the ASAP | ||||
| task queue would flush after any already queued rendering and IO tasks, but | ||||
| without having the minimum delay imposed by timers. | ||||
| However, among these browsers, Internet Explorer 10 and Safari do not reliably | ||||
| dispatch messages, so they are not worth the trouble to implement. | ||||
| 
 | ||||
| [message channels]: http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#message-channels | ||||
| [task queue]: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#concept-task | ||||
| 
 | ||||
| - Internet Explorer 10 | ||||
| - Safair 5.0-1 | ||||
| - Opera 11-12 | ||||
| 
 | ||||
| In the absense of mutation observers, these browsers and the following browsers | ||||
| all fall back to using `setTimeout` and `setInterval` to ensure that a `flush` | ||||
| occurs. | ||||
| The implementation uses both and cancels whatever handler loses the race, since | ||||
| `setTimeout` tends to occasionally skip tasks in unisolated circumstances. | ||||
| Timers generally delay the flushing of ASAP's task queue for four milliseconds. | ||||
| 
 | ||||
| - Firefox 3–13 | ||||
| - Internet Explorer 6–10 | ||||
| - iPad Safari 4.3 | ||||
| - Lynx 2.8.7 | ||||
| 
 | ||||
| 
 | ||||
| ## Heritage | ||||
| 
 | ||||
| ASAP has been factored out of the [Q][] asynchronous promise library. | ||||
| It originally had a naïve implementation in terms of `setTimeout`, but | ||||
| [Malte Ubl][NonBlocking] provided an insight that `postMessage` might be | ||||
| useful for creating a high-priority, no-delay event dispatch hack. | ||||
| Since then, Internet Explorer proposed and implemented `setImmediate`. | ||||
| Robert Katić began contributing to Q by measuring the performance of | ||||
| the internal implementation of `asap`, paying particular attention to | ||||
| error recovery. | ||||
| Domenic, Robert, and Kris Kowal collectively settled on the current strategy of | ||||
| unrolling the high-priority event queue internally regardless of what strategy | ||||
| we used to dispatch the potentially lower-priority flush event. | ||||
| Domenic went on to make ASAP cooperate with Node.js domains. | ||||
| 
 | ||||
| [Q]: https://github.com/kriskowal/q | ||||
| [NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html | ||||
| 
 | ||||
| For further reading, Nicholas Zakas provided a thorough article on [The | ||||
| Case for setImmediate][NCZ]. | ||||
| 
 | ||||
| [NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/ | ||||
| 
 | ||||
| Ember’s RSVP promise implementation later [adopted][RSVP ASAP] the name ASAP but | ||||
| further developed the implentation. | ||||
| Particularly, The `MessagePort` implementation was abandoned due to interaction | ||||
| [problems with Mobile Internet Explorer][IE Problems] in favor of an | ||||
| implementation backed on the newer and more reliable DOM `MutationObserver` | ||||
| interface. | ||||
| These changes were back-ported into this library. | ||||
| 
 | ||||
| [IE Problems]: https://github.com/cujojs/when/issues/197 | ||||
| [RSVP ASAP]: https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js | ||||
| 
 | ||||
| In addition, ASAP factored into `asap` and `asap/raw`, such that `asap` remained | ||||
| exception-safe, but `asap/raw` provided a tight kernel that could be used for | ||||
| tasks that guaranteed that they would not throw exceptions. | ||||
| This core is useful for promise implementations that capture thrown errors in | ||||
| rejected promises and do not need a second safety net. | ||||
| At the same time, the exception handling in `asap` was factored into separate | ||||
| implementations for Node.js and browsers, using the the [Browserify][Browser | ||||
| Config] `browser` property in `package.json` to instruct browser module loaders | ||||
| and bundlers, including [Browserify][], [Mr][], and [Mop][],  to use the | ||||
| browser-only implementation. | ||||
| 
 | ||||
| [Browser Config]: https://gist.github.com/defunctzombie/4339901 | ||||
| [Browserify]: https://github.com/substack/node-browserify | ||||
| [Mr]: https://github.com/montagejs/mr | ||||
| [Mop]: https://github.com/montagejs/mop | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| Copyright 2009-2014 by Contributors | ||||
| MIT License (enclosed) | ||||
| 
 | ||||
							
								
								
									
										65
									
								
								node_modules/asap/asap.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								node_modules/asap/asap.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| var rawAsap = require("./raw"); | ||||
| var freeTasks = []; | ||||
| 
 | ||||
| /** | ||||
|  * Calls a task as soon as possible after returning, in its own event, with | ||||
|  * priority over IO events. An exception thrown in a task can be handled by | ||||
|  * `process.on("uncaughtException") or `domain.on("error")`, but will otherwise
 | ||||
|  * crash the process. If the error is handled, all subsequent tasks will | ||||
|  * resume. | ||||
|  * | ||||
|  * @param {{call}} task A callable object, typically a function that takes no | ||||
|  * arguments. | ||||
|  */ | ||||
| module.exports = asap; | ||||
| function asap(task) { | ||||
|     var rawTask; | ||||
|     if (freeTasks.length) { | ||||
|         rawTask = freeTasks.pop(); | ||||
|     } else { | ||||
|         rawTask = new RawTask(); | ||||
|     } | ||||
|     rawTask.task = task; | ||||
|     rawTask.domain = process.domain; | ||||
|     rawAsap(rawTask); | ||||
| } | ||||
| 
 | ||||
| function RawTask() { | ||||
|     this.task = null; | ||||
|     this.domain = null; | ||||
| } | ||||
| 
 | ||||
| RawTask.prototype.call = function () { | ||||
|     if (this.domain) { | ||||
|         this.domain.enter(); | ||||
|     } | ||||
|     var threw = true; | ||||
|     try { | ||||
|         this.task.call(); | ||||
|         threw = false; | ||||
|         // If the task throws an exception (presumably) Node.js restores the
 | ||||
|         // domain stack for the next event.
 | ||||
|         if (this.domain) { | ||||
|             this.domain.exit(); | ||||
|         } | ||||
|     } finally { | ||||
|         // We use try/finally and a threw flag to avoid messing up stack traces
 | ||||
|         // when we catch and release errors.
 | ||||
|         if (threw) { | ||||
|             // In Node.js, uncaught exceptions are considered fatal errors.
 | ||||
|             // Re-throw them to interrupt flushing!
 | ||||
|             // Ensure that flushing continues if an uncaught exception is
 | ||||
|             // suppressed listening process.on("uncaughtException") or
 | ||||
|             // domain.on("error").
 | ||||
|             rawAsap.requestFlush(); | ||||
|         } | ||||
|         // If the task threw an error, we do not want to exit the domain here.
 | ||||
|         // Exiting the domain would prevent the domain from catching the error.
 | ||||
|         this.task = null; | ||||
|         this.domain = null; | ||||
|         freeTasks.push(this); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
							
								
								
									
										66
									
								
								node_modules/asap/browser-asap.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								node_modules/asap/browser-asap.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,66 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| // rawAsap provides everything we need except exception management.
 | ||||
| var rawAsap = require("./raw"); | ||||
| // RawTasks are recycled to reduce GC churn.
 | ||||
| var freeTasks = []; | ||||
| // We queue errors to ensure they are thrown in right order (FIFO).
 | ||||
| // Array-as-queue is good enough here, since we are just dealing with exceptions.
 | ||||
| var pendingErrors = []; | ||||
| var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); | ||||
| 
 | ||||
| function throwFirstError() { | ||||
|     if (pendingErrors.length) { | ||||
|         throw pendingErrors.shift(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Calls a task as soon as possible after returning, in its own event, with priority | ||||
|  * over other events like animation, reflow, and repaint. An error thrown from an | ||||
|  * event will not interrupt, nor even substantially slow down the processing of | ||||
|  * other events, but will be rather postponed to a lower priority event. | ||||
|  * @param {{call}} task A callable object, typically a function that takes no | ||||
|  * arguments. | ||||
|  */ | ||||
| module.exports = asap; | ||||
| function asap(task) { | ||||
|     var rawTask; | ||||
|     if (freeTasks.length) { | ||||
|         rawTask = freeTasks.pop(); | ||||
|     } else { | ||||
|         rawTask = new RawTask(); | ||||
|     } | ||||
|     rawTask.task = task; | ||||
|     rawAsap(rawTask); | ||||
| } | ||||
| 
 | ||||
| // We wrap tasks with recyclable task objects.  A task object implements
 | ||||
| // `call`, just like a function.
 | ||||
| function RawTask() { | ||||
|     this.task = null; | ||||
| } | ||||
| 
 | ||||
| // The sole purpose of wrapping the task is to catch the exception and recycle
 | ||||
| // the task object after its single use.
 | ||||
| RawTask.prototype.call = function () { | ||||
|     try { | ||||
|         this.task.call(); | ||||
|     } catch (error) { | ||||
|         if (asap.onerror) { | ||||
|             // This hook exists purely for testing purposes.
 | ||||
|             // Its name will be periodically randomized to break any code that
 | ||||
|             // depends on its existence.
 | ||||
|             asap.onerror(error); | ||||
|         } else { | ||||
|             // In a web browser, exceptions are not fatal. However, to avoid
 | ||||
|             // slowing down the queue of pending tasks, we rethrow the error in a
 | ||||
|             // lower priority turn.
 | ||||
|             pendingErrors.push(error); | ||||
|             requestErrorThrow(); | ||||
|         } | ||||
|     } finally { | ||||
|         this.task = null; | ||||
|         freeTasks[freeTasks.length] = this; | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										223
									
								
								node_modules/asap/browser-raw.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								node_modules/asap/browser-raw.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,223 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| // Use the fastest means possible to execute a task in its own turn, with
 | ||||
| // priority over other events including IO, animation, reflow, and redraw
 | ||||
| // events in browsers.
 | ||||
| //
 | ||||
| // An exception thrown by a task will permanently interrupt the processing of
 | ||||
| // subsequent tasks. The higher level `asap` function ensures that if an
 | ||||
| // exception is thrown by a task, that the task queue will continue flushing as
 | ||||
| // soon as possible, but if you use `rawAsap` directly, you are responsible to
 | ||||
| // either ensure that no exceptions are thrown from your task, or to manually
 | ||||
| // call `rawAsap.requestFlush` if an exception is thrown.
 | ||||
| module.exports = rawAsap; | ||||
| function rawAsap(task) { | ||||
|     if (!queue.length) { | ||||
|         requestFlush(); | ||||
|         flushing = true; | ||||
|     } | ||||
|     // Equivalent to push, but avoids a function call.
 | ||||
|     queue[queue.length] = task; | ||||
| } | ||||
| 
 | ||||
| var queue = []; | ||||
| // Once a flush has been requested, no further calls to `requestFlush` are
 | ||||
| // necessary until the next `flush` completes.
 | ||||
| var flushing = false; | ||||
| // `requestFlush` is an implementation-specific method that attempts to kick
 | ||||
| // off a `flush` event as quickly as possible. `flush` will attempt to exhaust
 | ||||
| // the event queue before yielding to the browser's own event loop.
 | ||||
| var requestFlush; | ||||
| // The position of the next task to execute in the task queue. This is
 | ||||
| // preserved between calls to `flush` so that it can be resumed if
 | ||||
| // a task throws an exception.
 | ||||
| var index = 0; | ||||
| // If a task schedules additional tasks recursively, the task queue can grow
 | ||||
| // unbounded. To prevent memory exhaustion, the task queue will periodically
 | ||||
| // truncate already-completed tasks.
 | ||||
| var capacity = 1024; | ||||
| 
 | ||||
| // The flush function processes all tasks that have been scheduled with
 | ||||
| // `rawAsap` unless and until one of those tasks throws an exception.
 | ||||
| // If a task throws an exception, `flush` ensures that its state will remain
 | ||||
| // consistent and will resume where it left off when called again.
 | ||||
| // However, `flush` does not make any arrangements to be called again if an
 | ||||
| // exception is thrown.
 | ||||
| function flush() { | ||||
|     while (index < queue.length) { | ||||
|         var currentIndex = index; | ||||
|         // Advance the index before calling the task. This ensures that we will
 | ||||
|         // begin flushing on the next task the task throws an error.
 | ||||
|         index = index + 1; | ||||
|         queue[currentIndex].call(); | ||||
|         // Prevent leaking memory for long chains of recursive calls to `asap`.
 | ||||
|         // If we call `asap` within tasks scheduled by `asap`, the queue will
 | ||||
|         // grow, but to avoid an O(n) walk for every task we execute, we don't
 | ||||
|         // shift tasks off the queue after they have been executed.
 | ||||
|         // Instead, we periodically shift 1024 tasks off the queue.
 | ||||
|         if (index > capacity) { | ||||
|             // Manually shift all values starting at the index back to the
 | ||||
|             // beginning of the queue.
 | ||||
|             for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { | ||||
|                 queue[scan] = queue[scan + index]; | ||||
|             } | ||||
|             queue.length -= index; | ||||
|             index = 0; | ||||
|         } | ||||
|     } | ||||
|     queue.length = 0; | ||||
|     index = 0; | ||||
|     flushing = false; | ||||
| } | ||||
| 
 | ||||
| // `requestFlush` is implemented using a strategy based on data collected from
 | ||||
| // every available SauceLabs Selenium web driver worker at time of writing.
 | ||||
| // https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
 | ||||
| 
 | ||||
| // Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
 | ||||
| // have WebKitMutationObserver but not un-prefixed MutationObserver.
 | ||||
| // Must use `global` or `self` instead of `window` to work in both frames and web
 | ||||
| // workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
 | ||||
| 
 | ||||
| /* globals self */ | ||||
| var scope = typeof global !== "undefined" ? global : self; | ||||
| var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; | ||||
| 
 | ||||
| // MutationObservers are desirable because they have high priority and work
 | ||||
| // reliably everywhere they are implemented.
 | ||||
| // They are implemented in all modern browsers.
 | ||||
| //
 | ||||
| // - Android 4-4.3
 | ||||
| // - Chrome 26-34
 | ||||
| // - Firefox 14-29
 | ||||
| // - Internet Explorer 11
 | ||||
| // - iPad Safari 6-7.1
 | ||||
| // - iPhone Safari 7-7.1
 | ||||
| // - Safari 6-7
 | ||||
| if (typeof BrowserMutationObserver === "function") { | ||||
|     requestFlush = makeRequestCallFromMutationObserver(flush); | ||||
| 
 | ||||
| // MessageChannels are desirable because they give direct access to the HTML
 | ||||
| // task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
 | ||||
| // 11-12, and in web workers in many engines.
 | ||||
| // Although message channels yield to any queued rendering and IO tasks, they
 | ||||
| // would be better than imposing the 4ms delay of timers.
 | ||||
| // However, they do not work reliably in Internet Explorer or Safari.
 | ||||
| 
 | ||||
| // Internet Explorer 10 is the only browser that has setImmediate but does
 | ||||
| // not have MutationObservers.
 | ||||
| // Although setImmediate yields to the browser's renderer, it would be
 | ||||
| // preferrable to falling back to setTimeout since it does not have
 | ||||
| // the minimum 4ms penalty.
 | ||||
| // Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
 | ||||
| // Desktop to a lesser extent) that renders both setImmediate and
 | ||||
| // MessageChannel useless for the purposes of ASAP.
 | ||||
| // https://github.com/kriskowal/q/issues/396
 | ||||
| 
 | ||||
| // Timers are implemented universally.
 | ||||
| // We fall back to timers in workers in most engines, and in foreground
 | ||||
| // contexts in the following browsers.
 | ||||
| // However, note that even this simple case requires nuances to operate in a
 | ||||
| // broad spectrum of browsers.
 | ||||
| //
 | ||||
| // - Firefox 3-13
 | ||||
| // - Internet Explorer 6-9
 | ||||
| // - iPad Safari 4.3
 | ||||
| // - Lynx 2.8.7
 | ||||
| } else { | ||||
|     requestFlush = makeRequestCallFromTimer(flush); | ||||
| } | ||||
| 
 | ||||
| // `requestFlush` requests that the high priority event queue be flushed as
 | ||||
| // soon as possible.
 | ||||
| // This is useful to prevent an error thrown in a task from stalling the event
 | ||||
| // queue if the exception handled by Node.js’s
 | ||||
| // `process.on("uncaughtException")` or by a domain.
 | ||||
| rawAsap.requestFlush = requestFlush; | ||||
| 
 | ||||
| // To request a high priority event, we induce a mutation observer by toggling
 | ||||
| // the text of a text node between "1" and "-1".
 | ||||
| function makeRequestCallFromMutationObserver(callback) { | ||||
|     var toggle = 1; | ||||
|     var observer = new BrowserMutationObserver(callback); | ||||
|     var node = document.createTextNode(""); | ||||
|     observer.observe(node, {characterData: true}); | ||||
|     return function requestCall() { | ||||
|         toggle = -toggle; | ||||
|         node.data = toggle; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| // The message channel technique was discovered by Malte Ubl and was the
 | ||||
| // original foundation for this library.
 | ||||
| // http://www.nonblocking.io/2011/06/windownexttick.html
 | ||||
| 
 | ||||
| // Safari 6.0.5 (at least) intermittently fails to create message ports on a
 | ||||
| // page's first load. Thankfully, this version of Safari supports
 | ||||
| // MutationObservers, so we don't need to fall back in that case.
 | ||||
| 
 | ||||
| // function makeRequestCallFromMessageChannel(callback) {
 | ||||
| //     var channel = new MessageChannel();
 | ||||
| //     channel.port1.onmessage = callback;
 | ||||
| //     return function requestCall() {
 | ||||
| //         channel.port2.postMessage(0);
 | ||||
| //     };
 | ||||
| // }
 | ||||
| 
 | ||||
| // For reasons explained above, we are also unable to use `setImmediate`
 | ||||
| // under any circumstances.
 | ||||
| // Even if we were, there is another bug in Internet Explorer 10.
 | ||||
| // It is not sufficient to assign `setImmediate` to `requestFlush` because
 | ||||
| // `setImmediate` must be called *by name* and therefore must be wrapped in a
 | ||||
| // closure.
 | ||||
| // Never forget.
 | ||||
| 
 | ||||
| // function makeRequestCallFromSetImmediate(callback) {
 | ||||
| //     return function requestCall() {
 | ||||
| //         setImmediate(callback);
 | ||||
| //     };
 | ||||
| // }
 | ||||
| 
 | ||||
| // Safari 6.0 has a problem where timers will get lost while the user is
 | ||||
| // scrolling. This problem does not impact ASAP because Safari 6.0 supports
 | ||||
| // mutation observers, so that implementation is used instead.
 | ||||
| // However, if we ever elect to use timers in Safari, the prevalent work-around
 | ||||
| // is to add a scroll event listener that calls for a flush.
 | ||||
| 
 | ||||
| // `setTimeout` does not call the passed callback if the delay is less than
 | ||||
| // approximately 7 in web workers in Firefox 8 through 18, and sometimes not
 | ||||
| // even then.
 | ||||
| 
 | ||||
| function makeRequestCallFromTimer(callback) { | ||||
|     return function requestCall() { | ||||
|         // We dispatch a timeout with a specified delay of 0 for engines that
 | ||||
|         // can reliably accommodate that request. This will usually be snapped
 | ||||
|         // to a 4 milisecond delay, but once we're flushing, there's no delay
 | ||||
|         // between events.
 | ||||
|         var timeoutHandle = setTimeout(handleTimer, 0); | ||||
|         // However, since this timer gets frequently dropped in Firefox
 | ||||
|         // workers, we enlist an interval handle that will try to fire
 | ||||
|         // an event 20 times per second until it succeeds.
 | ||||
|         var intervalHandle = setInterval(handleTimer, 50); | ||||
| 
 | ||||
|         function handleTimer() { | ||||
|             // Whichever timer succeeds will cancel both timers and
 | ||||
|             // execute the callback.
 | ||||
|             clearTimeout(timeoutHandle); | ||||
|             clearInterval(intervalHandle); | ||||
|             callback(); | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| // This is for `asap.js` only.
 | ||||
| // Its name will be periodically randomized to break any code that depends on
 | ||||
| // its existence.
 | ||||
| rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; | ||||
| 
 | ||||
| // ASAP was originally a nextTick shim included in Q. This was factored out
 | ||||
| // into this ASAP package. It was later adapted to RSVP which made further
 | ||||
| // amendments. These decisions, particularly to marginalize MessageChannel and
 | ||||
| // to capture the MutationObserver implementation in a closure, were integrated
 | ||||
| // back into ASAP proper.
 | ||||
| // https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
 | ||||
							
								
								
									
										58
									
								
								node_modules/asap/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								node_modules/asap/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| { | ||||
|   "name": "asap", | ||||
|   "version": "2.0.6", | ||||
|   "description": "High-priority task queue for Node.js and browsers", | ||||
|   "keywords": [ | ||||
|     "event", | ||||
|     "task", | ||||
|     "queue" | ||||
|   ], | ||||
|   "license": "MIT", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "https://github.com/kriskowal/asap.git" | ||||
|   }, | ||||
|   "main": "./asap.js", | ||||
|   "browser": { | ||||
|     "./asap": "./browser-asap.js", | ||||
|     "./asap.js": "./browser-asap.js", | ||||
|     "./raw": "./browser-raw.js", | ||||
|     "./raw.js": "./browser-raw.js", | ||||
|     "./test/domain.js": "./test/browser-domain.js" | ||||
|   }, | ||||
|   "react-native": { | ||||
|     "domain": false | ||||
|   }, | ||||
|   "files": [ | ||||
|     "raw.js", | ||||
|     "asap.js", | ||||
|     "browser-raw.js", | ||||
|     "browser-asap.js" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "test": "npm run lint && npm run test-node", | ||||
|     "test-travis": "npm run lint && npm run test-node && npm run test-saucelabs && npm run test-saucelabs-worker", | ||||
|     "test-node": "node test/asap-test.js", | ||||
|     "test-publish": "node scripts/publish-bundle.js test/asap-test.js | pbcopy", | ||||
|     "test-browser": "node scripts/publish-bundle.js test/asap-test.js | xargs opener", | ||||
|     "test-saucelabs": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-spot-configurations.json", | ||||
|     "test-saucelabs-all": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-all-configurations.json", | ||||
|     "test-saucelabs-worker": "node scripts/saucelabs-worker-test.js scripts/saucelabs-spot-configurations.json", | ||||
|     "test-saucelabs-worker-all": "node scripts/saucelabs-worker-test.js scripts/saucelabs-all-configurations.json", | ||||
|     "lint": "jshint raw.js asap.js browser-raw.js browser-asap.js $(find scripts -name '*.js' | grep -v gauntlet)", | ||||
|     "benchmarks": "node benchmarks" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "events": "^1.0.1", | ||||
|     "jshint": "^2.5.1", | ||||
|     "knox": "^0.8.10", | ||||
|     "mr": "^2.0.5", | ||||
|     "opener": "^1.3.0", | ||||
|     "q": "^2.0.3", | ||||
|     "q-io": "^2.0.3", | ||||
|     "saucelabs": "^0.1.1", | ||||
|     "wd": "^0.2.21", | ||||
|     "weak-map": "^1.0.5", | ||||
|     "benchmark": "^1.0.0" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										101
									
								
								node_modules/asap/raw.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								node_modules/asap/raw.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,101 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| var domain; // The domain module is executed on demand
 | ||||
| var hasSetImmediate = typeof setImmediate === "function"; | ||||
| 
 | ||||
| // Use the fastest means possible to execute a task in its own turn, with
 | ||||
| // priority over other events including network IO events in Node.js.
 | ||||
| //
 | ||||
| // An exception thrown by a task will permanently interrupt the processing of
 | ||||
| // subsequent tasks. The higher level `asap` function ensures that if an
 | ||||
| // exception is thrown by a task, that the task queue will continue flushing as
 | ||||
| // soon as possible, but if you use `rawAsap` directly, you are responsible to
 | ||||
| // either ensure that no exceptions are thrown from your task, or to manually
 | ||||
| // call `rawAsap.requestFlush` if an exception is thrown.
 | ||||
| module.exports = rawAsap; | ||||
| function rawAsap(task) { | ||||
|     if (!queue.length) { | ||||
|         requestFlush(); | ||||
|         flushing = true; | ||||
|     } | ||||
|     // Avoids a function call
 | ||||
|     queue[queue.length] = task; | ||||
| } | ||||
| 
 | ||||
| var queue = []; | ||||
| // Once a flush has been requested, no further calls to `requestFlush` are
 | ||||
| // necessary until the next `flush` completes.
 | ||||
| var flushing = false; | ||||
| // The position of the next task to execute in the task queue. This is
 | ||||
| // preserved between calls to `flush` so that it can be resumed if
 | ||||
| // a task throws an exception.
 | ||||
| var index = 0; | ||||
| // If a task schedules additional tasks recursively, the task queue can grow
 | ||||
| // unbounded. To prevent memory excaustion, the task queue will periodically
 | ||||
| // truncate already-completed tasks.
 | ||||
| var capacity = 1024; | ||||
| 
 | ||||
| // The flush function processes all tasks that have been scheduled with
 | ||||
| // `rawAsap` unless and until one of those tasks throws an exception.
 | ||||
| // If a task throws an exception, `flush` ensures that its state will remain
 | ||||
| // consistent and will resume where it left off when called again.
 | ||||
| // However, `flush` does not make any arrangements to be called again if an
 | ||||
| // exception is thrown.
 | ||||
| function flush() { | ||||
|     while (index < queue.length) { | ||||
|         var currentIndex = index; | ||||
|         // Advance the index before calling the task. This ensures that we will
 | ||||
|         // begin flushing on the next task the task throws an error.
 | ||||
|         index = index + 1; | ||||
|         queue[currentIndex].call(); | ||||
|         // Prevent leaking memory for long chains of recursive calls to `asap`.
 | ||||
|         // If we call `asap` within tasks scheduled by `asap`, the queue will
 | ||||
|         // grow, but to avoid an O(n) walk for every task we execute, we don't
 | ||||
|         // shift tasks off the queue after they have been executed.
 | ||||
|         // Instead, we periodically shift 1024 tasks off the queue.
 | ||||
|         if (index > capacity) { | ||||
|             // Manually shift all values starting at the index back to the
 | ||||
|             // beginning of the queue.
 | ||||
|             for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { | ||||
|                 queue[scan] = queue[scan + index]; | ||||
|             } | ||||
|             queue.length -= index; | ||||
|             index = 0; | ||||
|         } | ||||
|     } | ||||
|     queue.length = 0; | ||||
|     index = 0; | ||||
|     flushing = false; | ||||
| } | ||||
| 
 | ||||
| rawAsap.requestFlush = requestFlush; | ||||
| function requestFlush() { | ||||
|     // Ensure flushing is not bound to any domain.
 | ||||
|     // It is not sufficient to exit the domain, because domains exist on a stack.
 | ||||
|     // To execute code outside of any domain, the following dance is necessary.
 | ||||
|     var parentDomain = process.domain; | ||||
|     if (parentDomain) { | ||||
|         if (!domain) { | ||||
|             // Lazy execute the domain module.
 | ||||
|             // Only employed if the user elects to use domains.
 | ||||
|             domain = require("domain"); | ||||
|         } | ||||
|         domain.active = process.domain = null; | ||||
|     } | ||||
| 
 | ||||
|     // `setImmediate` is slower that `process.nextTick`, but `process.nextTick`
 | ||||
|     // cannot handle recursion.
 | ||||
|     // `requestFlush` will only be called recursively from `asap.js`, to resume
 | ||||
|     // flushing after an error is thrown into a domain.
 | ||||
|     // Conveniently, `setImmediate` was introduced in the same version
 | ||||
|     // `process.nextTick` started throwing recursion errors.
 | ||||
|     if (flushing && hasSetImmediate) { | ||||
|         setImmediate(flush); | ||||
|     } else { | ||||
|         process.nextTick(flush); | ||||
|     } | ||||
| 
 | ||||
|     if (parentDomain) { | ||||
|         domain.active = process.domain = parentDomain; | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue