From 1902b61b9f6a0ebe5a8abcf97cc041fd5c7bd51c Mon Sep 17 00:00:00 2001 From: pikax Date: Sun, 29 Mar 2020 22:01:24 +0100 Subject: [PATCH 01/11] feat: webWorkerFunction --- docs/api/web.api.md | 781 +++++++++++------- .../src/components/HelloWorld.vue | 49 +- packages/web/src/web/index.ts | 1 + packages/web/src/web/webWorker/_runner.js | 14 + packages/web/src/web/webWorker/index.ts | 1 + packages/web/src/web/webWorker/webWorker.ts | 83 ++ tsconfig.json | 2 +- 7 files changed, 636 insertions(+), 295 deletions(-) create mode 100644 packages/web/src/web/webWorker/_runner.js create mode 100644 packages/web/src/web/webWorker/index.ts create mode 100644 packages/web/src/web/webWorker/webWorker.ts diff --git a/docs/api/web.api.md b/docs/api/web.api.md index f4f7c05ca..dc54ef933 100644 --- a/docs/api/web.api.md +++ b/docs/api/web.api.md @@ -3,29 +3,29 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts - -import { Ref } from '@vue/composition-api'; -import { RefElement } from '@vue-composable/core'; -import { RefTyped } from '@vue-composable/core'; +import { Ref } from "@vue/composition-api"; +import { RefElement } from "@vue-composable/core"; +import { RefTyped } from "@vue-composable/core"; // @public (undocumented) export type BreakpointObject = Record; // @public (undocumented) -export type BreakpointReturn = Record> & BreakpointReturnObject; +export type BreakpointReturn = Record> & + BreakpointReturnObject; // @public (undocumented) export interface BreakpointReturnObject { - // (undocumented) - current: Ref; - // (undocumented) - remove: RemoveEventFunction; + // (undocumented) + current: Ref; + // (undocumented) + remove: RemoveEventFunction; } // @public (undocumented) export interface BroadcastMessageEvent extends MessageEvent { - // (undocumented) - readonly data: T; + // (undocumented) + readonly data: T; } // @public @@ -33,10 +33,10 @@ export type CssVarDef = CssVarDefinition | string; // @public export interface CssVarDefinition { - // (undocumented) - name: string; - // (undocumented) - value: RefTyped; + // (undocumented) + name: string; + // (undocumented) + value: RefTyped; } // @public @@ -50,73 +50,80 @@ export type CssVariableObject = Record>; // @public export interface CssVariablesMethods { - observing: Ref; - resume: () => void; - stop: () => void; - // (undocumented) - supported: boolean; + observing: Ref; + resume: () => void; + stop: () => void; + // (undocumented) + supported: boolean; } // @public (undocumented) export interface DefaultTailwindBreakpoints { - // (undocumented) - lg: 1024; - // (undocumented) - md: 768; - // (undocumented) - sm: 640; - // (undocumented) - xl: 1280; + // (undocumented) + lg: 1024; + // (undocumented) + md: 768; + // (undocumented) + sm: 640; + // (undocumented) + xl: 1280; } // Warning: (ae-forgotten-export) The symbol "TailwindConfigEmpty" needs to be exported by the entry point index.d.ts // // @public (undocumented) -export type ExtractTailwindScreens = keyof T["theme"]["screens"] extends never ? DefaultTailwindBreakpoints : T["theme"]["screens"]; +export type ExtractTailwindScreens< + T extends TailwindConfigEmpty +> = keyof T["theme"]["screens"] extends never + ? DefaultTailwindBreakpoints + : T["theme"]["screens"]; // @public (undocumented) export interface GeolocationOptions { - immediate?: boolean; + immediate?: boolean; } // @public -export function getCssVariableFor(element: HTMLElement, name: string): CssVariable; +export function getCssVariableFor( + element: HTMLElement, + name: string +): CssVariable; // @public (undocumented) export interface IntersectionObserverOptions { - // (undocumented) - root?: RefTyped | null; - // (undocumented) - rootMargin?: RefTyped | string; - // (undocumented) - threshold?: RefTyped | number | number[]; + // (undocumented) + root?: RefTyped | null; + // (undocumented) + rootMargin?: RefTyped | string; + // (undocumented) + threshold?: RefTyped | number | number[]; } // @public (undocumented) export interface IntersectionObserverResult { - // (undocumented) - disconnect: () => void; - // (undocumented) - elements: Ref; - // (undocumented) - readonly isIntersecting: Ref; - // (undocumented) - observe: (el: RefTyped) => void; - // (undocumented) - supported: boolean; - // (undocumented) - unobserve: (el: RefTyped) => void; + // (undocumented) + disconnect: () => void; + // (undocumented) + elements: Ref; + // (undocumented) + readonly isIntersecting: Ref; + // (undocumented) + observe: (el: RefTyped) => void; + // (undocumented) + supported: boolean; + // (undocumented) + unobserve: (el: RefTyped) => void; } // @public (undocumented) export interface LocalStorageReturn { - clear: () => void; - remove: () => void; - setSync: (sync: boolean) => void; - // (undocumented) - storage: Ref; - // (undocumented) - supported: boolean; + clear: () => void; + remove: () => void; + setSync: (sync: boolean) => void; + // (undocumented) + storage: Ref; + // (undocumented) + supported: boolean; } // @public (undocumented) @@ -124,112 +131,144 @@ export type LocalStorageTyped = string; // @public (undocumented) export interface MouseMoveResult { - // (undocumented) - mouseX: Ref; - // (undocumented) - mouseY: Ref; - // (undocumented) - remove: RemoveEventFunction; + // (undocumented) + mouseX: Ref; + // (undocumented) + mouseY: Ref; + // (undocumented) + remove: RemoveEventFunction; } // @public (undocumented) export interface NetworkInformation { - // Warning: (ae-forgotten-export) The symbol "NetworkInformationEventMap" needs to be exported by the entry point index.d.ts - // - // (undocumented) - addEventListener(type: K, listener: (this: NetworkInformation, ev: NetworkInformationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - // (undocumented) - addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; - // (undocumented) - readonly downlink: number; - // (undocumented) - readonly downlinkMax: number; - // Warning: (ae-forgotten-export) The symbol "NetworkInformationEffectiveType" needs to be exported by the entry point index.d.ts - // - // (undocumented) - readonly effectiveType: NetworkInformationEffectiveType; - // (undocumented) - onchange: (this: NetworkInformation, ev: Event) => void; - // (undocumented) - removeEventListener(type: K, listener: (this: NetworkInformation, ev: NetworkInformationEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - // (undocumented) - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; - // (undocumented) - readonly rtt: number; - // (undocumented) - readonly saveData: Boolean; - // Warning: (ae-forgotten-export) The symbol "NetworkInformationType" needs to be exported by the entry point index.d.ts - // - // (undocumented) - readonly type: NetworkInformationType; + // Warning: (ae-forgotten-export) The symbol "NetworkInformationEventMap" needs to be exported by the entry point index.d.ts + // + // (undocumented) + addEventListener( + type: K, + listener: ( + this: NetworkInformation, + ev: NetworkInformationEventMap[K] + ) => any, + options?: boolean | AddEventListenerOptions + ): void; + // (undocumented) + addEventListener( + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions + ): void; + // (undocumented) + readonly downlink: number; + // (undocumented) + readonly downlinkMax: number; + // Warning: (ae-forgotten-export) The symbol "NetworkInformationEffectiveType" needs to be exported by the entry point index.d.ts + // + // (undocumented) + readonly effectiveType: NetworkInformationEffectiveType; + // (undocumented) + onchange: (this: NetworkInformation, ev: Event) => void; + // (undocumented) + removeEventListener( + type: K, + listener: ( + this: NetworkInformation, + ev: NetworkInformationEventMap[K] + ) => any, + options?: boolean | EventListenerOptions + ): void; + // (undocumented) + removeEventListener( + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | EventListenerOptions + ): void; + // (undocumented) + readonly rtt: number; + // (undocumented) + readonly saveData: Boolean; + // Warning: (ae-forgotten-export) The symbol "NetworkInformationType" needs to be exported by the entry point index.d.ts + // + // (undocumented) + readonly type: NetworkInformationType; } // @public (undocumented) -export function refShared(defaultValue?: RefTyped, id?: string): Ref>; +export function refShared( + defaultValue?: RefTyped, + id?: string +): Ref>; // @public (undocumented) -export type RefSharedMessage = RefSharedMessageInit | RefSharedMessageSync | RefSharedMessageLeave | RefSharedMessageUpdate | RefSharedMessageSetMind | RefSharedMessagePing | RefSharedMessagePong; +export type RefSharedMessage = + | RefSharedMessageInit + | RefSharedMessageSync + | RefSharedMessageLeave + | RefSharedMessageUpdate + | RefSharedMessageSetMind + | RefSharedMessagePing + | RefSharedMessagePong; // @public (undocumented) export type RefSharedMessageInit = { - type: RefSharedMessageType.INIT; + type: RefSharedMessageType.INIT; }; // @public (undocumented) export type RefSharedMessageLeave = { - type: RefSharedMessageType.LEAVE; - id: number; + type: RefSharedMessageType.LEAVE; + id: number; }; // @public (undocumented) export type RefSharedMessagePing = { - type: RefSharedMessageType.PING; - id: number; + type: RefSharedMessageType.PING; + id: number; }; // @public (undocumented) export type RefSharedMessagePong = { - type: RefSharedMessageType.PONG; - id: number; + type: RefSharedMessageType.PONG; + id: number; }; // @public (undocumented) export type RefSharedMessageSetMind = { - type: RefSharedMessageType.SET_MIND; - mind: SharedRefMind; - id: number; + type: RefSharedMessageType.SET_MIND; + mind: SharedRefMind; + id: number; }; // @public (undocumented) export type RefSharedMessageSync = { - type: RefSharedMessageType.SYNC; - value: T; - mind: SharedRefMind; + type: RefSharedMessageType.SYNC; + value: T; + mind: SharedRefMind; }; // @public (undocumented) export const enum RefSharedMessageType { - // (undocumented) - INIT = 0, - // (undocumented) - LEAVE = 4, - // (undocumented) - PING = 5, - // (undocumented) - PONG = 6, - // (undocumented) - SET_MIND = 3, - // (undocumented) - SYNC = 1, - // (undocumented) - UPDATE = 2 + // (undocumented) + INIT = 0, + // (undocumented) + LEAVE = 4, + // (undocumented) + PING = 5, + // (undocumented) + PONG = 6, + // (undocumented) + SET_MIND = 3, + // (undocumented) + SYNC = 1, + // (undocumented) + UPDATE = 2 } // @public (undocumented) export type RefSharedMessageUpdate = { - type: RefSharedMessageType.UPDATE; - value: T; - mind: SharedRefMind; + type: RefSharedMessageType.UPDATE; + value: T; + mind: SharedRefMind; }; // @public (undocumented) @@ -237,45 +276,53 @@ export type RemoveEventFunction = () => void; // @public (undocumented) export interface ResizeResult { - // (undocumented) - height: Ref; - // (undocumented) - remove: RemoveEventFunction; - // (undocumented) - width: Ref; + // (undocumented) + height: Ref; + // (undocumented) + remove: RemoveEventFunction; + // (undocumented) + width: Ref; } // @public (undocumented) export interface ScrollResult { - // (undocumented) - remove: RemoveEventFunction; - // (undocumented) - scrollLeft: Ref; - // (undocumented) - scrollLeftTo: (x: number) => void; - // (undocumented) - scrollTo: Element["scrollTo"]; - // (undocumented) - scrollTop: Ref; - // (undocumented) - scrollTopTo: (y: number) => void; + // (undocumented) + remove: RemoveEventFunction; + // (undocumented) + scrollLeft: Ref; + // (undocumented) + scrollLeftTo: (x: number) => void; + // (undocumented) + scrollTo: Element["scrollTo"]; + // (undocumented) + scrollTop: Ref; + // (undocumented) + scrollTopTo: (y: number) => void; } // @public (undocumented) -export function setBreakpointTailwindCSS(tailwindConfig: T): BreakpointReturn>; +export function setBreakpointTailwindCSS( + tailwindConfig: T +): BreakpointReturn>; // @public (undocumented) -export function setBreakpointTailwindCSS(breakpoints: T): BreakpointReturn; +export function setBreakpointTailwindCSS( + breakpoints: T +): BreakpointReturn; // @public -export function setCssVariableFor(element: HTMLElement, name: string, value: CssVariable): void; +export function setCssVariableFor( + element: HTMLElement, + name: string, + value: CssVariable +): void; // @public (undocumented) export const enum SharedRefMind { - // (undocumented) - HIVE = 0, - // (undocumented) - MASTER = 1 + // (undocumented) + HIVE = 0, + // (undocumented) + MASTER = 1 } // @public (undocumented) @@ -283,14 +330,16 @@ export function storageAvailable(storage?: Storage): boolean; // @public (undocumented) export interface StorageSerializer { - // (undocumented) - parse(data: string): T; - // (undocumented) - stringify(item: T): string; + // (undocumented) + parse(data: string): T; + // (undocumented) + stringify(item: T): string; } // @public (undocumented) -export function useBreakpoint(breakpoints: Record): BreakpointReturn; +export function useBreakpoint( + breakpoints: Record +): BreakpointReturn; // Warning: (ae-forgotten-export) The symbol "ChromeBreakpoint" needs to be exported by the entry point index.d.ts // @@ -298,118 +347,198 @@ export function useBreakpoint(breakpoints: Record; // @public (undocumented) -export function useBreakpointTailwindCSS(tailwindConfig: T): BreakpointReturn>; +export function useBreakpointTailwindCSS( + tailwindConfig: T +): BreakpointReturn>; // @public (undocumented) -export function useBreakpointTailwindCSS(): BreakpointReturn>; +export function useBreakpointTailwindCSS< + T extends TailwindConfigEmpty +>(): BreakpointReturn>; // @public (undocumented) -export function useBreakpointTailwindCSS(): BreakpointReturn; +export function useBreakpointTailwindCSS(): BreakpointReturn< + DefaultTailwindBreakpoints +>; // @public (undocumented) -export function useBreakpointTailwindCSS(): BreakpointReturn; +export function useBreakpointTailwindCSS< + T extends BreakpointObject +>(): BreakpointReturn; // @public (undocumented) -export function useBroadcastChannel(name: string, onBeforeClose?: Function): { - supported: boolean; - data: import("@vue/composition-api").Ref; - messageEvent: import("@vue/composition-api").Ref; - errorEvent: import("@vue/composition-api").Ref; - errored: import("@vue/composition-api").Ref; - isClosed: import("@vue/composition-api").Ref; - send: (data: T) => void; - close: Function; - addListener: (cb: (ev: BroadcastMessageEvent) => void, options?: boolean | AddEventListenerOptions | undefined) => void; +export function useBroadcastChannel( + name: string, + onBeforeClose?: Function +): { + supported: boolean; + data: import("@vue/composition-api").Ref; + messageEvent: import("@vue/composition-api").Ref; + errorEvent: import("@vue/composition-api").Ref; + errored: import("@vue/composition-api").Ref; + isClosed: import("@vue/composition-api").Ref; + send: (data: T) => void; + close: Function; + addListener: ( + cb: (ev: BroadcastMessageEvent) => void, + options?: boolean | AddEventListenerOptions | undefined + ) => void; }; // @public export type UseCssVariables = CssVariableObject & CssVariablesMethods; // @public (undocumented) -export function useCssVariables(variables: T): UseCssVariables; +export function useCssVariables( + variables: T +): UseCssVariables; // @public (undocumented) -export function useCssVariables(variables: T, options?: MutationObserverInit): UseCssVariables; +export function useCssVariables( + variables: T, + options?: MutationObserverInit +): UseCssVariables; // @public (undocumented) -export function useCssVariables(variables: T, element: RefTyped, options?: MutationObserverInit): UseCssVariables; +export function useCssVariables( + variables: T, + element: RefTyped, + options?: MutationObserverInit +): UseCssVariables; // @public (undocumented) -export function useEvent any; +export function useEvent< + T extends { + addEventListener: ( + name: string, + listener: EventListenerOrEventListenerObject + ) => any; removeEventListener: Function; -}, M, K extends keyof M>(el: RefTyped, name: K, listener: (this: T, ev: M[K]) => any): RemoveEventFunction; - -// @public (undocumented) -export function useEvent any; + }, + M, + K extends keyof M +>( + el: RefTyped, + name: K, + listener: (this: T, ev: M[K]) => any +): RemoveEventFunction; + +// @public (undocumented) +export function useEvent< + T extends { + addEventListener: ( + name: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions + ) => any; removeEventListener: Function; -}, M, K extends keyof M>(el: RefTyped, name: K, listener: (this: T, ev: M[K]) => any, options?: boolean | AddEventListenerOptions): RemoveEventFunction; - -// @public (undocumented) -export function useEvent(el: RefTyped, name: K, listener: (this: Document, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): RemoveEventFunction; - -// @public (undocumented) -export function useEvent(el: RefTyped, name: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): RemoveEventFunction; - -// @public (undocumented) -export function useFetch(options?: UseFetchOptions & Partial, requestInit?: RequestInit): { - cancel: (message?: string | undefined) => void; - isCancelled: import("@vue/composition-api").Ref; - cancelledMessage: import("@vue/composition-api").Ref; - text: import("@vue/composition-api").Ref; - blob: import("@vue/composition-api").Ref; - json: import("@vue/composition-api").Ref; - jsonError: import("@vue/composition-api").Ref; - status: Readonly>; - statusText: Readonly>; - exec: (request: RequestInfo, init?: RequestInit | undefined) => Promise; - promise: import("@vue/composition-api").Ref | undefined>; - result: import("@vue/composition-api").Ref; - loading: import("@vue/composition-api").Ref; - error: import("@vue/composition-api").Ref; + }, + M, + K extends keyof M +>( + el: RefTyped, + name: K, + listener: (this: T, ev: M[K]) => any, + options?: boolean | AddEventListenerOptions +): RemoveEventFunction; + +// @public (undocumented) +export function useEvent( + el: RefTyped, + name: K, + listener: (this: Document, ev: WindowEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): RemoveEventFunction; + +// @public (undocumented) +export function useEvent( + el: RefTyped, + name: K, + listener: (this: Document, ev: DocumentEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): RemoveEventFunction; + +// @public (undocumented) +export function useFetch( + options?: UseFetchOptions & Partial, + requestInit?: RequestInit +): { + cancel: (message?: string | undefined) => void; + isCancelled: import("@vue/composition-api").Ref; + cancelledMessage: import("@vue/composition-api").Ref; + text: import("@vue/composition-api").Ref; + blob: import("@vue/composition-api").Ref; + json: import("@vue/composition-api").Ref; + jsonError: import("@vue/composition-api").Ref; + status: Readonly>; + statusText: Readonly>; + exec: ( + request: RequestInfo, + init?: RequestInit | undefined + ) => Promise; + promise: import("@vue/composition-api").Ref | undefined>; + result: import("@vue/composition-api").Ref; + loading: import("@vue/composition-api").Ref; + error: import("@vue/composition-api").Ref; }; // @public (undocumented) export interface UseFetchOptions { - isJson?: boolean; - parseImmediate?: boolean; + isJson?: boolean; + parseImmediate?: boolean; } // @public (undocumented) -export function useGeolocation(options?: PositionOptions & GeolocationOptions): { - supported: boolean; - refresh: () => void; - error: import("@vue/composition-api").Ref; - timestamp: import("@vue/composition-api").Ref; - coords: import("@vue/composition-api").Ref; - highAccuracy: import("@vue/composition-api").Ref; +export function useGeolocation( + options?: PositionOptions & GeolocationOptions +): { + supported: boolean; + refresh: () => void; + error: import("@vue/composition-api").Ref; + timestamp: import("@vue/composition-api").Ref; + coords: import("@vue/composition-api").Ref; + highAccuracy: import("@vue/composition-api").Ref; }; // @public (undocumented) -export function useIntersectionObserver(el: RefElement, options?: RefTyped): IntersectionObserverResult; +export function useIntersectionObserver( + el: RefElement, + options?: RefTyped +): IntersectionObserverResult; // @public (undocumented) -export function useIntersectionObserver(options: RefTyped): IntersectionObserverResult; +export function useIntersectionObserver( + options: RefTyped +): IntersectionObserverResult; // @public (undocumented) export function useLanguage(): { - language: Ref; - languages: Ref; + language: Ref; + languages: Ref; }; // @public (undocumented) -export function useLocalStorage(key: string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; +export function useLocalStorage( + key: string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; // @public (undocumented) -export function useLocalStorage(key: LocalStorageTyped | string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; +export function useLocalStorage( + key: LocalStorageTyped | string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; // @public (undocumented) -export function useMatchMedia(query: string): { - supported: boolean; - mediaQueryList: Ref; - matches: Ref; - remove: () => void; +export function useMatchMedia( + query: string +): { + supported: boolean; + mediaQueryList: Ref; + matches: Ref; + remove: () => void; }; // Warning: (ae-forgotten-export) The symbol "NetworkInformationReturn" needs to be exported by the entry point index.d.ts @@ -419,33 +548,52 @@ export function useNetworkInformation(): NetworkInformationReturn; // @public (undocumented) export function useOnline(): { - supported: boolean; - online: Ref; + supported: boolean; + online: Ref; }; // @public (undocumented) -export function useOnMouseMove(el: RefTyped, wait: number): MouseMoveResult; +export function useOnMouseMove( + el: RefTyped, + wait: number +): MouseMoveResult; // @public (undocumented) -export function useOnMouseMove(el: RefTyped, options?: boolean | AddEventListenerOptions, wait?: number): MouseMoveResult; +export function useOnMouseMove( + el: RefTyped, + options?: boolean | AddEventListenerOptions, + wait?: number +): MouseMoveResult; // @public (undocumented) export function useOnMouseMove(el: RefElement, wait: number): MouseMoveResult; // @public (undocumented) -export function useOnMouseMove(el: RefElement, options?: boolean | AddEventListenerOptions, wait?: number): MouseMoveResult; +export function useOnMouseMove( + el: RefElement, + options?: boolean | AddEventListenerOptions, + wait?: number +): MouseMoveResult; // @public (undocumented) export function useOnResize(el: RefTyped, wait: number): ResizeResult; // @public (undocumented) -export function useOnResize(el: RefTyped, options?: boolean | AddEventListenerOptions, wait?: number): ResizeResult; +export function useOnResize( + el: RefTyped, + options?: boolean | AddEventListenerOptions, + wait?: number +): ResizeResult; // @public (undocumented) export function useOnResize(el: RefElement, wait: number): ResizeResult; // @public (undocumented) -export function useOnResize(el: RefElement, options?: boolean | AddEventListenerOptions, wait?: number): ResizeResult; +export function useOnResize( + el: RefElement, + options?: boolean | AddEventListenerOptions, + wait?: number +): ResizeResult; // @public (undocumented) export function useOnScroll(): ScrollResult; @@ -454,99 +602,150 @@ export function useOnScroll(): ScrollResult; export function useOnScroll(wait: number): ScrollResult; // @public (undocumented) -export function useOnScroll(options: boolean | AddEventListenerOptions, wait?: number): ScrollResult; +export function useOnScroll( + options: boolean | AddEventListenerOptions, + wait?: number +): ScrollResult; // @public (undocumented) export function useOnScroll(el: RefTyped, wait: number): ScrollResult; // @public (undocumented) -export function useOnScroll(el: RefTyped, options?: boolean | AddEventListenerOptions, wait?: number): ScrollResult; +export function useOnScroll( + el: RefTyped, + options?: boolean | AddEventListenerOptions, + wait?: number +): ScrollResult; // @public (undocumented) export function useOnScroll(el: RefElement, wait: number): ScrollResult; // @public (undocumented) -export function useOnScroll(el: RefElement, options?: boolean | AddEventListenerOptions, wait?: number): ScrollResult; +export function useOnScroll( + el: RefElement, + options?: boolean | AddEventListenerOptions, + wait?: number +): ScrollResult; // @public (undocumented) export function usePageVisibility(): { - visibility: Ref; - hidden: Ref; + visibility: Ref; + hidden: Ref; }; // @public (undocumented) -export function useSessionStorage(key: string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; - -// @public (undocumented) -export function useSessionStorage(key: LocalStorageTyped | string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; - -// @public (undocumented) -export function useSharedRef(name: string, defaultValue?: T): { - supported: boolean; - id: number; - data: Ref; - master: Ref; - mind: Ref; - editable: Readonly>; - targets: Ref; - ping: () => void; - setMind: (t: SharedRefMind) => void; - addListener: (cb: (ev: BroadcastMessageEvent>) => void, options?: boolean | AddEventListenerOptions | undefined) => void; +export function useSessionStorage( + key: string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; + +// @public (undocumented) +export function useSessionStorage( + key: LocalStorageTyped | string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; + +// @public (undocumented) +export function useSharedRef( + name: string, + defaultValue?: T +): { + supported: boolean; + id: number; + data: Ref; + master: Ref; + mind: Ref; + editable: Readonly>; + targets: Ref; + ping: () => void; + setMind: (t: SharedRefMind) => void; + addListener: ( + cb: (ev: BroadcastMessageEvent>) => void, + options?: boolean | AddEventListenerOptions | undefined + ) => void; }; // @public (undocumented) -export function useStorage(key: string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; - -// @public (undocumented) -export function useStorage(key: LocalStorageTyped | string, defaultValue?: RefTyped, sync?: boolean): LocalStorageReturn; - -// @public (undocumented) -export function useWebSocket(url: string, protocols?: string | string[]): { - supported: boolean; - ws: WebSocket | null; - send: (data: string | ArrayBuffer | SharedArrayBuffer | Blob | ArrayBufferView) => void; - close: (code?: number | undefined, reason?: string | undefined) => void; - messageEvent: import("@vue/composition-api").Ref; - errorEvent: import("@vue/composition-api").Ref; - data: import("@vue/composition-api").Ref; - isOpen: import("@vue/composition-api").Ref; - isClosed: import("@vue/composition-api").Ref; - errored: import("@vue/composition-api").Ref; +export function useStorage( + key: string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; + +// @public (undocumented) +export function useStorage( + key: LocalStorageTyped | string, + defaultValue?: RefTyped, + sync?: boolean +): LocalStorageReturn; + +// @public (undocumented) +export function useWebSocket( + url: string, + protocols?: string | string[] +): { + supported: boolean; + ws: WebSocket | null; + send: ( + data: string | ArrayBuffer | SharedArrayBuffer | Blob | ArrayBufferView + ) => void; + close: (code?: number | undefined, reason?: string | undefined) => void; + messageEvent: import("@vue/composition-api").Ref; + errorEvent: import("@vue/composition-api").Ref; + data: import("@vue/composition-api").Ref; + isOpen: import("@vue/composition-api").Ref; + isClosed: import("@vue/composition-api").Ref; + errored: import("@vue/composition-api").Ref; }; // Warning: (ae-forgotten-export) The symbol "WebStorageType" needs to be exported by the entry point index.d.ts // // @public (undocumented) -export function useWebStorage(type: WebStorageType, serializer?: StorageSerializer, ms?: number): { - supported: boolean; - quotaError: Ref; - store: WebStorage; - remove: () => boolean; +export function useWebStorage( + type: WebStorageType, + serializer?: StorageSerializer, + ms?: number +): { + supported: boolean; + quotaError: Ref; + store: WebStorage; + remove: () => boolean; +}; + +// @public (undocumented) +export function useWorker, TArgs extends Array>( + fn: (...args: TArgs) => T +): { + exec: (...args: TArgs) => Promise; + promise: import("@vue/composition-api").Ref | undefined>; + result: import("@vue/composition-api").Ref; + loading: import("@vue/composition-api").Ref; + error: import("@vue/composition-api").Ref; }; // @public (undocumented) export interface WebStorage { - // (undocumented) - $quotaError: Ref; - // (undocumented) - $refMap: Map>; - // (undocumented) - $syncKeys: Record; - // (undocumented) - $watchHandlers: Map; - clear(): void; - getItem(key: string): Ref | null; - key(index: number): string | null; - readonly length: number; - removeItem(key: string): void; - setItem(key: string, value: T): Ref; - // (undocumented) - setSync(key: string, sync: boolean): void; - // (undocumented) - updateItem(key: string, value: string): void; + // (undocumented) + $quotaError: Ref; + // (undocumented) + $refMap: Map>; + // (undocumented) + $syncKeys: Record; + // (undocumented) + $watchHandlers: Map; + clear(): void; + getItem(key: string): Ref | null; + key(index: number): string | null; + readonly length: number; + removeItem(key: string): void; + setItem(key: string, value: T): Ref; + // (undocumented) + setSync(key: string, sync: boolean): void; + // (undocumented) + updateItem(key: string, value: string): void; } - // (No @packageDocumentation comment for this package) - ``` diff --git a/examples/vue-composable-example/src/components/HelloWorld.vue b/examples/vue-composable-example/src/components/HelloWorld.vue index 41bc71e55..77ac4e86a 100644 --- a/examples/vue-composable-example/src/components/HelloWorld.vue +++ b/examples/vue-composable-example/src/components/HelloWorld.vue @@ -2,20 +2,63 @@

