@warp-drive-mirror/experiments 0.0.1-alpha.100 → 0.0.1-alpha.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-worker.js +8 -5
- package/dist/data-worker.js.map +1 -1
- package/dist/worker-fetch.js +5 -1
- package/dist/worker-fetch.js.map +1 -1
- package/package.json +12 -12
package/dist/data-worker.js
CHANGED
|
@@ -35,7 +35,7 @@ class DataWorker {
|
|
|
35
35
|
this.abortRequest(event.data);
|
|
36
36
|
break;
|
|
37
37
|
case 'request':
|
|
38
|
-
void this.request(event.data);
|
|
38
|
+
void this.request(prepareRequest(event.data));
|
|
39
39
|
break;
|
|
40
40
|
}
|
|
41
41
|
};
|
|
@@ -84,10 +84,7 @@ function softCloneResponse(response) {
|
|
|
84
84
|
if (!response) return null;
|
|
85
85
|
const clone = {};
|
|
86
86
|
if (response.headers) {
|
|
87
|
-
clone.headers =
|
|
88
|
-
for (const [key, value] of response.headers.entries()) {
|
|
89
|
-
clone.headers[key] = value;
|
|
90
|
-
}
|
|
87
|
+
clone.headers = Array.from(response.headers.entries());
|
|
91
88
|
}
|
|
92
89
|
clone.ok = response.ok;
|
|
93
90
|
clone.redirected = response.redirected;
|
|
@@ -107,6 +104,12 @@ function prepareResponse(result) {
|
|
|
107
104
|
};
|
|
108
105
|
return newResponse;
|
|
109
106
|
}
|
|
107
|
+
function prepareRequest(event) {
|
|
108
|
+
if (event.data.headers) {
|
|
109
|
+
event.data.headers = new Headers(event.data.headers);
|
|
110
|
+
}
|
|
111
|
+
return event;
|
|
112
|
+
}
|
|
110
113
|
const MUTATION_OPS = new Set(['createRecord', 'updateRecord', 'deleteRecord']);
|
|
111
114
|
|
|
112
115
|
/**
|
package/dist/data-worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-worker.js","sources":["../src/data-worker/worker.ts","../src/data-worker/utils.ts","../src/data-worker/cache-handler.ts"],"sourcesContent":["import type { Future, ResponseInfo, StructuredDataDocument } from '@ember-data-mirror/request';\nimport type Store from '@ember-data-mirror/store';\n\nimport type { AbortEventData, RequestEventData, ThreadInitEventData, WorkerThreadEvent } from './types';\n\nexport class DataWorker {\n declare store: Store;\n declare threads: Map<string, MessagePort>;\n declare pending: Map<string, Map<number, Future<unknown>>>;\n\n constructor(UserStore: typeof Store) {\n this.store = new UserStore();\n this.threads = new Map();\n this.pending = new Map();\n this.initialize();\n }\n\n initialize() {\n globalThis.onmessage = (event: MessageEvent<ThreadInitEventData>) => {\n const { type } = event.data;\n\n switch (type) {\n case 'connect':\n this.setupThread(event.data.thread, event.ports[0]);\n break;\n }\n };\n }\n\n setupThread(thread: string, port: MessagePort) {\n this.threads.set(thread, port);\n this.pending.set(thread, new Map());\n port.onmessage = (event: WorkerThreadEvent) => {\n if (event.type === 'close') {\n this.threads.delete(thread);\n return;\n }\n\n const { type } = event.data;\n switch (type) {\n case 'abort':\n this.abortRequest(event.data);\n break;\n case 'request':\n void this.request(event.data);\n break;\n }\n };\n }\n\n abortRequest(event: AbortEventData) {\n const { thread, id } = event;\n const future = this.pending.get(thread)!.get(id);\n\n if (future) {\n future.abort();\n this.pending.get(thread)!.delete(id);\n }\n }\n\n async request(event: RequestEventData) {\n const { thread, id, data } = event;\n\n try {\n const future = this.store.request(data);\n this.pending.get(thread)!.set(id, future);\n\n const result = await future;\n\n this.threads.get(thread)?.postMessage({ type: 'success-response', id, thread, data: prepareResponse(result) });\n } catch (error) {\n if (isAbortError(error)) return;\n\n this.threads.get(thread)?.postMessage({ type: 'error-response', id, thread, data: error });\n } finally {\n this.pending.get(thread)!.delete(id);\n }\n }\n}\n\ntype Mutable<T> = { -readonly [P in keyof T]: T[P] };\n\nfunction softCloneResponse(response: Response | ResponseInfo | null) {\n if (!response) return null;\n\n const clone: Partial<Mutable<Omit<Response, 'headers'>>> & { headers?: Record<string, string | number> } = {};\n\n if (response.headers) {\n clone.headers = {};\n for (const [key, value] of response.headers.entries()) {\n clone.headers[key] = value;\n }\n }\n\n clone.ok = response.ok;\n clone.redirected = response.redirected;\n clone.status = response.status;\n clone.statusText = response.statusText;\n clone.type = response.type;\n clone.url = response.url;\n\n return clone;\n}\n\nfunction isAbortError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction prepareResponse<T>(result: StructuredDataDocument<T>) {\n const newResponse = {\n response: softCloneResponse(result.response),\n content: result.content,\n };\n\n return newResponse;\n}\n","import type Store from '@ember-data-mirror/store';\nimport type { StableDocumentIdentifier } from '@warp-drive-mirror/core-types/identifier';\nimport type {\n ImmutableCreateRequestOptions,\n ImmutableDeleteRequestOptions,\n ImmutableRequestInfo,\n ImmutableUpdateRequestOptions,\n StructuredDataDocument,\n} from '@warp-drive-mirror/core-types/request';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nexport const MUTATION_OPS = new Set(['createRecord', 'updateRecord', 'deleteRecord']);\n\n/**\n * In a Worker, any time we are asked to make a request, data needs to be returned.\n * background requests are ergo no different than foreground requests.\n * @internal\n */\nexport function calcShouldFetch(\n store: Store,\n request: ImmutableRequestInfo,\n hasCachedValue: boolean,\n identifier: StableDocumentIdentifier | null\n): boolean {\n const { cacheOptions } = request;\n return (\n (request.op && MUTATION_OPS.has(request.op)) ||\n cacheOptions?.reload ||\n cacheOptions?.backgroundReload ||\n !hasCachedValue ||\n (store.lifetimes && identifier\n ? store.lifetimes.isHardExpired(identifier, store) || store.lifetimes.isSoftExpired(identifier, store)\n : false)\n );\n}\n\nexport function isMutation(\n request: Partial<ImmutableRequestInfo>\n): request is ImmutableUpdateRequestOptions | ImmutableCreateRequestOptions | ImmutableDeleteRequestOptions {\n return Boolean(request.op && MUTATION_OPS.has(request.op));\n}\n\nexport function isCacheAffecting<T>(document: StructuredDataDocument<T>): boolean {\n if (!isMutation(document.request)) {\n return true;\n }\n // a mutation combined with a 204 has no cache impact when no known records were involved\n // a createRecord with a 201 with an empty response and no known records should similarly\n // have no cache impact\n\n if (document.request.op === 'createRecord' && document.response?.status === 201) {\n return document.content ? Object.keys(document.content).length > 0 : false;\n }\n\n return document.response?.status !== 204;\n}\n\nfunction isAggregateError(error: Error & { errors?: ApiError[] }): error is AggregateError & { errors: ApiError[] } {\n return error instanceof AggregateError || (error.name === 'AggregateError' && Array.isArray(error.errors));\n}\n\ntype RobustError = Error & { error: string | object; errors?: ApiError[]; content?: unknown };\n\n// TODO @runspired, consider if we should deep freeze errors (potentially only in debug) vs cloning them\nexport function cloneError(error: RobustError) {\n const isAggregate = isAggregateError(error);\n\n const cloned = (\n isAggregate ? new AggregateError(structuredClone(error.errors), error.message) : new Error(error.message)\n ) as RobustError;\n cloned.stack = error.stack!;\n cloned.error = error.error;\n\n // copy over enumerable properties\n Object.assign(cloned, error);\n\n return cloned;\n}\n","import type { CacheHandler as CacheHandlerType, Future, NextFn } from '@ember-data-mirror/request';\nimport type Store from '@ember-data-mirror/store';\nimport type { StoreRequestContext } from '@ember-data-mirror/store';\nimport { assert } from '@warp-drive-mirror/build-config/macros';\nimport type { StableDocumentIdentifier } from '@warp-drive-mirror/core-types/identifier';\nimport type { StructuredDataDocument, StructuredErrorDocument } from '@warp-drive-mirror/core-types/request';\nimport { SkipCache } from '@warp-drive-mirror/core-types/request';\nimport type { ResourceDataDocument, ResourceErrorDocument } from '@warp-drive-mirror/core-types/spec/document';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nimport { calcShouldFetch, cloneError, isCacheAffecting, isMutation } from './utils';\n\n/**\n * A simplified CacheHandler that hydrates ResourceDataDocuments from the cache\n * with their referenced resources.\n *\n * @typedoc\n */\nexport const CacheHandler: CacheHandlerType = {\n request<T>(context: StoreRequestContext, next: NextFn<T>): Promise<T | StructuredDataDocument<T>> | Future<T> | T {\n // if we have no cache or no cache-key skip cache handling\n if (!context.request.store || context.request.cacheOptions?.[SkipCache]) {\n return next(context.request);\n }\n\n const { store } = context.request;\n const identifier = store.identifierCache.getOrCreateDocumentIdentifier(context.request);\n const peeked = identifier ? store.cache.peekRequest(identifier) : null;\n\n // In a Worker, any time we are asked to make a request, data needs to be returned.\n // background requests are ergo no different than foreground requests.\n if (calcShouldFetch(store, context.request, !!peeked, identifier)) {\n return fetchContentAndHydrate(next, context, identifier);\n }\n\n assert(`Expected a peeked request to be present`, peeked);\n context.setResponse(peeked.response);\n\n if ('error' in peeked) {\n throw peeked;\n }\n\n return maybeUpdateObjects<T>(store, peeked.content as ResourceDataDocument);\n },\n};\n\nfunction maybeUpdateObjects<T>(store: Store, document: ResourceDataDocument | null): T {\n if (!document) {\n return document as T;\n }\n\n if (Array.isArray(document.data)) {\n const data = document.data.map((identifier) => {\n return store.cache.peek(identifier);\n });\n\n return Object.assign({}, document, { data }) as T;\n } else {\n const data = (document.data ? store.cache.peek(document.data) : null) as T;\n return Object.assign({}, document, { data }) as T;\n }\n}\n\nfunction updateCacheForSuccess<T>(\n store: Store,\n request: StoreRequestContext['request'],\n document: StructuredDataDocument<T>\n) {\n let response: ResourceDataDocument | null = null;\n if (isMutation(request)) {\n const record = request.data?.record || request.records?.[0];\n if (record) {\n response = store.cache.didCommit(record, document) as ResourceDataDocument;\n\n // a mutation combined with a 204 has no cache impact when no known records were involved\n // a createRecord with a 201 with an empty response and no known records should similarly\n // have no cache impact\n } else if (isCacheAffecting(document)) {\n response = store.cache.put(document) as ResourceDataDocument;\n }\n } else {\n response = store.cache.put(document) as ResourceDataDocument;\n }\n return maybeUpdateObjects(store, response);\n}\n\nfunction handleFetchSuccess<T>(\n store: Store,\n request: StoreRequestContext['request'],\n identifier: StableDocumentIdentifier | null,\n document: StructuredDataDocument<T>\n): T {\n let response: ResourceDataDocument;\n store._join(() => {\n response = updateCacheForSuccess<T>(store, request, document) as ResourceDataDocument;\n });\n\n if (store.lifetimes?.didRequest) {\n store.lifetimes.didRequest(request, document.response, identifier, store);\n }\n\n return response! as T;\n}\n\nfunction updateCacheForError<T>(\n store: Store,\n request: StoreRequestContext['request'],\n error: StructuredErrorDocument<T>\n) {\n if (isMutation(request)) {\n // TODO similar to didCommit we should spec this to be similar to cache.put for handling full response\n // currently we let the response remain undefiend.\n const errors =\n error &&\n error.content &&\n typeof error.content === 'object' &&\n 'errors' in error.content &&\n Array.isArray(error.content.errors)\n ? (error.content.errors as ApiError[])\n : undefined;\n\n const record = request.data?.record || request.records?.[0];\n\n store.cache.commitWasRejected(record, errors);\n } else {\n return store.cache.put(error) as ResourceErrorDocument;\n }\n}\n\nfunction handleFetchError<T>(\n store: Store,\n request: StoreRequestContext['request'],\n identifier: StableDocumentIdentifier | null,\n error: StructuredErrorDocument<T>\n): never {\n if (request.signal?.aborted) {\n throw error;\n }\n let response: ResourceErrorDocument | undefined;\n store._join(() => {\n response = updateCacheForError(store, request, error);\n });\n\n if (identifier && store.lifetimes?.didRequest) {\n store.lifetimes.didRequest(request, error.response, identifier, store);\n }\n\n if (isMutation(request)) {\n throw error;\n }\n\n const newError = cloneError(error);\n newError.content = response!;\n throw newError;\n}\n\nfunction fetchContentAndHydrate<T>(\n next: NextFn<T>,\n context: StoreRequestContext,\n identifier: StableDocumentIdentifier | null\n): Promise<T> {\n const { request } = context;\n const { store } = context.request;\n\n if (isMutation(request)) {\n // TODO should we handle multiple records in request.records by iteratively calling willCommit for each\n const record = request.data?.record || request.records?.[0];\n assert(`Expected to receive a list of records included in the ${request.op} request`, record);\n if (record) {\n store.cache.willCommit(record, context);\n }\n }\n\n if (store.lifetimes?.willRequest) {\n store.lifetimes.willRequest(request, identifier, store);\n }\n\n return next(request).then(\n (document) => handleFetchSuccess(store, request, identifier, document),\n (error: StructuredErrorDocument<T>) => handleFetchError(store, request, identifier, error)\n );\n}\n"],"names":["DataWorker","constructor","UserStore","store","threads","Map","pending","initialize","globalThis","onmessage","event","type","data","setupThread","thread","ports","port","set","delete","abortRequest","request","id","future","get","abort","result","postMessage","prepareResponse","error","isAbortError","softCloneResponse","response","clone","headers","key","value","entries","ok","redirected","status","statusText","url","Error","name","newResponse","content","MUTATION_OPS","Set","calcShouldFetch","hasCachedValue","identifier","cacheOptions","op","has","reload","backgroundReload","lifetimes","isHardExpired","isSoftExpired","isMutation","Boolean","isCacheAffecting","document","Object","keys","length","isAggregateError","AggregateError","Array","isArray","errors","cloneError","isAggregate","cloned","structuredClone","message","stack","assign","CacheHandler","context","next","SkipCache","identifierCache","getOrCreateDocumentIdentifier","peeked","cache","peekRequest","fetchContentAndHydrate","macroCondition","getGlobalConfig","WarpDrive","env","DEBUG","test","setResponse","maybeUpdateObjects","map","peek","updateCacheForSuccess","record","records","didCommit","put","handleFetchSuccess","_join","didRequest","updateCacheForError","undefined","commitWasRejected","handleFetchError","signal","aborted","newError","willCommit","willRequest","then"],"mappings":";;;AAKO,MAAMA,UAAU,CAAC;EAKtBC,WAAWA,CAACC,SAAuB,EAAE;AACnC,IAAA,IAAI,CAACC,KAAK,GAAG,IAAID,SAAS,EAAE,CAAA;AAC5B,IAAA,IAAI,CAACE,OAAO,GAAG,IAAIC,GAAG,EAAE,CAAA;AACxB,IAAA,IAAI,CAACC,OAAO,GAAG,IAAID,GAAG,EAAE,CAAA;IACxB,IAAI,CAACE,UAAU,EAAE,CAAA;AACnB,GAAA;AAEAA,EAAAA,UAAUA,GAAG;AACXC,IAAAA,UAAU,CAACC,SAAS,GAAIC,KAAwC,IAAK;MACnE,MAAM;AAAEC,QAAAA,IAAAA;OAAM,GAAGD,KAAK,CAACE,IAAI,CAAA;AAE3B,MAAA,QAAQD,IAAI;AACV,QAAA,KAAK,SAAS;AACZ,UAAA,IAAI,CAACE,WAAW,CAACH,KAAK,CAACE,IAAI,CAACE,MAAM,EAAEJ,KAAK,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,UAAA,MAAA;AACJ,OAAA;KACD,CAAA;AACH,GAAA;AAEAF,EAAAA,WAAWA,CAACC,MAAc,EAAEE,IAAiB,EAAE;IAC7C,IAAI,CAACZ,OAAO,CAACa,GAAG,CAACH,MAAM,EAAEE,IAAI,CAAC,CAAA;IAC9B,IAAI,CAACV,OAAO,CAACW,GAAG,CAACH,MAAM,EAAE,IAAIT,GAAG,EAAE,CAAC,CAAA;AACnCW,IAAAA,IAAI,CAACP,SAAS,GAAIC,KAAwB,IAAK;AAC7C,MAAA,IAAIA,KAAK,CAACC,IAAI,KAAK,OAAO,EAAE;AAC1B,QAAA,IAAI,CAACP,OAAO,CAACc,MAAM,CAACJ,MAAM,CAAC,CAAA;AAC3B,QAAA,OAAA;AACF,OAAA;MAEA,MAAM;AAAEH,QAAAA,IAAAA;OAAM,GAAGD,KAAK,CAACE,IAAI,CAAA;AAC3B,MAAA,QAAQD,IAAI;AACV,QAAA,KAAK,OAAO;AACV,UAAA,IAAI,CAACQ,YAAY,CAACT,KAAK,CAACE,IAAI,CAAC,CAAA;AAC7B,UAAA,MAAA;AACF,QAAA,KAAK,SAAS;AACZ,UAAA,KAAK,IAAI,CAACQ,OAAO,CAACV,KAAK,CAACE,IAAI,CAAC,CAAA;AAC7B,UAAA,MAAA;AACJ,OAAA;KACD,CAAA;AACH,GAAA;EAEAO,YAAYA,CAACT,KAAqB,EAAE;IAClC,MAAM;MAAEI,MAAM;AAAEO,MAAAA,EAAAA;AAAG,KAAC,GAAGX,KAAK,CAAA;AAC5B,IAAA,MAAMY,MAAM,GAAG,IAAI,CAAChB,OAAO,CAACiB,GAAG,CAACT,MAAM,CAAC,CAAES,GAAG,CAACF,EAAE,CAAC,CAAA;AAEhD,IAAA,IAAIC,MAAM,EAAE;MACVA,MAAM,CAACE,KAAK,EAAE,CAAA;MACd,IAAI,CAAClB,OAAO,CAACiB,GAAG,CAACT,MAAM,CAAC,CAAEI,MAAM,CAACG,EAAE,CAAC,CAAA;AACtC,KAAA;AACF,GAAA;EAEA,MAAMD,OAAOA,CAACV,KAAuB,EAAE;IACrC,MAAM;MAAEI,MAAM;MAAEO,EAAE;AAAET,MAAAA,IAAAA;AAAK,KAAC,GAAGF,KAAK,CAAA;IAElC,IAAI;MACF,MAAMY,MAAM,GAAG,IAAI,CAACnB,KAAK,CAACiB,OAAO,CAACR,IAAI,CAAC,CAAA;AACvC,MAAA,IAAI,CAACN,OAAO,CAACiB,GAAG,CAACT,MAAM,CAAC,CAAEG,GAAG,CAACI,EAAE,EAAEC,MAAM,CAAC,CAAA;MAEzC,MAAMG,MAAM,GAAG,MAAMH,MAAM,CAAA;MAE3B,IAAI,CAAClB,OAAO,CAACmB,GAAG,CAACT,MAAM,CAAC,EAAEY,WAAW,CAAC;AAAEf,QAAAA,IAAI,EAAE,kBAAkB;QAAEU,EAAE;QAAEP,MAAM;QAAEF,IAAI,EAAEe,eAAe,CAACF,MAAM,CAAA;AAAE,OAAC,CAAC,CAAA;KAC/G,CAAC,OAAOG,KAAK,EAAE;AACd,MAAA,IAAIC,YAAY,CAACD,KAAK,CAAC,EAAE,OAAA;MAEzB,IAAI,CAACxB,OAAO,CAACmB,GAAG,CAACT,MAAM,CAAC,EAAEY,WAAW,CAAC;AAAEf,QAAAA,IAAI,EAAE,gBAAgB;QAAEU,EAAE;QAAEP,MAAM;AAAEF,QAAAA,IAAI,EAAEgB,KAAAA;AAAM,OAAC,CAAC,CAAA;AAC5F,KAAC,SAAS;MACR,IAAI,CAACtB,OAAO,CAACiB,GAAG,CAACT,MAAM,CAAC,CAAEI,MAAM,CAACG,EAAE,CAAC,CAAA;AACtC,KAAA;AACF,GAAA;AACF,CAAA;AAIA,SAASS,iBAAiBA,CAACC,QAAwC,EAAE;AACnE,EAAA,IAAI,CAACA,QAAQ,EAAE,OAAO,IAAI,CAAA;EAE1B,MAAMC,KAAkG,GAAG,EAAE,CAAA;EAE7G,IAAID,QAAQ,CAACE,OAAO,EAAE;AACpBD,IAAAA,KAAK,CAACC,OAAO,GAAG,EAAE,CAAA;AAClB,IAAA,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIJ,QAAQ,CAACE,OAAO,CAACG,OAAO,EAAE,EAAE;AACrDJ,MAAAA,KAAK,CAACC,OAAO,CAACC,GAAG,CAAC,GAAGC,KAAK,CAAA;AAC5B,KAAA;AACF,GAAA;AAEAH,EAAAA,KAAK,CAACK,EAAE,GAAGN,QAAQ,CAACM,EAAE,CAAA;AACtBL,EAAAA,KAAK,CAACM,UAAU,GAAGP,QAAQ,CAACO,UAAU,CAAA;AACtCN,EAAAA,KAAK,CAACO,MAAM,GAAGR,QAAQ,CAACQ,MAAM,CAAA;AAC9BP,EAAAA,KAAK,CAACQ,UAAU,GAAGT,QAAQ,CAACS,UAAU,CAAA;AACtCR,EAAAA,KAAK,CAACrB,IAAI,GAAGoB,QAAQ,CAACpB,IAAI,CAAA;AAC1BqB,EAAAA,KAAK,CAACS,GAAG,GAAGV,QAAQ,CAACU,GAAG,CAAA;AAExB,EAAA,OAAOT,KAAK,CAAA;AACd,CAAA;AAEA,SAASH,YAAYA,CAACD,KAAc,EAAkB;EACpD,OAAOA,KAAK,YAAYc,KAAK,IAAId,KAAK,CAACe,IAAI,KAAK,YAAY,CAAA;AAC9D,CAAA;AAEA,SAAShB,eAAeA,CAAIF,MAAiC,EAAE;AAC7D,EAAA,MAAMmB,WAAW,GAAG;AAClBb,IAAAA,QAAQ,EAAED,iBAAiB,CAACL,MAAM,CAACM,QAAQ,CAAC;IAC5Cc,OAAO,EAAEpB,MAAM,CAACoB,OAAAA;GACjB,CAAA;AAED,EAAA,OAAOD,WAAW,CAAA;AACpB;;ACxGO,MAAME,YAAY,GAAG,IAAIC,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAA;;AAErF;AACA;AACA;AACA;AACA;AACO,SAASC,eAAeA,CAC7B7C,KAAY,EACZiB,OAA6B,EAC7B6B,cAAuB,EACvBC,UAA2C,EAClC;EACT,MAAM;AAAEC,IAAAA,YAAAA;AAAa,GAAC,GAAG/B,OAAO,CAAA;EAChC,OACGA,OAAO,CAACgC,EAAE,IAAIN,YAAY,CAACO,GAAG,CAACjC,OAAO,CAACgC,EAAE,CAAC,IAC3CD,YAAY,EAAEG,MAAM,IACpBH,YAAY,EAAEI,gBAAgB,IAC9B,CAACN,cAAc,KACd9C,KAAK,CAACqD,SAAS,IAAIN,UAAU,GAC1B/C,KAAK,CAACqD,SAAS,CAACC,aAAa,CAACP,UAAU,EAAE/C,KAAK,CAAC,IAAIA,KAAK,CAACqD,SAAS,CAACE,aAAa,CAACR,UAAU,EAAE/C,KAAK,CAAC,GACpG,KAAK,CAAC,CAAA;AAEd,CAAA;AAEO,SAASwD,UAAUA,CACxBvC,OAAsC,EACoE;AAC1G,EAAA,OAAOwC,OAAO,CAACxC,OAAO,CAACgC,EAAE,IAAIN,YAAY,CAACO,GAAG,CAACjC,OAAO,CAACgC,EAAE,CAAC,CAAC,CAAA;AAC5D,CAAA;AAEO,SAASS,gBAAgBA,CAAIC,QAAmC,EAAW;AAChF,EAAA,IAAI,CAACH,UAAU,CAACG,QAAQ,CAAC1C,OAAO,CAAC,EAAE;AACjC,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;AACA;AACA;AACA;;AAEA,EAAA,IAAI0C,QAAQ,CAAC1C,OAAO,CAACgC,EAAE,KAAK,cAAc,IAAIU,QAAQ,CAAC/B,QAAQ,EAAEQ,MAAM,KAAK,GAAG,EAAE;AAC/E,IAAA,OAAOuB,QAAQ,CAACjB,OAAO,GAAGkB,MAAM,CAACC,IAAI,CAACF,QAAQ,CAACjB,OAAO,CAAC,CAACoB,MAAM,GAAG,CAAC,GAAG,KAAK,CAAA;AAC5E,GAAA;AAEA,EAAA,OAAOH,QAAQ,CAAC/B,QAAQ,EAAEQ,MAAM,KAAK,GAAG,CAAA;AAC1C,CAAA;AAEA,SAAS2B,gBAAgBA,CAACtC,KAAsC,EAAoD;AAClH,EAAA,OAAOA,KAAK,YAAYuC,cAAc,IAAKvC,KAAK,CAACe,IAAI,KAAK,gBAAgB,IAAIyB,KAAK,CAACC,OAAO,CAACzC,KAAK,CAAC0C,MAAM,CAAE,CAAA;AAC5G,CAAA;AAIA;AACO,SAASC,UAAUA,CAAC3C,KAAkB,EAAE;AAC7C,EAAA,MAAM4C,WAAW,GAAGN,gBAAgB,CAACtC,KAAK,CAAC,CAAA;EAE3C,MAAM6C,MAAM,GACVD,WAAW,GAAG,IAAIL,cAAc,CAACO,eAAe,CAAC9C,KAAK,CAAC0C,MAAM,CAAC,EAAE1C,KAAK,CAAC+C,OAAO,CAAC,GAAG,IAAIjC,KAAK,CAACd,KAAK,CAAC+C,OAAO,CAC1F,CAAA;AAChBF,EAAAA,MAAM,CAACG,KAAK,GAAGhD,KAAK,CAACgD,KAAM,CAAA;AAC3BH,EAAAA,MAAM,CAAC7C,KAAK,GAAGA,KAAK,CAACA,KAAK,CAAA;;AAE1B;AACAmC,EAAAA,MAAM,CAACc,MAAM,CAACJ,MAAM,EAAE7C,KAAK,CAAC,CAAA;AAE5B,EAAA,OAAO6C,MAAM,CAAA;AACf;;AC3DO,MAAMK,YAA8B,GAAG;AAC5C1D,EAAAA,OAAOA,CAAI2D,OAA4B,EAAEC,IAAe,EAA0D;AAChH;AACA,IAAA,IAAI,CAACD,OAAO,CAAC3D,OAAO,CAACjB,KAAK,IAAI4E,OAAO,CAAC3D,OAAO,CAAC+B,YAAY,GAAG8B,SAAS,CAAC,EAAE;AACvE,MAAA,OAAOD,IAAI,CAACD,OAAO,CAAC3D,OAAO,CAAC,CAAA;AAC9B,KAAA;IAEA,MAAM;AAAEjB,MAAAA,KAAAA;KAAO,GAAG4E,OAAO,CAAC3D,OAAO,CAAA;IACjC,MAAM8B,UAAU,GAAG/C,KAAK,CAAC+E,eAAe,CAACC,6BAA6B,CAACJ,OAAO,CAAC3D,OAAO,CAAC,CAAA;AACvF,IAAA,MAAMgE,MAAM,GAAGlC,UAAU,GAAG/C,KAAK,CAACkF,KAAK,CAACC,WAAW,CAACpC,UAAU,CAAC,GAAG,IAAI,CAAA;;AAEtE;AACA;AACA,IAAA,IAAIF,eAAe,CAAC7C,KAAK,EAAE4E,OAAO,CAAC3D,OAAO,EAAE,CAAC,CAACgE,MAAM,EAAElC,UAAU,CAAC,EAAE;AACjE,MAAA,OAAOqC,sBAAsB,CAACP,IAAI,EAAED,OAAO,EAAE7B,UAAU,CAAC,CAAA;AAC1D,KAAA;IAEAsC,cAAA,CAAAC,eAAA,EAAAC,CAAAA,SAAA,CAAAC,GAAA,CAAAC,KAAA,CAAA,GAAA,CAAAC,IAAA,IAAA;AAAA,MAAA,IAAA,CAAAA,IAAA,EAAA;QAAA,MAAAnD,IAAAA,KAAA,CAAQ,CAAwC,uCAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAE0C,MAAM,CAAA,GAAA,EAAA,CAAA;AACxDL,IAAAA,OAAO,CAACe,WAAW,CAACV,MAAM,CAACrD,QAAQ,CAAC,CAAA;IAEpC,IAAI,OAAO,IAAIqD,MAAM,EAAE;AACrB,MAAA,MAAMA,MAAM,CAAA;AACd,KAAA;AAEA,IAAA,OAAOW,kBAAkB,CAAI5F,KAAK,EAAEiF,MAAM,CAACvC,OAA+B,CAAC,CAAA;AAC7E,GAAA;AACF,EAAC;AAED,SAASkD,kBAAkBA,CAAI5F,KAAY,EAAE2D,QAAqC,EAAK;EACrF,IAAI,CAACA,QAAQ,EAAE;AACb,IAAA,OAAOA,QAAQ,CAAA;AACjB,GAAA;EAEA,IAAIM,KAAK,CAACC,OAAO,CAACP,QAAQ,CAAClD,IAAI,CAAC,EAAE;IAChC,MAAMA,IAAI,GAAGkD,QAAQ,CAAClD,IAAI,CAACoF,GAAG,CAAE9C,UAAU,IAAK;AAC7C,MAAA,OAAO/C,KAAK,CAACkF,KAAK,CAACY,IAAI,CAAC/C,UAAU,CAAC,CAAA;AACrC,KAAC,CAAC,CAAA;IAEF,OAAOa,MAAM,CAACc,MAAM,CAAC,EAAE,EAAEf,QAAQ,EAAE;AAAElD,MAAAA,IAAAA;AAAK,KAAC,CAAC,CAAA;AAC9C,GAAC,MAAM;AACL,IAAA,MAAMA,IAAI,GAAIkD,QAAQ,CAAClD,IAAI,GAAGT,KAAK,CAACkF,KAAK,CAACY,IAAI,CAACnC,QAAQ,CAAClD,IAAI,CAAC,GAAG,IAAU,CAAA;IAC1E,OAAOmD,MAAM,CAACc,MAAM,CAAC,EAAE,EAAEf,QAAQ,EAAE;AAAElD,MAAAA,IAAAA;AAAK,KAAC,CAAC,CAAA;AAC9C,GAAA;AACF,CAAA;AAEA,SAASsF,qBAAqBA,CAC5B/F,KAAY,EACZiB,OAAuC,EACvC0C,QAAmC,EACnC;EACA,IAAI/B,QAAqC,GAAG,IAAI,CAAA;AAChD,EAAA,IAAI4B,UAAU,CAACvC,OAAO,CAAC,EAAE;AACvB,IAAA,MAAM+E,MAAM,GAAG/E,OAAO,CAACR,IAAI,EAAEuF,MAAM,IAAI/E,OAAO,CAACgF,OAAO,GAAG,CAAC,CAAC,CAAA;AAC3D,IAAA,IAAID,MAAM,EAAE;MACVpE,QAAQ,GAAG5B,KAAK,CAACkF,KAAK,CAACgB,SAAS,CAACF,MAAM,EAAErC,QAAQ,CAAyB,CAAA;;AAE1E;AACA;AACA;AACF,KAAC,MAAM,IAAID,gBAAgB,CAACC,QAAQ,CAAC,EAAE;MACrC/B,QAAQ,GAAG5B,KAAK,CAACkF,KAAK,CAACiB,GAAG,CAACxC,QAAQ,CAAyB,CAAA;AAC9D,KAAA;AACF,GAAC,MAAM;IACL/B,QAAQ,GAAG5B,KAAK,CAACkF,KAAK,CAACiB,GAAG,CAACxC,QAAQ,CAAyB,CAAA;AAC9D,GAAA;AACA,EAAA,OAAOiC,kBAAkB,CAAC5F,KAAK,EAAE4B,QAAQ,CAAC,CAAA;AAC5C,CAAA;AAEA,SAASwE,kBAAkBA,CACzBpG,KAAY,EACZiB,OAAuC,EACvC8B,UAA2C,EAC3CY,QAAmC,EAChC;AACH,EAAA,IAAI/B,QAA8B,CAAA;EAClC5B,KAAK,CAACqG,KAAK,CAAC,MAAM;IAChBzE,QAAQ,GAAGmE,qBAAqB,CAAI/F,KAAK,EAAEiB,OAAO,EAAE0C,QAAQ,CAAyB,CAAA;AACvF,GAAC,CAAC,CAAA;AAEF,EAAA,IAAI3D,KAAK,CAACqD,SAAS,EAAEiD,UAAU,EAAE;AAC/BtG,IAAAA,KAAK,CAACqD,SAAS,CAACiD,UAAU,CAACrF,OAAO,EAAE0C,QAAQ,CAAC/B,QAAQ,EAAEmB,UAAU,EAAE/C,KAAK,CAAC,CAAA;AAC3E,GAAA;AAEA,EAAA,OAAO4B,QAAQ,CAAA;AACjB,CAAA;AAEA,SAAS2E,mBAAmBA,CAC1BvG,KAAY,EACZiB,OAAuC,EACvCQ,KAAiC,EACjC;AACA,EAAA,IAAI+B,UAAU,CAACvC,OAAO,CAAC,EAAE;AACvB;AACA;AACA,IAAA,MAAMkD,MAAM,GACV1C,KAAK,IACLA,KAAK,CAACiB,OAAO,IACb,OAAOjB,KAAK,CAACiB,OAAO,KAAK,QAAQ,IACjC,QAAQ,IAAIjB,KAAK,CAACiB,OAAO,IACzBuB,KAAK,CAACC,OAAO,CAACzC,KAAK,CAACiB,OAAO,CAACyB,MAAM,CAAC,GAC9B1C,KAAK,CAACiB,OAAO,CAACyB,MAAM,GACrBqC,SAAS,CAAA;AAEf,IAAA,MAAMR,MAAM,GAAG/E,OAAO,CAACR,IAAI,EAAEuF,MAAM,IAAI/E,OAAO,CAACgF,OAAO,GAAG,CAAC,CAAC,CAAA;IAE3DjG,KAAK,CAACkF,KAAK,CAACuB,iBAAiB,CAACT,MAAM,EAAE7B,MAAM,CAAC,CAAA;AAC/C,GAAC,MAAM;AACL,IAAA,OAAOnE,KAAK,CAACkF,KAAK,CAACiB,GAAG,CAAC1E,KAAK,CAAC,CAAA;AAC/B,GAAA;AACF,CAAA;AAEA,SAASiF,gBAAgBA,CACvB1G,KAAY,EACZiB,OAAuC,EACvC8B,UAA2C,EAC3CtB,KAAiC,EAC1B;AACP,EAAA,IAAIR,OAAO,CAAC0F,MAAM,EAAEC,OAAO,EAAE;AAC3B,IAAA,MAAMnF,KAAK,CAAA;AACb,GAAA;AACA,EAAA,IAAIG,QAA2C,CAAA;EAC/C5B,KAAK,CAACqG,KAAK,CAAC,MAAM;IAChBzE,QAAQ,GAAG2E,mBAAmB,CAACvG,KAAK,EAAEiB,OAAO,EAAEQ,KAAK,CAAC,CAAA;AACvD,GAAC,CAAC,CAAA;AAEF,EAAA,IAAIsB,UAAU,IAAI/C,KAAK,CAACqD,SAAS,EAAEiD,UAAU,EAAE;AAC7CtG,IAAAA,KAAK,CAACqD,SAAS,CAACiD,UAAU,CAACrF,OAAO,EAAEQ,KAAK,CAACG,QAAQ,EAAEmB,UAAU,EAAE/C,KAAK,CAAC,CAAA;AACxE,GAAA;AAEA,EAAA,IAAIwD,UAAU,CAACvC,OAAO,CAAC,EAAE;AACvB,IAAA,MAAMQ,KAAK,CAAA;AACb,GAAA;AAEA,EAAA,MAAMoF,QAAQ,GAAGzC,UAAU,CAAC3C,KAAK,CAAC,CAAA;EAClCoF,QAAQ,CAACnE,OAAO,GAAGd,QAAS,CAAA;AAC5B,EAAA,MAAMiF,QAAQ,CAAA;AAChB,CAAA;AAEA,SAASzB,sBAAsBA,CAC7BP,IAAe,EACfD,OAA4B,EAC5B7B,UAA2C,EAC/B;EACZ,MAAM;AAAE9B,IAAAA,OAAAA;AAAQ,GAAC,GAAG2D,OAAO,CAAA;EAC3B,MAAM;AAAE5E,IAAAA,KAAAA;GAAO,GAAG4E,OAAO,CAAC3D,OAAO,CAAA;AAEjC,EAAA,IAAIuC,UAAU,CAACvC,OAAO,CAAC,EAAE;AACvB;AACA,IAAA,MAAM+E,MAAM,GAAG/E,OAAO,CAACR,IAAI,EAAEuF,MAAM,IAAI/E,OAAO,CAACgF,OAAO,GAAG,CAAC,CAAC,CAAA;IAC3DZ,cAAA,CAAAC,eAAA,EAAAC,CAAAA,SAAA,CAAAC,GAAA,CAAAC,KAAA,CAAA,GAAA,CAAAC,IAAA,IAAA;AAAA,MAAA,IAAA,CAAAA,IAAA,EAAA;AAAA,QAAA,MAAA,IAAAnD,KAAA,CAAQ,CAAA,sDAAA,EAAwDtB,OAAO,CAACgC,EAAG,CAAS,QAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAE+C,MAAM,CAAA,GAAA,EAAA,CAAA;AAC5F,IAAA,IAAIA,MAAM,EAAE;MACVhG,KAAK,CAACkF,KAAK,CAAC4B,UAAU,CAACd,MAAM,EAAEpB,OAAO,CAAC,CAAA;AACzC,KAAA;AACF,GAAA;AAEA,EAAA,IAAI5E,KAAK,CAACqD,SAAS,EAAE0D,WAAW,EAAE;IAChC/G,KAAK,CAACqD,SAAS,CAAC0D,WAAW,CAAC9F,OAAO,EAAE8B,UAAU,EAAE/C,KAAK,CAAC,CAAA;AACzD,GAAA;AAEA,EAAA,OAAO6E,IAAI,CAAC5D,OAAO,CAAC,CAAC+F,IAAI,CACtBrD,QAAQ,IAAKyC,kBAAkB,CAACpG,KAAK,EAAEiB,OAAO,EAAE8B,UAAU,EAAEY,QAAQ,CAAC,EACrElC,KAAiC,IAAKiF,gBAAgB,CAAC1G,KAAK,EAAEiB,OAAO,EAAE8B,UAAU,EAAEtB,KAAK,CAC3F,CAAC,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"data-worker.js","sources":["../src/data-worker/worker.ts","../src/data-worker/utils.ts","../src/data-worker/cache-handler.ts"],"sourcesContent":["import type { Future, ResponseInfo, StructuredDataDocument } from '@ember-data-mirror/request';\nimport type Store from '@ember-data-mirror/store';\n\nimport type { AbortEventData, RequestEventData, ThreadInitEventData, WorkerThreadEvent } from './types';\n\nexport class DataWorker {\n declare store: Store;\n declare threads: Map<string, MessagePort>;\n declare pending: Map<string, Map<number, Future<unknown>>>;\n\n constructor(UserStore: typeof Store) {\n this.store = new UserStore();\n this.threads = new Map();\n this.pending = new Map();\n this.initialize();\n }\n\n initialize() {\n globalThis.onmessage = (event: MessageEvent<ThreadInitEventData>) => {\n const { type } = event.data;\n\n switch (type) {\n case 'connect':\n this.setupThread(event.data.thread, event.ports[0]);\n break;\n }\n };\n }\n\n setupThread(thread: string, port: MessagePort) {\n this.threads.set(thread, port);\n this.pending.set(thread, new Map());\n port.onmessage = (event: WorkerThreadEvent) => {\n if (event.type === 'close') {\n this.threads.delete(thread);\n return;\n }\n\n const { type } = event.data;\n switch (type) {\n case 'abort':\n this.abortRequest(event.data);\n break;\n case 'request':\n void this.request(prepareRequest(event.data));\n break;\n }\n };\n }\n\n abortRequest(event: AbortEventData) {\n const { thread, id } = event;\n const future = this.pending.get(thread)!.get(id);\n\n if (future) {\n future.abort();\n this.pending.get(thread)!.delete(id);\n }\n }\n\n async request(event: RequestEventData) {\n const { thread, id, data } = event;\n\n try {\n const future = this.store.request(data);\n this.pending.get(thread)!.set(id, future);\n\n const result = await future;\n\n this.threads.get(thread)?.postMessage({ type: 'success-response', id, thread, data: prepareResponse(result) });\n } catch (error) {\n if (isAbortError(error)) return;\n\n this.threads.get(thread)?.postMessage({ type: 'error-response', id, thread, data: error });\n } finally {\n this.pending.get(thread)!.delete(id);\n }\n }\n}\n\ntype Mutable<T> = { -readonly [P in keyof T]: T[P] };\n\nfunction softCloneResponse(response: Response | ResponseInfo | null) {\n if (!response) return null;\n\n const clone: Partial<Mutable<Response>> = {};\n\n if (response.headers) {\n clone.headers = Array.from(response.headers.entries()) as unknown as Headers;\n }\n\n clone.ok = response.ok;\n clone.redirected = response.redirected;\n clone.status = response.status;\n clone.statusText = response.statusText;\n clone.type = response.type;\n clone.url = response.url;\n\n return clone;\n}\n\nfunction isAbortError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction prepareResponse<T>(result: StructuredDataDocument<T>) {\n const newResponse = {\n response: softCloneResponse(result.response),\n content: result.content,\n };\n\n return newResponse;\n}\n\nfunction prepareRequest(event: RequestEventData) {\n if (event.data.headers) {\n event.data.headers = new Headers(event.data.headers);\n }\n\n return event;\n}\n","import type Store from '@ember-data-mirror/store';\nimport type { StableDocumentIdentifier } from '@warp-drive-mirror/core-types/identifier';\nimport type {\n ImmutableCreateRequestOptions,\n ImmutableDeleteRequestOptions,\n ImmutableRequestInfo,\n ImmutableUpdateRequestOptions,\n StructuredDataDocument,\n} from '@warp-drive-mirror/core-types/request';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nexport const MUTATION_OPS = new Set(['createRecord', 'updateRecord', 'deleteRecord']);\n\n/**\n * In a Worker, any time we are asked to make a request, data needs to be returned.\n * background requests are ergo no different than foreground requests.\n * @internal\n */\nexport function calcShouldFetch(\n store: Store,\n request: ImmutableRequestInfo,\n hasCachedValue: boolean,\n identifier: StableDocumentIdentifier | null\n): boolean {\n const { cacheOptions } = request;\n return (\n (request.op && MUTATION_OPS.has(request.op)) ||\n cacheOptions?.reload ||\n cacheOptions?.backgroundReload ||\n !hasCachedValue ||\n (store.lifetimes && identifier\n ? store.lifetimes.isHardExpired(identifier, store) || store.lifetimes.isSoftExpired(identifier, store)\n : false)\n );\n}\n\nexport function isMutation(\n request: Partial<ImmutableRequestInfo>\n): request is ImmutableUpdateRequestOptions | ImmutableCreateRequestOptions | ImmutableDeleteRequestOptions {\n return Boolean(request.op && MUTATION_OPS.has(request.op));\n}\n\nexport function isCacheAffecting<T>(document: StructuredDataDocument<T>): boolean {\n if (!isMutation(document.request)) {\n return true;\n }\n // a mutation combined with a 204 has no cache impact when no known records were involved\n // a createRecord with a 201 with an empty response and no known records should similarly\n // have no cache impact\n\n if (document.request.op === 'createRecord' && document.response?.status === 201) {\n return document.content ? Object.keys(document.content).length > 0 : false;\n }\n\n return document.response?.status !== 204;\n}\n\nfunction isAggregateError(error: Error & { errors?: ApiError[] }): error is AggregateError & { errors: ApiError[] } {\n return error instanceof AggregateError || (error.name === 'AggregateError' && Array.isArray(error.errors));\n}\n\ntype RobustError = Error & { error: string | object; errors?: ApiError[]; content?: unknown };\n\n// TODO @runspired, consider if we should deep freeze errors (potentially only in debug) vs cloning them\nexport function cloneError(error: RobustError) {\n const isAggregate = isAggregateError(error);\n\n const cloned = (\n isAggregate ? new AggregateError(structuredClone(error.errors), error.message) : new Error(error.message)\n ) as RobustError;\n cloned.stack = error.stack!;\n cloned.error = error.error;\n\n // copy over enumerable properties\n Object.assign(cloned, error);\n\n return cloned;\n}\n","import type { CacheHandler as CacheHandlerType, Future, NextFn } from '@ember-data-mirror/request';\nimport type Store from '@ember-data-mirror/store';\nimport type { StoreRequestContext } from '@ember-data-mirror/store';\nimport { assert } from '@warp-drive-mirror/build-config/macros';\nimport type { StableDocumentIdentifier } from '@warp-drive-mirror/core-types/identifier';\nimport type { StructuredDataDocument, StructuredErrorDocument } from '@warp-drive-mirror/core-types/request';\nimport { SkipCache } from '@warp-drive-mirror/core-types/request';\nimport type { ResourceDataDocument, ResourceErrorDocument } from '@warp-drive-mirror/core-types/spec/document';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nimport { calcShouldFetch, cloneError, isCacheAffecting, isMutation } from './utils';\n\n/**\n * A simplified CacheHandler that hydrates ResourceDataDocuments from the cache\n * with their referenced resources.\n *\n * @typedoc\n */\nexport const CacheHandler: CacheHandlerType = {\n request<T>(context: StoreRequestContext, next: NextFn<T>): Promise<T | StructuredDataDocument<T>> | Future<T> | T {\n // if we have no cache or no cache-key skip cache handling\n if (!context.request.store || context.request.cacheOptions?.[SkipCache]) {\n return next(context.request);\n }\n\n const { store } = context.request;\n const identifier = store.identifierCache.getOrCreateDocumentIdentifier(context.request);\n const peeked = identifier ? store.cache.peekRequest(identifier) : null;\n\n // In a Worker, any time we are asked to make a request, data needs to be returned.\n // background requests are ergo no different than foreground requests.\n if (calcShouldFetch(store, context.request, !!peeked, identifier)) {\n return fetchContentAndHydrate(next, context, identifier);\n }\n\n assert(`Expected a peeked request to be present`, peeked);\n context.setResponse(peeked.response);\n\n if ('error' in peeked) {\n throw peeked;\n }\n\n return maybeUpdateObjects<T>(store, peeked.content as ResourceDataDocument);\n },\n};\n\nfunction maybeUpdateObjects<T>(store: Store, document: ResourceDataDocument | null): T {\n if (!document) {\n return document as T;\n }\n\n if (Array.isArray(document.data)) {\n const data = document.data.map((identifier) => {\n return store.cache.peek(identifier);\n });\n\n return Object.assign({}, document, { data }) as T;\n } else {\n const data = (document.data ? store.cache.peek(document.data) : null) as T;\n return Object.assign({}, document, { data }) as T;\n }\n}\n\nfunction updateCacheForSuccess<T>(\n store: Store,\n request: StoreRequestContext['request'],\n document: StructuredDataDocument<T>\n) {\n let response: ResourceDataDocument | null = null;\n if (isMutation(request)) {\n const record = request.data?.record || request.records?.[0];\n if (record) {\n response = store.cache.didCommit(record, document) as ResourceDataDocument;\n\n // a mutation combined with a 204 has no cache impact when no known records were involved\n // a createRecord with a 201 with an empty response and no known records should similarly\n // have no cache impact\n } else if (isCacheAffecting(document)) {\n response = store.cache.put(document) as ResourceDataDocument;\n }\n } else {\n response = store.cache.put(document) as ResourceDataDocument;\n }\n return maybeUpdateObjects(store, response);\n}\n\nfunction handleFetchSuccess<T>(\n store: Store,\n request: StoreRequestContext['request'],\n identifier: StableDocumentIdentifier | null,\n document: StructuredDataDocument<T>\n): T {\n let response: ResourceDataDocument;\n store._join(() => {\n response = updateCacheForSuccess<T>(store, request, document) as ResourceDataDocument;\n });\n\n if (store.lifetimes?.didRequest) {\n store.lifetimes.didRequest(request, document.response, identifier, store);\n }\n\n return response! as T;\n}\n\nfunction updateCacheForError<T>(\n store: Store,\n request: StoreRequestContext['request'],\n error: StructuredErrorDocument<T>\n) {\n if (isMutation(request)) {\n // TODO similar to didCommit we should spec this to be similar to cache.put for handling full response\n // currently we let the response remain undefiend.\n const errors =\n error &&\n error.content &&\n typeof error.content === 'object' &&\n 'errors' in error.content &&\n Array.isArray(error.content.errors)\n ? (error.content.errors as ApiError[])\n : undefined;\n\n const record = request.data?.record || request.records?.[0];\n\n store.cache.commitWasRejected(record, errors);\n } else {\n return store.cache.put(error) as ResourceErrorDocument;\n }\n}\n\nfunction handleFetchError<T>(\n store: Store,\n request: StoreRequestContext['request'],\n identifier: StableDocumentIdentifier | null,\n error: StructuredErrorDocument<T>\n): never {\n if (request.signal?.aborted) {\n throw error;\n }\n let response: ResourceErrorDocument | undefined;\n store._join(() => {\n response = updateCacheForError(store, request, error);\n });\n\n if (identifier && store.lifetimes?.didRequest) {\n store.lifetimes.didRequest(request, error.response, identifier, store);\n }\n\n if (isMutation(request)) {\n throw error;\n }\n\n const newError = cloneError(error);\n newError.content = response!;\n throw newError;\n}\n\nfunction fetchContentAndHydrate<T>(\n next: NextFn<T>,\n context: StoreRequestContext,\n identifier: StableDocumentIdentifier | null\n): Promise<T> {\n const { request } = context;\n const { store } = context.request;\n\n if (isMutation(request)) {\n // TODO should we handle multiple records in request.records by iteratively calling willCommit for each\n const record = request.data?.record || request.records?.[0];\n assert(`Expected to receive a list of records included in the ${request.op} request`, record);\n if (record) {\n store.cache.willCommit(record, context);\n }\n }\n\n if (store.lifetimes?.willRequest) {\n store.lifetimes.willRequest(request, identifier, store);\n }\n\n return next(request).then(\n (document) => handleFetchSuccess(store, request, identifier, document),\n (error: StructuredErrorDocument<T>) => handleFetchError(store, request, identifier, error)\n );\n}\n"],"names":["DataWorker","constructor","UserStore","store","threads","Map","pending","initialize","globalThis","onmessage","event","type","data","setupThread","thread","ports","port","set","delete","abortRequest","request","prepareRequest","id","future","get","abort","result","postMessage","prepareResponse","error","isAbortError","softCloneResponse","response","clone","headers","Array","from","entries","ok","redirected","status","statusText","url","Error","name","newResponse","content","Headers","MUTATION_OPS","Set","calcShouldFetch","hasCachedValue","identifier","cacheOptions","op","has","reload","backgroundReload","lifetimes","isHardExpired","isSoftExpired","isMutation","Boolean","isCacheAffecting","document","Object","keys","length","isAggregateError","AggregateError","isArray","errors","cloneError","isAggregate","cloned","structuredClone","message","stack","assign","CacheHandler","context","next","SkipCache","identifierCache","getOrCreateDocumentIdentifier","peeked","cache","peekRequest","fetchContentAndHydrate","macroCondition","getGlobalConfig","WarpDrive","env","DEBUG","test","setResponse","maybeUpdateObjects","map","peek","updateCacheForSuccess","record","records","didCommit","put","handleFetchSuccess","_join","didRequest","updateCacheForError","undefined","commitWasRejected","handleFetchError","signal","aborted","newError","willCommit","willRequest","then"],"mappings":"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"}
|
package/dist/worker-fetch.js
CHANGED
|
@@ -134,13 +134,17 @@ function enhanceReason(reason) {
|
|
|
134
134
|
}
|
|
135
135
|
function prepareRequest(request) {
|
|
136
136
|
const {
|
|
137
|
-
signal
|
|
137
|
+
signal,
|
|
138
|
+
headers
|
|
138
139
|
} = request;
|
|
139
140
|
const requestCopy = Object.assign({}, request);
|
|
140
141
|
delete requestCopy.store;
|
|
141
142
|
if (signal instanceof AbortSignal) {
|
|
142
143
|
delete requestCopy.signal;
|
|
143
144
|
}
|
|
145
|
+
if (headers instanceof Headers) {
|
|
146
|
+
requestCopy.headers = Array.from(headers.entries());
|
|
147
|
+
}
|
|
144
148
|
return {
|
|
145
149
|
signal: signal || null,
|
|
146
150
|
request: requestCopy
|
package/dist/worker-fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-fetch.js","sources":["../src/data-worker/fetch.ts"],"sourcesContent":["import type { RequestInfo } from '@ember-data-mirror/request';\nimport { createDeferred } from '@ember-data-mirror/request';\nimport type { Context } from '@ember-data-mirror/request/-private/context';\nimport type { Deferred, Future, NextFn } from '@ember-data-mirror/request/-private/types';\nimport { TESTING } from '@warp-drive-mirror/build-config/env';\nimport { assert } from '@warp-drive-mirror/build-config/macros';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nimport type { AbortEventData, MainThreadEvent, RequestEventData } from './types';\n\nexport interface FastBoot {\n require(moduleName: string): unknown;\n isFastBoot: boolean;\n request: Request;\n}\n\ndeclare global {\n const FastBoot: undefined | FastBoot;\n}\n\nconst isServerEnv = typeof FastBoot !== 'undefined';\n\nfunction isAggregateError(error: Error & { errors?: ApiError[] }): error is AggregateError & { errors: ApiError[] } {\n return error instanceof AggregateError || (error.name === 'AggregateError' && Array.isArray(error.errors));\n}\n\ntype RobustError = Error & { error: string | object; errors?: ApiError[]; content?: unknown };\n\nfunction stitchTrace(stack: string, origin: string) {\n if (origin.startsWith('Error\\n')) {\n return origin.slice(6) + '\\n' + stack;\n }\n return origin + '\\n' + stack;\n}\n\nfunction cloneError(error: RobustError, stack: string) {\n const isAggregate = isAggregateError(error);\n\n const cloned = (\n isAggregate ? new AggregateError(structuredClone(error.errors), error.message) : new Error(error.message)\n ) as RobustError;\n cloned.stack = stitchTrace(error.stack || '', stack);\n cloned.error = error.error;\n\n // copy over enumerable properties\n Object.assign(cloned, error);\n\n return cloned;\n}\n\nexport class WorkerFetch {\n declare worker: Worker | SharedWorker;\n declare threadId: string;\n declare pending: Map<\n number,\n { context: Context; signal: AbortSignal | null; abortFn: () => void; deferred: Deferred<unknown>; stack: string }\n >;\n declare channel: MessageChannel;\n\n constructor(worker: Worker | SharedWorker | null) {\n this.threadId = isServerEnv ? '' : crypto.randomUUID();\n this.pending = new Map();\n\n const isTesting = TESTING ? true : false;\n assert(`Expected a SharedWorker instance`, isTesting || isServerEnv || worker instanceof SharedWorker);\n this.worker = worker as SharedWorker;\n\n if (!isServerEnv) {\n this.channel = new MessageChannel();\n\n const port = this.worker instanceof SharedWorker ? this.worker.port : this.worker;\n port.postMessage({ type: 'connect', thread: this.threadId }, [this.channel.port2]);\n\n this.channel.port1.onmessage = (event: MainThreadEvent<unknown>) => {\n const { type, id, data } = event.data;\n const info = this.cleanupRequest(id);\n\n // typically this means the request was aborted\n if (!info) {\n return;\n }\n\n if (type === 'success-response') {\n const { deferred } = info;\n\n const { response, content } = data;\n\n if (response) {\n (response as { headers: Headers }).headers = new Headers(response.headers);\n info.context.setResponse(new Response(null, response));\n }\n\n deferred.resolve(content);\n return;\n }\n\n if (type === 'error-response') {\n const { deferred, stack } = info;\n\n deferred.reject(cloneError(data, stack));\n return;\n }\n };\n }\n }\n\n cleanupRequest(id: number) {\n const info = this.pending.get(id);\n this.pending.delete(id);\n\n if (info?.signal) {\n info.signal.removeEventListener('abort', info.abortFn);\n }\n\n return info;\n }\n\n send(event: RequestEventData | AbortEventData) {\n this.channel.port1.postMessage(event);\n }\n\n request<T>(context: Context, next: NextFn<T>): Promise<T> | Future<T> {\n if (isServerEnv) {\n return next(context.request);\n }\n\n const deferred = createDeferred<T>();\n const { signal, request } = prepareRequest(context.request);\n const abortFn = signal\n ? () => {\n deferred.reject(enhanceReason(signal.reason as string));\n this.send({ type: 'abort', thread: this.threadId, id: context.id, data: signal.reason as string });\n this.cleanupRequest(context.id);\n }\n : () => {\n return;\n };\n\n signal?.addEventListener('abort', abortFn);\n\n try {\n throw new Error();\n } catch (e: unknown) {\n this.pending.set(context.id, {\n context,\n deferred,\n signal,\n abortFn,\n stack: (e as Error).stack!,\n });\n }\n\n this.send({\n type: 'request',\n thread: this.threadId,\n id: context.id,\n data: request,\n });\n\n return deferred.promise;\n }\n}\n\nexport function enhanceReason(reason?: string) {\n return new DOMException(reason || 'The user aborted a request.', 'AbortError');\n}\n\nfunction prepareRequest(request: Context['request']): { signal: AbortSignal | null; request: RequestInfo } {\n const { signal } = request;\n const requestCopy = Object.assign({}, request) as RequestInfo;\n\n delete requestCopy.store;\n\n if (signal instanceof AbortSignal) {\n delete requestCopy.signal;\n }\n\n return { signal: signal || null, request: requestCopy };\n}\n"],"names":["isServerEnv","FastBoot","isAggregateError","error","AggregateError","name","Array","isArray","errors","stitchTrace","stack","origin","startsWith","slice","cloneError","isAggregate","cloned","structuredClone","message","Error","Object","assign","WorkerFetch","constructor","worker","threadId","crypto","randomUUID","pending","Map","isTesting","macroCondition","getGlobalConfig","WarpDrive","env","TESTING","DEBUG","test","SharedWorker","channel","MessageChannel","port","postMessage","type","thread","port2","port1","onmessage","event","id","data","info","cleanupRequest","deferred","response","content","headers","Headers","context","setResponse","Response","resolve","reject","get","delete","signal","removeEventListener","abortFn","send","request","next","createDeferred","prepareRequest","enhanceReason","reason","addEventListener","e","set","promise","DOMException","requestCopy","store","AbortSignal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker-fetch.js","sources":["../src/data-worker/fetch.ts"],"sourcesContent":["import type { RequestInfo } from '@ember-data-mirror/request';\nimport { createDeferred } from '@ember-data-mirror/request';\nimport type { Context } from '@ember-data-mirror/request/-private/context';\nimport type { Deferred, Future, NextFn } from '@ember-data-mirror/request/-private/types';\nimport { TESTING } from '@warp-drive-mirror/build-config/env';\nimport { assert } from '@warp-drive-mirror/build-config/macros';\nimport type { ApiError } from '@warp-drive-mirror/core-types/spec/error';\n\nimport type { AbortEventData, MainThreadEvent, RequestEventData } from './types';\n\nexport interface FastBoot {\n require(moduleName: string): unknown;\n isFastBoot: boolean;\n request: Request;\n}\n\ndeclare global {\n const FastBoot: undefined | FastBoot;\n}\n\nconst isServerEnv = typeof FastBoot !== 'undefined';\n\nfunction isAggregateError(error: Error & { errors?: ApiError[] }): error is AggregateError & { errors: ApiError[] } {\n return error instanceof AggregateError || (error.name === 'AggregateError' && Array.isArray(error.errors));\n}\n\ntype RobustError = Error & { error: string | object; errors?: ApiError[]; content?: unknown };\n\nfunction stitchTrace(stack: string, origin: string) {\n if (origin.startsWith('Error\\n')) {\n return origin.slice(6) + '\\n' + stack;\n }\n return origin + '\\n' + stack;\n}\n\nfunction cloneError(error: RobustError, stack: string) {\n const isAggregate = isAggregateError(error);\n\n const cloned = (\n isAggregate ? new AggregateError(structuredClone(error.errors), error.message) : new Error(error.message)\n ) as RobustError;\n cloned.stack = stitchTrace(error.stack || '', stack);\n cloned.error = error.error;\n\n // copy over enumerable properties\n Object.assign(cloned, error);\n\n return cloned;\n}\n\nexport class WorkerFetch {\n declare worker: Worker | SharedWorker;\n declare threadId: string;\n declare pending: Map<\n number,\n { context: Context; signal: AbortSignal | null; abortFn: () => void; deferred: Deferred<unknown>; stack: string }\n >;\n declare channel: MessageChannel;\n\n constructor(worker: Worker | SharedWorker | null) {\n this.threadId = isServerEnv ? '' : crypto.randomUUID();\n this.pending = new Map();\n\n const isTesting = TESTING ? true : false;\n assert(`Expected a SharedWorker instance`, isTesting || isServerEnv || worker instanceof SharedWorker);\n this.worker = worker as SharedWorker;\n\n if (!isServerEnv) {\n this.channel = new MessageChannel();\n\n const port = this.worker instanceof SharedWorker ? this.worker.port : this.worker;\n port.postMessage({ type: 'connect', thread: this.threadId }, [this.channel.port2]);\n\n this.channel.port1.onmessage = (event: MainThreadEvent<unknown>) => {\n const { type, id, data } = event.data;\n const info = this.cleanupRequest(id);\n\n // typically this means the request was aborted\n if (!info) {\n return;\n }\n\n if (type === 'success-response') {\n const { deferred } = info;\n\n const { response, content } = data;\n\n if (response) {\n (response as { headers: Headers }).headers = new Headers(response.headers);\n info.context.setResponse(new Response(null, response));\n }\n\n deferred.resolve(content);\n return;\n }\n\n if (type === 'error-response') {\n const { deferred, stack } = info;\n\n deferred.reject(cloneError(data, stack));\n return;\n }\n };\n }\n }\n\n cleanupRequest(id: number) {\n const info = this.pending.get(id);\n this.pending.delete(id);\n\n if (info?.signal) {\n info.signal.removeEventListener('abort', info.abortFn);\n }\n\n return info;\n }\n\n send(event: RequestEventData | AbortEventData) {\n this.channel.port1.postMessage(event);\n }\n\n request<T>(context: Context, next: NextFn<T>): Promise<T> | Future<T> {\n if (isServerEnv) {\n return next(context.request);\n }\n\n const deferred = createDeferred<T>();\n const { signal, request } = prepareRequest(context.request);\n const abortFn = signal\n ? () => {\n deferred.reject(enhanceReason(signal.reason as string));\n this.send({ type: 'abort', thread: this.threadId, id: context.id, data: signal.reason as string });\n this.cleanupRequest(context.id);\n }\n : () => {\n return;\n };\n\n signal?.addEventListener('abort', abortFn);\n\n try {\n throw new Error();\n } catch (e: unknown) {\n this.pending.set(context.id, {\n context,\n deferred,\n signal,\n abortFn,\n stack: (e as Error).stack!,\n });\n }\n\n this.send({\n type: 'request',\n thread: this.threadId,\n id: context.id,\n data: request,\n });\n\n return deferred.promise;\n }\n}\n\nexport function enhanceReason(reason?: string) {\n return new DOMException(reason || 'The user aborted a request.', 'AbortError');\n}\n\nfunction prepareRequest(request: Context['request']): { signal: AbortSignal | null; request: RequestInfo } {\n const { signal, headers } = request;\n const requestCopy = Object.assign({}, request) as RequestInfo;\n\n delete requestCopy.store;\n\n if (signal instanceof AbortSignal) {\n delete requestCopy.signal;\n }\n\n if (headers instanceof Headers) {\n requestCopy.headers = Array.from(headers.entries()) as unknown as Headers;\n }\n\n return { signal: signal || null, request: requestCopy };\n}\n"],"names":["isServerEnv","FastBoot","isAggregateError","error","AggregateError","name","Array","isArray","errors","stitchTrace","stack","origin","startsWith","slice","cloneError","isAggregate","cloned","structuredClone","message","Error","Object","assign","WorkerFetch","constructor","worker","threadId","crypto","randomUUID","pending","Map","isTesting","macroCondition","getGlobalConfig","WarpDrive","env","TESTING","DEBUG","test","SharedWorker","channel","MessageChannel","port","postMessage","type","thread","port2","port1","onmessage","event","id","data","info","cleanupRequest","deferred","response","content","headers","Headers","context","setResponse","Response","resolve","reject","get","delete","signal","removeEventListener","abortFn","send","request","next","createDeferred","prepareRequest","enhanceReason","reason","addEventListener","e","set","promise","DOMException","requestCopy","store","AbortSignal","from","entries"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@warp-drive-mirror/experiments",
|
|
3
3
|
"description": "Experimental features for EmberData/WarpDrive",
|
|
4
|
-
"version": "0.0.1-alpha.
|
|
4
|
+
"version": "0.0.1-alpha.101",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Chris Thoburn <runspired@users.noreply.github.com>",
|
|
7
7
|
"repository": {
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@sqlite.org/sqlite-wasm": "3.46.0-build2",
|
|
44
|
-
"@ember-data-mirror/request": "5.4.0-alpha.
|
|
45
|
-
"@ember-data-mirror/request-utils": "5.4.0-alpha.
|
|
46
|
-
"@ember-data-mirror/store": "5.4.0-alpha.
|
|
47
|
-
"@warp-drive-mirror/core-types": "0.0.0-alpha.
|
|
44
|
+
"@ember-data-mirror/request": "5.4.0-alpha.101",
|
|
45
|
+
"@ember-data-mirror/request-utils": "5.4.0-alpha.101",
|
|
46
|
+
"@ember-data-mirror/store": "5.4.0-alpha.101",
|
|
47
|
+
"@warp-drive-mirror/core-types": "0.0.0-alpha.87"
|
|
48
48
|
},
|
|
49
49
|
"peerDependenciesMeta": {
|
|
50
50
|
"@sqlite.org/sqlite-wasm": {
|
|
@@ -53,20 +53,20 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@embroider/macros": "^1.16.1",
|
|
56
|
-
"@warp-drive-mirror/build-config": "0.0.0-alpha.
|
|
56
|
+
"@warp-drive-mirror/build-config": "0.0.0-alpha.38"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@babel/core": "^7.24.5",
|
|
60
60
|
"@babel/plugin-transform-typescript": "^7.24.5",
|
|
61
61
|
"@babel/preset-env": "^7.24.5",
|
|
62
62
|
"@babel/preset-typescript": "^7.24.1",
|
|
63
|
-
"@ember-data-mirror/request": "5.4.0-alpha.
|
|
64
|
-
"@ember-data-mirror/request-utils": "5.4.0-alpha.
|
|
65
|
-
"@ember-data-mirror/store": "5.4.0-alpha.
|
|
66
|
-
"@ember-data-mirror/tracking": "5.4.0-alpha.
|
|
63
|
+
"@ember-data-mirror/request": "5.4.0-alpha.101",
|
|
64
|
+
"@ember-data-mirror/request-utils": "5.4.0-alpha.101",
|
|
65
|
+
"@ember-data-mirror/store": "5.4.0-alpha.101",
|
|
66
|
+
"@ember-data-mirror/tracking": "5.4.0-alpha.101",
|
|
67
67
|
"@glimmer/component": "^1.1.2",
|
|
68
|
-
"@warp-drive-mirror/core-types": "0.0.0-alpha.
|
|
69
|
-
"@warp-drive/internal-config": "5.4.0-alpha.
|
|
68
|
+
"@warp-drive-mirror/core-types": "0.0.0-alpha.87",
|
|
69
|
+
"@warp-drive/internal-config": "5.4.0-alpha.101",
|
|
70
70
|
"ember-source": "~5.8.0",
|
|
71
71
|
"pnpm-sync-dependencies-meta-injected": "0.0.14",
|
|
72
72
|
"@sqlite.org/sqlite-wasm": "3.46.0-build2",
|