1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- /* @flow */
- const MAX_STACK_DEPTH = 800
- const noop = _ => _
- const defer = typeof process !== 'undefined' && process.nextTick
- ? process.nextTick
- : typeof Promise !== 'undefined'
- ? fn => Promise.resolve().then(fn)
- : typeof setTimeout !== 'undefined'
- ? setTimeout
- : noop
- if (defer === noop) {
- throw new Error(
- 'Your JavaScript runtime does not support any asynchronous primitives ' +
- 'that are required by vue-server-renderer. Please use a polyfill for ' +
- 'either Promise or setTimeout.'
- )
- }
- export function createWriteFunction (
- write: (text: string, next: Function) => boolean,
- onError: Function
- ): Function {
- let stackDepth = 0
- const cachedWrite = (text, next) => {
- if (text && cachedWrite.caching) {
- cachedWrite.cacheBuffer[cachedWrite.cacheBuffer.length - 1] += text
- }
- const waitForNext = write(text, next)
- if (waitForNext !== true) {
- if (stackDepth >= MAX_STACK_DEPTH) {
- defer(() => {
- try { next() } catch (e) {
- onError(e)
- }
- })
- } else {
- stackDepth++
- next()
- stackDepth--
- }
- }
- }
- cachedWrite.caching = false
- cachedWrite.cacheBuffer = []
- cachedWrite.componentBuffer = []
- return cachedWrite
- }
|