Vue composable examples

Select one above

+ +

loading: {{ loading }}

+ +
diff --git a/packages/web/src/web/index.ts b/packages/web/src/web/index.ts index 17482bf13..92abec557 100644 --- a/packages/web/src/web/index.ts +++ b/packages/web/src/web/index.ts @@ -8,3 +8,4 @@ export * from "./language"; export * from "./broadcastChannel"; export * from "./geolocation"; export * from "./cssVariables"; +export * from "./webWorker"; diff --git a/packages/web/src/web/webWorker/_runner.js b/packages/web/src/web/webWorker/_runner.js new file mode 100644 index 000000000..1ea3a3b4e --- /dev/null +++ b/packages/web/src/web/webWorker/_runner.js @@ -0,0 +1,14 @@ +function runner(fn) { + return function(e) { + var args = e.data || []; + return Promise.resolve(fn(...args)) + .then(function(x) { + postMessage([true, x]); + }) + .catch(function(x) { + postMessage([false, x]); + }); + }; +} + +export default runner; diff --git a/packages/web/src/web/webWorker/index.ts b/packages/web/src/web/webWorker/index.ts new file mode 100644 index 000000000..f38c6f8e2 --- /dev/null +++ b/packages/web/src/web/webWorker/index.ts @@ -0,0 +1 @@ +export * from "./webWorker"; diff --git a/packages/web/src/web/webWorker/webWorker.ts b/packages/web/src/web/webWorker/webWorker.ts new file mode 100644 index 000000000..ed908a7fe --- /dev/null +++ b/packages/web/src/web/webWorker/webWorker.ts @@ -0,0 +1,83 @@ +import { usePromise } from "@vue-composable/core"; +// import runner from "./_runner.js"; + +function createBlobUrl(fn: Function, dependencies: string[]) { + // const scripts = + // dependencies.length > 0 ? `importScripts("${dependencies.join(",")}")` : ""; + + // @ts-check + // const r = (func: Function) => (e: MessageEvent) => { + // const args = e.data || []; + + // return Promise.resolve(func(...args)) + // .then(x => { + // // @ts-ignore + // postMessage([true, x]); + // }) + // .catch(x => { + // // @ts-ignore + // postMessage([false, e]); + // }); + // }; + + const r = (f: Function) => (e: MessageEvent) => { + const args = e.data || []; + + return ( + Promise.resolve(f(...args)) + // @ts-ignore + .then(x => postMessage([true, x])) + // @ts-ignore + .catch(x => postMessage([false, x])) + ); + }; + + const blobScript = ["self.onmessage=", `(${r.toString()})(${fn.toString()})`]; + + const blob = new Blob(blobScript, { type: "text/javascript" }); + return URL.createObjectURL(blob); +} + +export function useWorker, TArgs extends Array>( + fn: (...args: TArgs) => T +) { + const promise = usePromise( + (...args: TArgs) => + new Promise((res, rej) => { + const blobUrl = createBlobUrl(fn, []); + + const worker = new Worker(blobUrl); + + let timeout = -1; + + const terminate = () => { + worker.terminate(); + clearTimeout(timeout); + }; + + worker.onmessage = e => { + if (e.data[0]) { + res(e.data[1]); + } else { + rej(e.data[1]); + } + terminate(); + }; + + worker.onerror = e => { + rej(e); + terminate(); + }; + + worker.postMessage([...args]); + }), + { + lazy: true, + throwException: true + } + ); + + return { + ...promise + }; +} diff --git a/tsconfig.json b/tsconfig.json index 41dc34626..78c9977f5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "target": "esnext", "module": "esnext", "moduleResolution": "node", - "allowJs": false, + "allowJs": true, "noUnusedLocals": true, "strictNullChecks": true, "noImplicitAny": true, From 2c9ac7ade5da7c37e786730f4c0ee64d5071a948 Mon Sep 17 00:00:00 2001 From: pikax Date: Mon, 30 Mar 2020 07:59:57 +0100 Subject: [PATCH 02/11] Allow cancelling with cancellable promises --- docs/api/web.api.md | 18 +++- .../src/components/HelloWorld.vue | 82 ++++++++++++++-- .../src/components/TodoList.vue | 2 +- .../core/src/promise/cancellablePromise.ts | 2 +- packages/web/src/web/index.ts | 2 +- packages/web/src/web/webWorker/_runner.js | 14 --- packages/web/src/web/webWorker/index.ts | 1 - packages/web/src/web/webWorker/webWorker.ts | 83 ---------------- packages/web/src/web/webWorkerFunction.ts | 94 +++++++++++++++++++ 9 files changed, 188 insertions(+), 110 deletions(-) delete mode 100644 packages/web/src/web/webWorker/_runner.js delete mode 100644 packages/web/src/web/webWorker/index.ts delete mode 100644 packages/web/src/web/webWorker/webWorker.ts create mode 100644 packages/web/src/web/webWorkerFunction.ts diff --git a/docs/api/web.api.md b/docs/api/web.api.md index dc54ef933..21232689c 100644 --- a/docs/api/web.api.md +++ b/docs/api/web.api.md @@ -715,14 +715,20 @@ export function useWebStorage( }; // @public (undocumented) -export function useWorker, TArgs extends Array>( - fn: (...args: TArgs) => T +export function useWebWorkerFunction< + T extends Promise, + TArgs extends Array +>( + fn: (...args: TArgs) => T, + options?: WebWorkerFunctionOptions ): { exec: (...args: TArgs) => Promise; promise: import("@vue/composition-api").Ref | undefined>; result: import("@vue/composition-api").Ref; loading: import("@vue/composition-api").Ref; error: import("@vue/composition-api").Ref; + cancel: (result?: any) => void; + cancelled: import("@vue/composition-api").Ref; }; // @public (undocumented) @@ -747,5 +753,13 @@ export interface WebStorage { updateItem(key: string, value: string): void; } +// @public (undocumented) +export interface WebWorkerFunctionOptions { + // (undocumented) + dependencies?: RefTyped; + // (undocumented) + timeout?: RefTyped; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/examples/vue-composable-example/src/components/HelloWorld.vue b/examples/vue-composable-example/src/components/HelloWorld.vue index 77ac4e86a..9122f7820 100644 --- a/examples/vue-composable-example/src/components/HelloWorld.vue +++ b/examples/vue-composable-example/src/components/HelloWorld.vue @@ -2,16 +2,36 @@

