@onerjs/core 8.42.8 → 8.42.9

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.
@@ -24,25 +24,113 @@ export class WebRequest {
24
24
  static get IsCustomRequestAvailable() {
25
25
  return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;
26
26
  }
27
+ static _CleanUrl(url) {
28
+ url = url.replace("file:http:", "http:");
29
+ url = url.replace("file:https:", "https:");
30
+ return url;
31
+ }
32
+ static _ShouldSkipRequestModifications(url) {
33
+ return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes("preview.babylonjs.com") || url.includes("cdn.babylonjs.com"));
34
+ }
27
35
  /**
28
- * Returns the requested URL once open has been called
36
+ * Merges `CustomRequestHeaders` and `CustomRequestModifiers` into a plain headers record and returns the
37
+ * (possibly rewritten) URL. Can be used to apply URL and header customizations without making a network
38
+ * request (e.g. for streaming media where the download is handled by the browser natively).
39
+ * @param url - The initial URL to modify.
40
+ * @param baseHeaders - An optional set of headers to start with (e.g. from the caller's options) that modifiers can further modify.
41
+ * @returns An object containing the final URL and the merged headers after applying all modifiers and header customizations.
42
+ * @internal
29
43
  */
30
- get requestURL() {
31
- return this._requestURL;
32
- }
33
- _injectCustomRequestHeaders() {
34
- if (this._shouldSkipRequestModifications(this._requestURL)) {
35
- return;
44
+ static _CollectCustomizations(url, baseHeaders = {}) {
45
+ const headers = { ...baseHeaders };
46
+ if (WebRequest._ShouldSkipRequestModifications(url)) {
47
+ return { url, headers };
36
48
  }
37
49
  for (const key in WebRequest.CustomRequestHeaders) {
38
50
  const val = WebRequest.CustomRequestHeaders[key];
39
51
  if (val) {
40
- this._xhr.setRequestHeader(key, val);
52
+ headers[key] = val;
53
+ }
54
+ }
55
+ // Provide a minimal proxy so modifiers can call setRequestHeader as they would on a real XHR.
56
+ const xhrProxy = {
57
+ setRequestHeader: (name, value) => {
58
+ headers[name] = value;
59
+ },
60
+ };
61
+ for (const modifier of WebRequest.CustomRequestModifiers) {
62
+ if (WebRequest._ShouldSkipRequestModifications(url)) {
63
+ break;
64
+ }
65
+ const newUrl = modifier(xhrProxy, url);
66
+ if (typeof newUrl === "string") {
67
+ url = newUrl;
41
68
  }
42
69
  }
70
+ return { url, headers };
43
71
  }
44
- _shouldSkipRequestModifications(url) {
45
- return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes("preview.babylonjs.com") || url.includes("cdn.babylonjs.com"));
72
+ /**
73
+ * Performs a network request using the Fetch API when available on the platform, falling back to XMLHttpRequest.
74
+ * `WebRequest.CustomRequestHeaders` and `WebRequest.CustomRequestModifiers` are applied in both cases.
75
+ *
76
+ * For `CustomRequestModifiers`, a minimal proxy XHR is provided to each modifier so that calls to
77
+ * `setRequestHeader` on it are captured and forwarded to the underlying request. The URL returned by a
78
+ * modifier (if any) replaces the current URL before the next modifier runs.
79
+ *
80
+ * @param url - The URL to request.
81
+ * @param options - Optional request options (method, headers, body).
82
+ * @returns A Promise that resolves to a `Response`.
83
+ */
84
+ static async FetchAsync(url, options = {}) {
85
+ const method = options.method ?? "GET";
86
+ if (typeof fetch !== "undefined") {
87
+ // Use the Fetch API. Collect all customizations into a plain headers object first, since the
88
+ // Fetch API does not share the XHR instance that WebRequest.open/send work with.
89
+ const { url: resolvedUrl, headers } = WebRequest._CollectCustomizations(WebRequest._CleanUrl(url), options.headers ?? {});
90
+ return await fetch(resolvedUrl, { method, headers, body: options.body ?? undefined });
91
+ }
92
+ // Fallback: use a WebRequest instance, which handles _CleanUrl, CustomRequestModifiers and
93
+ // CustomRequestHeaders (via open()) internally — wrapping the response in a Promise<Response>.
94
+ return await new Promise((resolve, reject) => {
95
+ const request = new WebRequest();
96
+ request.responseType = "arraybuffer";
97
+ request.addEventListener("readystatechange", () => {
98
+ if (request.readyState === 4) {
99
+ if (request.status >= 200 && request.status < 300) {
100
+ const responseHeaders = typeof Headers !== "undefined" ? new Headers() : undefined;
101
+ const contentType = request.getResponseHeader("Content-Type");
102
+ if (contentType && responseHeaders) {
103
+ responseHeaders.set("Content-Type", contentType);
104
+ }
105
+ if (typeof Response !== "undefined") {
106
+ resolve(new Response(request.response, { status: request.status, statusText: request.statusText, headers: responseHeaders }));
107
+ }
108
+ else {
109
+ // Minimal Response-like object for environments lacking the Fetch API globals.
110
+ resolve({
111
+ ok: true,
112
+ status: request.status,
113
+ statusText: request.statusText,
114
+ headers: { get: (name) => request.getResponseHeader(name) },
115
+ // eslint-disable-next-line @typescript-eslint/naming-convention
116
+ arrayBuffer: async () => await Promise.resolve(request.response),
117
+ });
118
+ }
119
+ }
120
+ else {
121
+ reject(new Error(`HTTP ${request.status} loading '${request.requestURL}': ${request.statusText}`));
122
+ }
123
+ }
124
+ });
125
+ request.open(method, url, options.headers);
126
+ request.send(options.body ?? null);
127
+ });
128
+ }
129
+ /**
130
+ * Returns the requested URL once open has been called
131
+ */
132
+ get requestURL() {
133
+ return this._requestURL;
46
134
  }
47
135
  /**
48
136
  * Gets or sets a function to be called when loading progress changes
@@ -124,28 +212,23 @@ export class WebRequest {
124
212
  * @param body defines an optional request body
125
213
  */
126
214
  send(body) {
127
- if (WebRequest.CustomRequestHeaders) {
128
- this._injectCustomRequestHeaders();
129
- }
130
215
  this._xhr.send(body);
131
216
  }
132
217
  /**
133
218
  * Sets the request method, request URL
134
219
  * @param method defines the method to use (GET, POST, etc..)
135
220
  * @param url defines the url to connect with
221
+ * @param baseHeaders optional headers to include as a base before applying CustomRequestHeaders and modifiers
136
222
  */
137
- open(method, url) {
138
- for (const update of WebRequest.CustomRequestModifiers) {
139
- if (this._shouldSkipRequestModifications(url)) {
140
- return;
141
- }
142
- url = update(this._xhr, url) || url;
223
+ open(method, url, baseHeaders) {
224
+ const { url: modifiedUrl, headers } = WebRequest._CollectCustomizations(url, baseHeaders);
225
+ this._requestURL = WebRequest._CleanUrl(modifiedUrl);
226
+ this._xhr.open(method, this._requestURL, true);
227
+ // Apply the collected headers (CustomRequestHeaders + modifier-set headers) to the XHR.
228
+ // Must happen after open() and before send().
229
+ for (const key in headers) {
230
+ this._xhr.setRequestHeader(key, headers[key]);
143
231
  }
144
- // Clean url
145
- url = url.replace("file:http:", "http:");
146
- url = url.replace("file:https:", "https:");
147
- this._requestURL = url;
148
- this._xhr.open(method, url, true);
149
232
  }
150
233
  /**
151
234
  * Sets the value of a request header.
@@ -1 +1 @@
1
- {"version":3,"file":"webRequest.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/webRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => string | void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n /**\r\n * Returns the requested URL once open has been called\r\n */\r\n public get requestURL(): string {\r\n return this._requestURL;\r\n }\r\n\r\n private _injectCustomRequestHeaders(): void {\r\n if (this._shouldSkipRequestModifications(this._requestURL)) {\r\n return;\r\n }\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n this._xhr.setRequestHeader(key, val);\r\n }\r\n }\r\n }\r\n\r\n private _shouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n if (WebRequest.CustomRequestHeaders) {\r\n this._injectCustomRequestHeaders();\r\n }\r\n\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n */\r\n public open(method: string, url: string): void {\r\n for (const update of WebRequest.CustomRequestModifiers) {\r\n if (this._shouldSkipRequestModifications(url)) {\r\n return;\r\n }\r\n url = update(this._xhr, url) || url;\r\n }\r\n\r\n // Clean url\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n\r\n this._requestURL = url;\r\n\r\n this._xhr.open(method, url, true);\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable<string> {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webRequest.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/webRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => string | void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private static _CleanUrl(url: string): string {\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n return url;\r\n }\r\n\r\n private static _ShouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Merges `CustomRequestHeaders` and `CustomRequestModifiers` into a plain headers record and returns the\r\n * (possibly rewritten) URL. Can be used to apply URL and header customizations without making a network\r\n * request (e.g. for streaming media where the download is handled by the browser natively).\r\n * @param url - The initial URL to modify.\r\n * @param baseHeaders - An optional set of headers to start with (e.g. from the caller's options) that modifiers can further modify.\r\n * @returns An object containing the final URL and the merged headers after applying all modifiers and header customizations.\r\n * @internal\r\n */\r\n public static _CollectCustomizations(url: string, baseHeaders: Record<string, string> = {}): { url: string; headers: Record<string, string> } {\r\n const headers: Record<string, string> = { ...baseHeaders };\r\n\r\n if (WebRequest._ShouldSkipRequestModifications(url)) {\r\n return { url, headers };\r\n }\r\n\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n headers[key] = val;\r\n }\r\n }\r\n\r\n // Provide a minimal proxy so modifiers can call setRequestHeader as they would on a real XHR.\r\n const xhrProxy = {\r\n setRequestHeader: (name: string, value: string) => {\r\n headers[name] = value;\r\n },\r\n } as unknown as XMLHttpRequest;\r\n\r\n for (const modifier of WebRequest.CustomRequestModifiers) {\r\n if (WebRequest._ShouldSkipRequestModifications(url)) {\r\n break;\r\n }\r\n const newUrl = modifier(xhrProxy, url);\r\n if (typeof newUrl === \"string\") {\r\n url = newUrl;\r\n }\r\n }\r\n\r\n return { url, headers };\r\n }\r\n\r\n /**\r\n * Performs a network request using the Fetch API when available on the platform, falling back to XMLHttpRequest.\r\n * `WebRequest.CustomRequestHeaders` and `WebRequest.CustomRequestModifiers` are applied in both cases.\r\n *\r\n * For `CustomRequestModifiers`, a minimal proxy XHR is provided to each modifier so that calls to\r\n * `setRequestHeader` on it are captured and forwarded to the underlying request. The URL returned by a\r\n * modifier (if any) replaces the current URL before the next modifier runs.\r\n *\r\n * @param url - The URL to request.\r\n * @param options - Optional request options (method, headers, body).\r\n * @returns A Promise that resolves to a `Response`.\r\n */\r\n public static async FetchAsync(url: string, options: { method?: string; headers?: Record<string, string>; body?: BodyInit | null } = {}): Promise<Response> {\r\n const method = options.method ?? \"GET\";\r\n\r\n if (typeof fetch !== \"undefined\") {\r\n // Use the Fetch API. Collect all customizations into a plain headers object first, since the\r\n // Fetch API does not share the XHR instance that WebRequest.open/send work with.\r\n const { url: resolvedUrl, headers } = WebRequest._CollectCustomizations(WebRequest._CleanUrl(url), options.headers ?? {});\r\n return await fetch(resolvedUrl, { method, headers, body: options.body ?? undefined });\r\n }\r\n\r\n // Fallback: use a WebRequest instance, which handles _CleanUrl, CustomRequestModifiers and\r\n // CustomRequestHeaders (via open()) internally — wrapping the response in a Promise<Response>.\r\n return await new Promise<Response>((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.responseType = \"arraybuffer\";\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState === 4) {\r\n if (request.status >= 200 && request.status < 300) {\r\n const responseHeaders = typeof Headers !== \"undefined\" ? new Headers() : undefined;\r\n const contentType = request.getResponseHeader(\"Content-Type\");\r\n if (contentType && responseHeaders) {\r\n responseHeaders.set(\"Content-Type\", contentType);\r\n }\r\n if (typeof Response !== \"undefined\") {\r\n resolve(new Response(request.response as ArrayBuffer, { status: request.status, statusText: request.statusText, headers: responseHeaders }));\r\n } else {\r\n // Minimal Response-like object for environments lacking the Fetch API globals.\r\n resolve({\r\n ok: true,\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: { get: (name: string) => request.getResponseHeader(name) },\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n arrayBuffer: async () => await Promise.resolve(request.response as ArrayBuffer),\r\n } as unknown as Response);\r\n }\r\n } else {\r\n reject(new Error(`HTTP ${request.status} loading '${request.requestURL}': ${request.statusText}`));\r\n }\r\n }\r\n });\r\n request.open(method, url, options.headers);\r\n request.send((options.body as Document | XMLHttpRequestBodyInit | null | undefined) ?? null);\r\n });\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n /**\r\n * Returns the requested URL once open has been called\r\n */\r\n public get requestURL(): string {\r\n return this._requestURL;\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n * @param baseHeaders optional headers to include as a base before applying CustomRequestHeaders and modifiers\r\n */\r\n public open(method: string, url: string, baseHeaders?: Record<string, string>): void {\r\n const { url: modifiedUrl, headers } = WebRequest._CollectCustomizations(url, baseHeaders);\r\n\r\n this._requestURL = WebRequest._CleanUrl(modifiedUrl);\r\n\r\n this._xhr.open(method, this._requestURL, true);\r\n\r\n // Apply the collected headers (CustomRequestHeaders + modifier-set headers) to the XHR.\r\n // Must happen after open() and before send().\r\n for (const key in headers) {\r\n this._xhr.setRequestHeader(key, headers[key]);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable<string> {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n"]}
@@ -21,7 +21,7 @@ if (depth==1.0) {depth=0.0;}
21
21
  #endif
22
22
  let halfTesselation=f32(params.tesselation>>1);let ndc=vec4f((f32(coord.x)-halfTesselation)/halfTesselation,(f32(coord.y)-halfTesselation)/halfTesselation,depth,1.0);var worldCoords=params.invViewProjMatrix*ndc;let idx=params.startVertexIndex+(coord.y*(params.tesselation+1)+coord.x)*3;positions[idx]=worldCoords.x/worldCoords.w;positions[idx+1]=worldCoords.y/worldCoords.w;positions[idx+2]=worldCoords.z/worldCoords.w;}
23
23
  @compute @workgroup_size(32,1,1)
24
- fn updatePlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {_=shadowMap;let uindex=global_id.x;let index=f32(uindex);if (uindex>params.tesselation) {return;}
24
+ fn updatePlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {_=textureDimensions(shadowMap);let uindex=global_id.x;let index=f32(uindex);if (uindex>params.tesselation) {return;}
25
25
  let step=(params.orthoMax.xy-params.orthoMin.xy)/vec2f(f32(params.tesselation));var vr=params.invViewMatrix*vec4f(params.orthoMax.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vr=vr/vr.w;positions[uindex*3+0]=vr.x;positions[uindex*3+1]=vr.y;positions[uindex*3+2]=vr.z;var vl=params.invViewMatrix*vec4f(params.orthoMin.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vl=vl/vl.w;positions[uindex*3+0+(params.tesselation+1)*3]=vl.x;positions[uindex*3+1+(params.tesselation+1)*3]=vl.y;positions[uindex*3+2+(params.tesselation+1)*3]=vl.z;var vb=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMin.y,params.orthoMin.z,1.0);vb=vb/vb.w;positions[uindex*3+0+(params.tesselation+1)*6]=vb.x;positions[uindex*3+1+(params.tesselation+1)*6]=vb.y;positions[uindex*3+2+(params.tesselation+1)*6]=vb.z;var vt=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMax.y,params.orthoMin.z,1.0);vt=vt/vt.w;positions[uindex*3+0+(params.tesselation+1)*9]=vt.x;positions[uindex*3+1+(params.tesselation+1)*9]=vt.y;positions[uindex*3+2+(params.tesselation+1)*9]=vt.z;}
26
26
  `;
27
27
  // Sideeffect
@@ -1 +1 @@
1
- {"version":3,"file":"lightingVolume.compute.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/lightingVolume.compute.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,6BAA6B,CAAC;AAC3C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lightingVolumeComputeShader\";\nconst shader = `struct Params {invViewProjMatrix: mat4x4f,\ninvViewMatrix: mat4x4f,\nstartVertexIndex: u32,\nstep: f32,\ntesselation: u32,\northoMin: vec3f,\northoMax: vec3f,};@group(0) @binding(0) var shadowMap : texture_2d<f32>;@group(0) @binding(1) var<uniform> params : Params;@group(0) @binding(2) var<storage,read_write> positions : array<f32>;@compute @workgroup_size(8,8,1)\nfn updateFarPlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {let coord=global_id.xy;\n#ifdef KEEP_EDGES\nif (any(coord>=vec2u(params.tesselation)) || any(coord<=vec2u(0))) {\n#else\nif (any(coord>vec2u(params.tesselation))) {\n#endif\nreturn;}\nlet stepY=floor(params.step*f32(coord.y));let depthCoord=vec2u(u32(floor(f32(coord.x)*params.step)),u32(stepY));var depth=textureLoad(shadowMap,depthCoord,0).r;\n#ifdef MOVE_FAR_DEPTH_TO_NEAR\nif (depth==1.0) {depth=0.0;}\n#endif\nlet halfTesselation=f32(params.tesselation>>1);let ndc=vec4f((f32(coord.x)-halfTesselation)/halfTesselation,(f32(coord.y)-halfTesselation)/halfTesselation,depth,1.0);var worldCoords=params.invViewProjMatrix*ndc;let idx=params.startVertexIndex+(coord.y*(params.tesselation+1)+coord.x)*3;positions[idx]=worldCoords.x/worldCoords.w;positions[idx+1]=worldCoords.y/worldCoords.w;positions[idx+2]=worldCoords.z/worldCoords.w;}\n@compute @workgroup_size(32,1,1)\nfn updatePlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {_=shadowMap;let uindex=global_id.x;let index=f32(uindex);if (uindex>params.tesselation) {return;}\nlet step=(params.orthoMax.xy-params.orthoMin.xy)/vec2f(f32(params.tesselation));var vr=params.invViewMatrix*vec4f(params.orthoMax.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vr=vr/vr.w;positions[uindex*3+0]=vr.x;positions[uindex*3+1]=vr.y;positions[uindex*3+2]=vr.z;var vl=params.invViewMatrix*vec4f(params.orthoMin.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vl=vl/vl.w;positions[uindex*3+0+(params.tesselation+1)*3]=vl.x;positions[uindex*3+1+(params.tesselation+1)*3]=vl.y;positions[uindex*3+2+(params.tesselation+1)*3]=vl.z;var vb=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMin.y,params.orthoMin.z,1.0);vb=vb/vb.w;positions[uindex*3+0+(params.tesselation+1)*6]=vb.x;positions[uindex*3+1+(params.tesselation+1)*6]=vb.y;positions[uindex*3+2+(params.tesselation+1)*6]=vb.z;var vt=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMax.y,params.orthoMin.z,1.0);vt=vt/vt.w;positions[uindex*3+0+(params.tesselation+1)*9]=vt.x;positions[uindex*3+1+(params.tesselation+1)*9]=vt.y;positions[uindex*3+2+(params.tesselation+1)*9]=vt.z;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const lightingVolumeComputeShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"lightingVolume.compute.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/lightingVolume.compute.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,6BAA6B,CAAC;AAC3C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lightingVolumeComputeShader\";\nconst shader = `struct Params {invViewProjMatrix: mat4x4f,\ninvViewMatrix: mat4x4f,\nstartVertexIndex: u32,\nstep: f32,\ntesselation: u32,\northoMin: vec3f,\northoMax: vec3f,};@group(0) @binding(0) var shadowMap : texture_2d<f32>;@group(0) @binding(1) var<uniform> params : Params;@group(0) @binding(2) var<storage,read_write> positions : array<f32>;@compute @workgroup_size(8,8,1)\nfn updateFarPlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {let coord=global_id.xy;\n#ifdef KEEP_EDGES\nif (any(coord>=vec2u(params.tesselation)) || any(coord<=vec2u(0))) {\n#else\nif (any(coord>vec2u(params.tesselation))) {\n#endif\nreturn;}\nlet stepY=floor(params.step*f32(coord.y));let depthCoord=vec2u(u32(floor(f32(coord.x)*params.step)),u32(stepY));var depth=textureLoad(shadowMap,depthCoord,0).r;\n#ifdef MOVE_FAR_DEPTH_TO_NEAR\nif (depth==1.0) {depth=0.0;}\n#endif\nlet halfTesselation=f32(params.tesselation>>1);let ndc=vec4f((f32(coord.x)-halfTesselation)/halfTesselation,(f32(coord.y)-halfTesselation)/halfTesselation,depth,1.0);var worldCoords=params.invViewProjMatrix*ndc;let idx=params.startVertexIndex+(coord.y*(params.tesselation+1)+coord.x)*3;positions[idx]=worldCoords.x/worldCoords.w;positions[idx+1]=worldCoords.y/worldCoords.w;positions[idx+2]=worldCoords.z/worldCoords.w;}\n@compute @workgroup_size(32,1,1)\nfn updatePlaneVertices(@builtin(global_invocation_id) global_id : vec3u) {_=textureDimensions(shadowMap);let uindex=global_id.x;let index=f32(uindex);if (uindex>params.tesselation) {return;}\nlet step=(params.orthoMax.xy-params.orthoMin.xy)/vec2f(f32(params.tesselation));var vr=params.invViewMatrix*vec4f(params.orthoMax.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vr=vr/vr.w;positions[uindex*3+0]=vr.x;positions[uindex*3+1]=vr.y;positions[uindex*3+2]=vr.z;var vl=params.invViewMatrix*vec4f(params.orthoMin.x,params.orthoMin.y+step.y*index,params.orthoMin.z,1.0);vl=vl/vl.w;positions[uindex*3+0+(params.tesselation+1)*3]=vl.x;positions[uindex*3+1+(params.tesselation+1)*3]=vl.y;positions[uindex*3+2+(params.tesselation+1)*3]=vl.z;var vb=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMin.y,params.orthoMin.z,1.0);vb=vb/vb.w;positions[uindex*3+0+(params.tesselation+1)*6]=vb.x;positions[uindex*3+1+(params.tesselation+1)*6]=vb.y;positions[uindex*3+2+(params.tesselation+1)*6]=vb.z;var vt=params.invViewMatrix*vec4f(params.orthoMin.x+step.x*index,params.orthoMax.y,params.orthoMin.z,1.0);vt=vt/vt.w;positions[uindex*3+0+(params.tesselation+1)*9]=vt.x;positions[uindex*3+1+(params.tesselation+1)*9]=vt.y;positions[uindex*3+2+(params.tesselation+1)*9]=vt.z;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const lightingVolumeComputeShaderWGSL = { name, shader };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onerjs/core",
3
- "version": "8.42.8",
3
+ "version": "8.42.9",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",