Vue composable examples

Select one above

- + +
+ + + + + + +

loading: {{ loading }}

- + + + +
diff --git a/docs/api/web.api.md b/docs/api/web.api.md index 4b83f0f4f..685e2a475 100644 --- a/docs/api/web.api.md +++ b/docs/api/web.api.md @@ -733,10 +733,7 @@ export function useWorker( }; // @public (undocumented) -export function useWorkerFunction< - T extends Promise, - TArgs extends Array ->( +export function useWorkerFunction>( fn: (...args: TArgs) => T, options?: WebWorkerFunctionOptions ): import("../../../core/src").PromiseResultFactory, TArgs> & diff --git a/docs/composable/validation/validation.md b/docs/composable/validation/validation.md index 6562c5117..4f9201225 100644 --- a/docs/composable/validation/validation.md +++ b/docs/composable/validation/validation.md @@ -249,12 +249,12 @@ interface ValidationGroupResult { ``` diff --git a/examples/vue-composable-example/src/components/TodoList.vue b/examples/vue-composable-example/src/components/TodoList.vue index 92cddb1bc..bc37a4eb4 100644 --- a/examples/vue-composable-example/src/components/TodoList.vue +++ b/examples/vue-composable-example/src/components/TodoList.vue @@ -8,7 +8,7 @@ diff --git a/docs/.vuepress/components/WorkerFunctionExample.vue b/docs/.vuepress/components/WorkerFunctionExample.vue index baefaafdb..1468b0b46 100644 --- a/docs/.vuepress/components/WorkerFunctionExample.vue +++ b/docs/.vuepress/components/WorkerFunctionExample.vue @@ -20,10 +20,10 @@
  • - +
  • - +

    {{ error }}

@@ -39,7 +39,7 @@ import { } from "@vue/composition-api"; import { useWorkerFunction, useDateNow } from "vue-composable"; -const bubleSort = input => { +const bubbleSort = input => { let swap; let n = input.length - 1; const sortedArray = input.slice(); @@ -62,7 +62,7 @@ const bubleSort = input => { export default defineComponent({ name: "worker-function-example", setup() { - const timeout = ref(1500); + const timeout = ref(15000); const { now } = useDateNow({ refreshMs: 10 }); const numbers = [...Array(50000)].map(() => @@ -74,16 +74,16 @@ export default defineComponent({ const firstSegment = computed(() => sortedNumbers.value.slice(0, 10)); const lastSegment = computed(() => sortedNumbers.value.slice(-10)); - const suffleArray = () => { - sortedNumbers.value = bubleSort(numbers); + const sortArray = () => { + sortedNumbers.value = bubbleSort(numbers); }; const { exec, loading: working, error, cancelled - } = useWorkerFunction(bubleSort, { timeout }); - const suffleWorker = () => { + } = useWorkerFunction(bubbleSort, { timeout }); + const sortWorker = () => { exec(numbers) .then(x => (sortedNumbers.value = x)) .catch(x => (sortedNumbers.value = ["error", x])); @@ -96,9 +96,9 @@ export default defineComponent({ firstSegment, lastSegment, - suffleArray, + sortArray, - suffleWorker, + sortWorker, working, error, cancelled diff --git a/docs/.vuepress/public/worker.example.js b/docs/.vuepress/public/worker.example.js new file mode 100644 index 000000000..ad636968e --- /dev/null +++ b/docs/.vuepress/public/worker.example.js @@ -0,0 +1,56 @@ +// expose worker code without typing +// based from https://github.com/dai-shi/react-hooks-worker/blob/1e842ad15c558fc04dd7339a62aaa43f46d1c7cd/src/exposeWorker.js +// code from /packages/web/worker.ts +function exposeWorker(func) { + this.onmessage = async e => { + const r = func(e.data); + + if (r === undefined) { + if (__DEV__) { + console.warn( + `[exposeWorker] returned \`${r}\`, this might cause unexpected behaviour` + ); + } + this.postMessage(r); + } else if (r === null) { + this.postMessage(r); + } else if (Array.isArray(r)) { + this.postMessage(r); + } else if (r[Symbol.asyncIterator]) { + for await (const i of r) this.postMessage(i); + } else if (r[Symbol.iterator]) { + for (const i of r) this.postMessage(i); + } else { + this.postMessage(await r); + } + }; +} +// / exposeWorker + +function* bubbleSort(input) { + let swap; + let n = input.length - 1; + const sortedArray = input.slice(); + + yield ["sorting", `${input.length} items`]; + do { + swap = false; + for (let index = 0; index < n; index += 1) { + if (sortedArray[index] > sortedArray[index + 1]) { + const tmp = sortedArray[index]; + sortedArray[index] = sortedArray[index + 1]; + sortedArray[index + 1] = tmp; + swap = true; + } + } + n -= 1; + + if (Math.floor(input.length / 2) === n) { + yield ["sorted", `${n} items processed`]; + } + } while (swap); + + yield sortedArray; +} + +exposeWorker(bubbleSort); diff --git a/docs/composable/web/worker.md b/docs/composable/web/worker.md index de2ab7a4e..91af1d0a2 100644 --- a/docs/composable/web/worker.md +++ b/docs/composable/web/worker.md @@ -51,6 +51,8 @@ const { postMessage, terminate } = useWorker(); ## Inside the worker +Inside of worker you can use the `exposeWorker`, it will post the result and execute the method when receiving the message. + ```js // super.worker.js import { exposeWorker } from "vue-composable"; @@ -60,12 +62,138 @@ const max = numbers => Math.max(...numbers); exposeWorker(max); ``` +::: tip +`exposeWorker` you can use `yield` to sending a stream of data to the main thread +::: + ## Example - + ### Code -```vue +You can find the `worker` used in this example at [worker.example.js](https://pikax.me/vue-composable/worker.example.js) + +```js +// worker.example.js +import { exposeWorker } from "vue-composable"; + +function* bubbleSort(input) { + let swap; + let n = input.length - 1; + const sortedArray = input.slice(); + + yield ["sorting", `${input.length} items`]; + do { + swap = false; + for (let index = 0; index < n; index += 1) { + if (sortedArray[index] > sortedArray[index + 1]) { + const tmp = sortedArray[index]; + sortedArray[index] = sortedArray[index + 1]; + sortedArray[index + 1] = tmp; + swap = true; + } + } + n -= 1; + + if (Math.floor(input.length / 2) === n) { + yield ["sorted", `${n} items processed`]; + } + } while (swap); + + yield sortedArray; +} + +exposeWorker(bubbleSort); +``` + +```vue + + + ``` diff --git a/docs/composable/web/workerFunction.md b/docs/composable/web/workerFunction.md index 624676e92..9007ede99 100644 --- a/docs/composable/web/workerFunction.md +++ b/docs/composable/web/workerFunction.md @@ -96,6 +96,39 @@ const { exec, cancel } = useWorkerFunction(); +