@needle-tools/engine 5.1.0-alpha.8 → 5.1.0-beta
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/CHANGELOG.md +17 -0
- package/components.needle.json +1 -1
- package/dist/{materialx-CE2sUv2B.umd.cjs → materialx-B47Bz-xs.umd.cjs} +1 -1
- package/dist/{materialx-u1EqYrhu.min.js → materialx-B85WjP7E.min.js} +1 -1
- package/dist/{materialx-vyB2Zbt4.js → materialx-jkHmVPez.js} +1 -1
- package/dist/{needle-engine.bundle-3LOy9tj8.js → needle-engine.bundle-BWkDSRyF.js} +6248 -6001
- package/dist/{needle-engine.bundle-BuI2pjv1.min.js → needle-engine.bundle-BvgS8xMP.min.js} +171 -171
- package/dist/{needle-engine.bundle-DQy9vQdJ.umd.cjs → needle-engine.bundle-CdVr_iIe.umd.cjs} +142 -142
- package/dist/needle-engine.d.ts +359 -46
- package/dist/needle-engine.js +618 -606
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{vendor-ButPLzor.umd.cjs → vendor-1UvpPPSB.umd.cjs} +2 -2
- package/dist/{vendor-DqZC4Is7.min.js → vendor-BQ2Vuntm.min.js} +4 -4
- package/dist/{vendor-DkWSNjMV.js → vendor-BslSKZPo.js} +113 -106
- package/lib/engine/api.d.ts +1 -1
- package/lib/engine/api.js +1 -1
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_audio.d.ts +30 -1
- package/lib/engine/engine_audio.js +57 -13
- package/lib/engine/engine_audio.js.map +1 -1
- package/lib/engine/engine_init.js +2 -2
- package/lib/engine/engine_init.js.map +1 -1
- package/lib/engine/engine_license.d.ts +7 -7
- package/lib/engine/engine_license.js +72 -72
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_math.d.ts +1 -1
- package/lib/engine/engine_math.js +10 -4
- package/lib/engine/engine_math.js.map +1 -1
- package/lib/engine/engine_networking_blob.js +3 -3
- package/lib/engine/engine_networking_blob.js.map +1 -1
- package/lib/engine/engine_scenedata.js +7 -0
- package/lib/engine/engine_scenedata.js.map +1 -1
- package/lib/engine/engine_serialization_core.js +7 -2
- package/lib/engine/engine_serialization_core.js.map +1 -1
- package/lib/engine/engine_time_utils.d.ts +10 -6
- package/lib/engine/engine_time_utils.js +10 -6
- package/lib/engine/engine_time_utils.js.map +1 -1
- package/lib/engine/engine_utils_qrcode.js +2 -2
- package/lib/engine/engine_utils_qrcode.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
- package/lib/engine/webcomponents/needle menu/needle-menu.js +5 -5
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.js +2 -2
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.loading.js +2 -2
- package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
- package/lib/engine/xr/TempXRContext.js +2 -2
- package/lib/engine/xr/TempXRContext.js.map +1 -1
- package/lib/engine-components/AudioSource.d.ts +46 -2
- package/lib/engine-components/AudioSource.js +268 -60
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/Component.js +2 -1
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/DragControls.js +2 -2
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/DragControlsConstraints.d.ts +0 -15
- package/lib/engine-components/DragControlsConstraints.js +14 -8
- package/lib/engine-components/DragControlsConstraints.js.map +1 -1
- package/lib/engine-components/EventList.js +1 -1
- package/lib/engine-components/EventList.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.d.ts +2 -0
- package/lib/engine-components/SceneSwitcher.js +43 -16
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/SeeThrough.d.ts +39 -0
- package/lib/engine-components/SeeThrough.js +69 -1
- package/lib/engine-components/SeeThrough.js.map +1 -1
- package/lib/engine-components/api.d.ts +1 -0
- package/lib/engine-components/api.js +1 -0
- package/lib/engine-components/api.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +10 -0
- package/lib/engine-components/codegen/components.js +10 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
- package/lib/engine-components/timeline/PlayableDirector.js +1 -1
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/web/ScrollFollow.d.ts +33 -0
- package/lib/engine-components/web/ScrollFollow.js +164 -22
- package/lib/engine-components/web/ScrollFollow.js.map +1 -1
- package/lib/needle-app.d.ts +18 -0
- package/lib/needle-app.js +19 -0
- package/lib/needle-app.js.map +1 -0
- package/package.json +3 -2
- package/plugins/common/license.js +25 -4
- package/plugins/common/needle-engine.js +5 -2
- package/plugins/types/userconfig.d.ts +22 -0
- package/plugins/vite/dts-generator.d.ts +24 -0
- package/plugins/vite/dts-generator.js +40 -7
- package/plugins/vite/index.d.ts +2 -0
- package/plugins/vite/index.js +17 -0
- package/plugins/vite/license.js +4 -4
- package/plugins/vite/needle-app.js +78 -5
- package/plugins/vite/remote.d.ts +28 -0
- package/plugins/vite/remote.js +124 -0
- package/src/engine/api.ts +1 -1
- package/src/engine/engine_audio.ts +68 -15
- package/src/engine/engine_gameobject.ts +1 -1
- package/src/engine/engine_init.ts +2 -2
- package/src/engine/engine_license.ts +69 -69
- package/src/engine/engine_math.ts +11 -4
- package/src/engine/engine_networking_blob.ts +3 -3
- package/src/engine/engine_scenedata.ts +7 -2
- package/src/engine/engine_serialization_core.ts +7 -2
- package/src/engine/engine_time_utils.ts +10 -6
- package/src/engine/engine_utils_qrcode.ts +2 -2
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
- package/src/engine/webcomponents/needle menu/needle-menu.ts +5 -5
- package/src/engine/webcomponents/needle-engine.loading.ts +6 -6
- package/src/engine/webcomponents/needle-engine.ts +2 -2
- package/src/engine/xr/TempXRContext.ts +2 -2
- package/src/engine-components/AudioSource.ts +256 -55
- package/src/engine-components/Component.ts +2 -1
- package/src/engine-components/DragControls.ts +3 -2
- package/src/engine-components/DragControlsConstraints.ts +16 -8
- package/src/engine-components/EventList.ts +1 -1
- package/src/engine-components/SceneSwitcher.ts +37 -15
- package/src/engine-components/SeeThrough.ts +75 -1
- package/src/engine-components/api.ts +1 -0
- package/src/engine-components/codegen/components.ts +10 -0
- package/src/engine-components/export/usdz/USDZExporter.ts +4 -4
- package/src/engine-components/timeline/PlayableDirector.ts +1 -1
- package/src/engine-components/web/ScrollFollow.ts +168 -22
package/lib/engine/api.d.ts
CHANGED
|
@@ -162,7 +162,7 @@ export * from "./engine_input.js";
|
|
|
162
162
|
/** GPU instancing utilities for rendering many similar objects efficiently */
|
|
163
163
|
export { InstancingUtil } from "./engine_instancing.js";
|
|
164
164
|
/** License checking utilities */
|
|
165
|
-
export {
|
|
165
|
+
export { $fwGZrGe, _$qWUhYZU, _XtEQ } from "./engine_license.js";
|
|
166
166
|
/** Lifecycle API for registering global callbacks */
|
|
167
167
|
export * from "./engine_lifecycle_api.js";
|
|
168
168
|
/** Model loader callbacks for customizing load behavior */
|
package/lib/engine/api.js
CHANGED
|
@@ -190,7 +190,7 @@ export * from "./engine_input.js";
|
|
|
190
190
|
/** GPU instancing utilities for rendering many similar objects efficiently */
|
|
191
191
|
export { InstancingUtil } from "./engine_instancing.js";
|
|
192
192
|
/** License checking utilities */
|
|
193
|
-
export {
|
|
193
|
+
export { $fwGZrGe, _$qWUhYZU, _XtEQ } from "./engine_license.js";
|
|
194
194
|
// ============================================================================
|
|
195
195
|
// LIFECYCLE & LOADING
|
|
196
196
|
// Component lifecycle hooks and asset loading systems.
|
package/lib/engine/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/engine/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8FG;AAGH,+EAA+E;AAC/E,0BAA0B;AAC1B,sDAAsD;AACtD,+EAA+E;AAE/E,cAAc,kBAAkB,CAAC;AAGjC,+EAA+E;AAC/E,6BAA6B;AAC7B,oEAAoE;AACpE,+EAA+E;AAE/E,mEAAmE;AACnE,cAAc,0BAA0B,CAAC;AAEzC,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,iDAAiD;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,4CAA4C;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,mDAAmD;AACnD,cAAc,2BAA2B,CAAC;AAG1C,+EAA+E;AAC/E,qBAAqB;AACrB,2DAA2D;AAC3D,+EAA+E;AAE/E,mDAAmD;AACnD,cAAc,wBAAwB,CAAC;AAEvC,8DAA8D;AAC9D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGhH,+EAA+E;AAC/E,2BAA2B;AAC3B,oEAAoE;AACpE,sEAAsE;AACtE,+EAA+E;AAE/E;;;GAGG;AACH,cAAc,wBAAwB,CAAC;AAEvC,yDAAyD;AACzD,cAAc,iCAAiC,CAAC;AAEhD,gDAAgD;AAChD,cAAc,uBAAuB,CAAC;AAGtC,+EAA+E;AAC/E,sBAAsB;AACtB,4DAA4D;AAC5D,+EAA+E;AAE/E;;;;GAIG;AACH,cAAc,qBAAqB,CAAC;AAEpC,uFAAuF;AACvF,cAAc,8BAA8B,CAAC;AAE7C,qDAAqD;AACrD,cAAc,8BAA8B,CAAC;AAE7C;;;GAGG;AACH,cAAc,uBAAuB,CAAA;AAErC,yEAAyE;AACzE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3E,4DAA4D;AAC5D,cAAc,4BAA4B,CAAC;AAE3C,2DAA2D;AAC3D,cAAc,2BAA2B,CAAA;AAEzC;;;GAGG;AACH,cAAc,wBAAwB,CAAC;AAEvC;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,kDAAkD;AAClD,cAAc,kBAAkB,CAAC;AAEjC,yCAAyC;AACzC,cAAc,wBAAwB,CAAC;AAGvC,+EAA+E;AAC/E,eAAe;AACf,yEAAyE;AACzE,+EAA+E;AAE/E;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAGlC,+EAA+E;AAC/E,2BAA2B;AAC3B,yDAAyD;AACzD,+EAA+E;AAE/E,8EAA8E;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,iCAAiC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/engine/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iOS Safari exposes a non-standard `"interrupted"` state in addition to the
|
|
3
|
+
* spec'd `AudioContextState`s when the audio session is taken away (e.g. the
|
|
4
|
+
* device is locked or another app starts playing audio).
|
|
5
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/state#resuming_interrupted_play_states_in_ios_safari
|
|
6
|
+
*/
|
|
7
|
+
export type InterruptibleAudioContextState = AudioContextState | "interrupted";
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
* Pure policy deciding whether `AudioContext.resume()` should be attempted right now.
|
|
11
|
+
*
|
|
12
|
+
* The context needs resuming when it is `"suspended"` or (on iOS) `"interrupted"`.
|
|
13
|
+
* But resuming is only allowed while the document is **visible**: on iOS Safari,
|
|
14
|
+
* calling `resume()` while the page is backgrounded or the device is locked fails
|
|
15
|
+
* with `InvalidStateError: Failed to start the audio device`, because the audio
|
|
16
|
+
* hardware cannot be started in the background. In that case the resume must be
|
|
17
|
+
* deferred until the page becomes visible again.
|
|
18
|
+
*
|
|
19
|
+
* @param state The current (possibly iOS-interrupted) audio context state.
|
|
20
|
+
* @param visibility The current `document.visibilityState`.
|
|
21
|
+
* @returns `true` if `resume()` should be called now, `false` if it should be deferred.
|
|
22
|
+
*/
|
|
23
|
+
export declare function shouldResumeAudioContext(state: InterruptibleAudioContextState, visibility: DocumentVisibilityState): boolean;
|
|
1
24
|
/**
|
|
2
25
|
* @internal
|
|
3
|
-
*
|
|
26
|
+
* Keep the shared AudioContext alive across suspends/interruptions (tab switch, device lock, audio
|
|
27
|
+
* session interruption). On returning to the foreground we simply resume() the EXISTING context —
|
|
28
|
+
* the same approach three.js uses, which recovers cleanly because AudioSource plays clips through a
|
|
29
|
+
* MediaElementAudioSourceNode (an <audio> element), whose media session iOS keeps alive across a
|
|
30
|
+
* lock. We deliberately do NOT close/recreate the context: on-device testing showed that makes iOS
|
|
31
|
+
* worse (a recreated context's output stays dead) and it is unnecessary.
|
|
32
|
+
*/
|
|
4
33
|
export declare function ensureAudioContextIsResumed(): void;
|
|
5
34
|
/**
|
|
6
35
|
* Represents an audio clip that can be loaded and played independently.
|
|
@@ -1,23 +1,67 @@
|
|
|
1
1
|
import { AudioContext } from "three";
|
|
2
2
|
import { Application } from "./engine_application.js";
|
|
3
|
+
import { getParam } from "./engine_utils.js";
|
|
4
|
+
/** Verbose audio logging, opt-in via `?debugaudio` (same flag AudioSource uses). */
|
|
5
|
+
const debug = getParam("debugaudio");
|
|
3
6
|
/**
|
|
4
7
|
* @internal
|
|
5
|
-
*
|
|
8
|
+
* Pure policy deciding whether `AudioContext.resume()` should be attempted right now.
|
|
9
|
+
*
|
|
10
|
+
* The context needs resuming when it is `"suspended"` or (on iOS) `"interrupted"`.
|
|
11
|
+
* But resuming is only allowed while the document is **visible**: on iOS Safari,
|
|
12
|
+
* calling `resume()` while the page is backgrounded or the device is locked fails
|
|
13
|
+
* with `InvalidStateError: Failed to start the audio device`, because the audio
|
|
14
|
+
* hardware cannot be started in the background. In that case the resume must be
|
|
15
|
+
* deferred until the page becomes visible again.
|
|
16
|
+
*
|
|
17
|
+
* @param state The current (possibly iOS-interrupted) audio context state.
|
|
18
|
+
* @param visibility The current `document.visibilityState`.
|
|
19
|
+
* @returns `true` if `resume()` should be called now, `false` if it should be deferred.
|
|
20
|
+
*/
|
|
21
|
+
export function shouldResumeAudioContext(state, visibility) {
|
|
22
|
+
// Resuming while hidden throws InvalidStateError on iOS — defer until visible.
|
|
23
|
+
if (visibility !== "visible")
|
|
24
|
+
return false;
|
|
25
|
+
return state === "suspended" || state === "interrupted";
|
|
26
|
+
}
|
|
27
|
+
/** Resume the shared AudioContext if it is suspended/interrupted and the page is visible. */
|
|
28
|
+
function recoverAudioContext() {
|
|
29
|
+
const ctx = AudioContext.getContext();
|
|
30
|
+
const state = ctx.state;
|
|
31
|
+
const visibility = typeof document !== "undefined" ? document.visibilityState : "visible";
|
|
32
|
+
if (!shouldResumeAudioContext(state, visibility))
|
|
33
|
+
return;
|
|
34
|
+
ctx.resume()
|
|
35
|
+
.then(() => { if (debug)
|
|
36
|
+
console.log("AudioContext resumed successfully"); })
|
|
37
|
+
.catch(e => { if (debug)
|
|
38
|
+
console.warn("Failed to resume AudioContext: " + e); });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @internal
|
|
42
|
+
* Keep the shared AudioContext alive across suspends/interruptions (tab switch, device lock, audio
|
|
43
|
+
* session interruption). On returning to the foreground we simply resume() the EXISTING context —
|
|
44
|
+
* the same approach three.js uses, which recovers cleanly because AudioSource plays clips through a
|
|
45
|
+
* MediaElementAudioSourceNode (an <audio> element), whose media session iOS keeps alive across a
|
|
46
|
+
* lock. We deliberately do NOT close/recreate the context: on-device testing showed that makes iOS
|
|
47
|
+
* worse (a recreated context's output stays dead) and it is unnecessary.
|
|
48
|
+
*/
|
|
6
49
|
export function ensureAudioContextIsResumed() {
|
|
7
50
|
Application.registerWaitForInteraction(() => {
|
|
8
|
-
//
|
|
51
|
+
// https://github.com/mrdoob/three.js/issues/27779 & https://linear.app/needle/issue/NE-4257
|
|
9
52
|
const ctx = AudioContext.getContext();
|
|
10
|
-
ctx.addEventListener("statechange", () =>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
53
|
+
ctx.addEventListener("statechange", () => setTimeout(recoverAudioContext, 300));
|
|
54
|
+
// iOS frequently rejects the first resume() right after foregrounding with InvalidStateError,
|
|
55
|
+
// then accepts one a few hundred ms later with no follow-up statechange — so retry with a
|
|
56
|
+
// short backoff. Each attempt is a no-op once running.
|
|
57
|
+
if (typeof document !== "undefined") {
|
|
58
|
+
document.addEventListener("visibilitychange", () => {
|
|
59
|
+
if (document.visibilityState !== "visible")
|
|
60
|
+
return;
|
|
61
|
+
for (const delay of [0, 250, 600, 1200, 2000])
|
|
62
|
+
setTimeout(recoverAudioContext, delay);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
21
65
|
});
|
|
22
66
|
}
|
|
23
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine_audio.js","sourceRoot":"","sources":["../../src/engine/engine_audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine_audio.js","sourceRoot":"","sources":["../../src/engine/engine_audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { initBuiltinTypes } from "./codegen/register_types.js";
|
|
|
8
8
|
import { initSpatialConsole } from "./debug/debug_spatial_console.js";
|
|
9
9
|
import { initAddressableSerializers } from "./engine_addressables.js";
|
|
10
10
|
import { ensureAudioContextIsResumed } from "./engine_audio.js";
|
|
11
|
-
import { $
|
|
11
|
+
import { $lySygz } from "./engine_license.js";
|
|
12
12
|
import { initNeedleLoader } from "./engine_loaders.js";
|
|
13
13
|
import { initPhysics } from "./engine_physics_rapier.js";
|
|
14
14
|
import { initBuiltinSerializers } from "./engine_serialization_builtin_serializer.js";
|
|
@@ -57,7 +57,7 @@ export function initEngine() {
|
|
|
57
57
|
initPhysics();
|
|
58
58
|
initXR();
|
|
59
59
|
initSpatialConsole();
|
|
60
|
-
$
|
|
60
|
+
$lySygz();
|
|
61
61
|
// Must be last. customElements.define() upgrades existing <needle-engine>
|
|
62
62
|
// elements synchronously, which can trigger context.create() and dispatch
|
|
63
63
|
// ContextCreationStart if `src` is already set as an HTML attribute.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine_init.js","sourceRoot":"","sources":["../../src/engine/engine_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wDAAwD,CAAC;AACvG,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"engine_init.js","sourceRoot":"","sources":["../../src/engine/engine_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wDAAwD,CAAC;AACvG,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU;IACtB,IAAI,WAAW;QAAE,OAAO;IACxB,IAAI,GAAG;QAAE,OAAO;IAChB,WAAW,GAAG,IAAI,CAAC;IAEnB,SAAS,EAAE,CAAC;IACZ,sBAAsB,EAAE,CAAC;IACzB,0BAA0B,EAAE,CAAC;IAC7B,gCAAgC,EAAE,CAAC;IACnC,6BAA6B,EAAE,CAAC;IAChC,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,CAAC;IACd,oBAAoB,EAAE,CAAC;IACvB,sBAAsB,EAAE,CAAC;IACzB,oBAAoB,EAAE,CAAC;IACvB,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,UAAU,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC;IAC9C,eAAe,EAAE,CAAC;IAClB,qBAAqB,EAAE,CAAC;IACxB,oBAAoB,EAAE,CAAC;IACvB,2BAA2B,EAAE,CAAC;IAE9B,WAAW,EAAE,CAAC;IACd,MAAM,EAAE,CAAC;IACT,kBAAkB,EAAE,CAAC;IACrB,OAAO,EAAE,CAAC;IAEV,0EAA0E;IAC1E,0EAA0E;IAC1E,qEAAqE;IACrE,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { IContext } from "./engine_types.js";
|
|
2
2
|
/** @internal */
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function _XtEQ(): boolean;
|
|
4
4
|
/** @internal */
|
|
5
|
-
export declare function
|
|
5
|
+
export declare function _$qWUhYZU(): boolean;
|
|
6
6
|
/** @internal */
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function _BxFwJ(): boolean;
|
|
8
8
|
/** @internal */
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function $fwGZrGe(): boolean;
|
|
10
10
|
/** @internal */
|
|
11
|
-
export declare function $
|
|
11
|
+
export declare function $BWnhWzrW(cb: (result: boolean) => void): void;
|
|
12
12
|
export declare namespace Telemetry {
|
|
13
13
|
export function init(): void;
|
|
14
14
|
export function isAllowed(context: IContext | null | undefined): boolean;
|
|
@@ -27,5 +27,5 @@ export declare namespace Telemetry {
|
|
|
27
27
|
export function sendError(context: IContext, errorName: string, error: ErrorData | ErrorEvent | Error): Promise<void | Response>;
|
|
28
28
|
export {};
|
|
29
29
|
}
|
|
30
|
-
export declare function $
|
|
31
|
-
export declare let
|
|
30
|
+
export declare function $lySygz(): void;
|
|
31
|
+
export declare let ICD: Promise<void> | undefined;
|
|
@@ -6,17 +6,17 @@ import { Context } from "./engine_setup.js";
|
|
|
6
6
|
import { SSR } from "./engine_ssr.js";
|
|
7
7
|
import { getParam } from "./engine_utils.js";
|
|
8
8
|
const debug = getParam("__debuglic__");
|
|
9
|
-
const
|
|
9
|
+
const _jmbVzxw = [];
|
|
10
10
|
// DO NOT EDIT MANUALLY
|
|
11
|
-
let
|
|
11
|
+
let $rJboqN = "";
|
|
12
12
|
// eslint-disable-next-line prefer-const
|
|
13
|
-
let _$
|
|
13
|
+
let _$RRhFut = "";
|
|
14
14
|
if (debug) {
|
|
15
|
-
console.log("License Type: " +
|
|
16
|
-
if (_$
|
|
17
|
-
console.log("License JWT: " + _$
|
|
15
|
+
console.log("License Type: " + $rJboqN);
|
|
16
|
+
if (_$RRhFut) {
|
|
17
|
+
console.log("License JWT: " + _$RRhFut);
|
|
18
18
|
try {
|
|
19
|
-
const payload = JSON.parse(atob(_$
|
|
19
|
+
const payload = JSON.parse(atob(_$RRhFut.split(".")[1].replace(/-/g, '+').replace(/_/g, '/')));
|
|
20
20
|
console.log("License JWT payload:", payload);
|
|
21
21
|
}
|
|
22
22
|
catch {
|
|
@@ -28,8 +28,8 @@ if (debug) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
/** @internal */
|
|
31
|
-
export function
|
|
32
|
-
switch (
|
|
31
|
+
export function _XtEQ() {
|
|
32
|
+
switch ($rJboqN) {
|
|
33
33
|
case "pro":
|
|
34
34
|
case "enterprise":
|
|
35
35
|
return true;
|
|
@@ -38,33 +38,33 @@ export function _$QyV() {
|
|
|
38
38
|
return false;
|
|
39
39
|
}
|
|
40
40
|
/** @internal */
|
|
41
|
-
export function
|
|
42
|
-
switch (
|
|
41
|
+
export function _$qWUhYZU() {
|
|
42
|
+
switch ($rJboqN) {
|
|
43
43
|
case "indie":
|
|
44
44
|
return true;
|
|
45
45
|
}
|
|
46
46
|
return false;
|
|
47
47
|
}
|
|
48
48
|
/** @internal */
|
|
49
|
-
export function
|
|
50
|
-
switch (
|
|
49
|
+
export function _BxFwJ() {
|
|
50
|
+
switch ($rJboqN) {
|
|
51
51
|
case "edu":
|
|
52
52
|
return true;
|
|
53
53
|
}
|
|
54
54
|
return false;
|
|
55
55
|
}
|
|
56
56
|
/** @internal */
|
|
57
|
-
export function
|
|
58
|
-
return
|
|
57
|
+
export function $fwGZrGe() {
|
|
58
|
+
return _XtEQ() || _$qWUhYZU() || _BxFwJ();
|
|
59
59
|
}
|
|
60
60
|
/** @internal */
|
|
61
|
-
export function $
|
|
62
|
-
if (
|
|
61
|
+
export function $BWnhWzrW(cb) {
|
|
62
|
+
if (_XtEQ() || _$qWUhYZU() || _BxFwJ())
|
|
63
63
|
return cb(true);
|
|
64
|
-
|
|
64
|
+
_jmbVzxw.push(cb);
|
|
65
65
|
}
|
|
66
|
-
function
|
|
67
|
-
for (const cb of
|
|
66
|
+
function $bjsviJ(result) {
|
|
67
|
+
for (const cb of _jmbVzxw) {
|
|
68
68
|
try {
|
|
69
69
|
cb(result);
|
|
70
70
|
}
|
|
@@ -76,7 +76,7 @@ function __JogRhlxZ(result) {
|
|
|
76
76
|
// #region JWT
|
|
77
77
|
// ECDSA P-256 public key for verifying license JWTs (verification-only, safe to ship)
|
|
78
78
|
/* eslint-disable no-secrets/no-secrets -- public key, not a secret */
|
|
79
|
-
const
|
|
79
|
+
const _$cibPFcX = {
|
|
80
80
|
kty: "EC",
|
|
81
81
|
crv: "P-256",
|
|
82
82
|
x: "A34nyKMjhQYVgzeE4tyLUYdx34TAKogDa7v7PRaO9Lg",
|
|
@@ -98,7 +98,7 @@ function base64urlDecode(str) {
|
|
|
98
98
|
* Verify a JWT license token and return the `type` claim if valid.
|
|
99
99
|
* Returns null if the JWT is missing, malformed, or has an invalid signature.
|
|
100
100
|
*/
|
|
101
|
-
async function
|
|
101
|
+
async function $JcYsyq(jwt) {
|
|
102
102
|
if (!jwt)
|
|
103
103
|
return null;
|
|
104
104
|
try {
|
|
@@ -106,7 +106,7 @@ async function ZhJ(jwt) {
|
|
|
106
106
|
if (parts.length !== 3)
|
|
107
107
|
return null;
|
|
108
108
|
const [headerB64, payloadB64, signatureB64] = parts;
|
|
109
|
-
const key = await crypto.subtle.importKey("jwk",
|
|
109
|
+
const key = await crypto.subtle.importKey("jwk", _$cibPFcX, { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"]);
|
|
110
110
|
const signingInput = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
|
|
111
111
|
const signature = base64urlDecode(signatureB64);
|
|
112
112
|
const valid = await crypto.subtle.verify({ name: "ECDSA", hash: "SHA-256" }, key, signature.buffer, signingInput);
|
|
@@ -154,25 +154,25 @@ async function ZhJ(jwt) {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
/** Verify the injected JWT and update the license type if valid.
|
|
157
|
-
* The engine ONLY trusts the JWT — the plain
|
|
157
|
+
* The engine ONLY trusts the JWT — the plain $rJboqN string is ignored. */
|
|
158
158
|
let _jwtVerificationPromise = undefined;
|
|
159
|
-
async function $
|
|
160
|
-
// NOTE: do NOT add an `if (!_$
|
|
159
|
+
async function _$qeTBLq() {
|
|
160
|
+
// NOTE: do NOT add an `if (!_$RRhFut) return` guard here.
|
|
161
161
|
// esbuild (Vite dependency pre-bundling) would see the variable as constant ""
|
|
162
162
|
// and tree-shake the entire JWT verification code path.
|
|
163
|
-
const jwt = _$
|
|
163
|
+
const jwt = _$RRhFut;
|
|
164
164
|
// Clear after reading — this reassignment also prevents esbuild from
|
|
165
165
|
// constant-folding the variable (it now has multiple assignment sites).
|
|
166
|
-
_$
|
|
167
|
-
const verifiedType = await
|
|
166
|
+
_$RRhFut = "";
|
|
167
|
+
const verifiedType = await $JcYsyq(jwt);
|
|
168
168
|
if (verifiedType) {
|
|
169
|
-
|
|
169
|
+
$rJboqN = verifiedType;
|
|
170
170
|
if (debug)
|
|
171
171
|
console.log("License type set from verified JWT: " + verifiedType);
|
|
172
|
-
|
|
172
|
+
$bjsviJ($fwGZrGe());
|
|
173
173
|
}
|
|
174
174
|
else {
|
|
175
|
-
|
|
175
|
+
$rJboqN = "basic";
|
|
176
176
|
if (debug && jwt)
|
|
177
177
|
console.warn("JWT verification failed — license reset to basic");
|
|
178
178
|
}
|
|
@@ -243,7 +243,7 @@ export var Telemetry;
|
|
|
243
243
|
return false;
|
|
244
244
|
const attribute = domElement?.getAttribute("no-telemetry");
|
|
245
245
|
if (attribute === "" || attribute === "true" || attribute === "1") {
|
|
246
|
-
if (
|
|
246
|
+
if ($rJboqN === "pro" || $rJboqN === "enterprise") {
|
|
247
247
|
if (debug)
|
|
248
248
|
console.debug("Telemetry is disabled via no-telemetry attribute");
|
|
249
249
|
return false;
|
|
@@ -340,30 +340,30 @@ export var Telemetry;
|
|
|
340
340
|
return Promise.resolve();
|
|
341
341
|
}
|
|
342
342
|
})(Telemetry || (Telemetry = {}));
|
|
343
|
-
export function $
|
|
344
|
-
if (
|
|
345
|
-
|
|
343
|
+
export function $lySygz() {
|
|
344
|
+
if ($rJboqN === "")
|
|
345
|
+
$rJboqN = "basic";
|
|
346
346
|
// Start JWT verification — must be here (not top-level) to avoid tree-shaking
|
|
347
|
-
_jwtVerificationPromise = $
|
|
347
|
+
_jwtVerificationPromise = _$qeTBLq();
|
|
348
348
|
Telemetry.init();
|
|
349
349
|
ContextRegistry.registerCallback(ContextEvent.ContextRegistered, evt => {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
setTimeout(() =>
|
|
350
|
+
__HewJRdQ(evt.context);
|
|
351
|
+
__jSWGURd(evt.context);
|
|
352
|
+
setTimeout(() => _$wmvwSlSB(evt.context), 2000);
|
|
353
353
|
});
|
|
354
354
|
}
|
|
355
|
-
export let
|
|
355
|
+
export let ICD = undefined;
|
|
356
356
|
let applicationIsForbidden = false;
|
|
357
357
|
let applicationForbiddenText = "";
|
|
358
|
-
async function
|
|
358
|
+
async function _EiMi() {
|
|
359
359
|
// Only perform the runtime license check once
|
|
360
|
-
if (
|
|
361
|
-
return
|
|
360
|
+
if (ICD)
|
|
361
|
+
return ICD;
|
|
362
362
|
// Wait for JWT verification to complete first (if running)
|
|
363
363
|
if (_jwtVerificationPromise) {
|
|
364
364
|
await _jwtVerificationPromise;
|
|
365
365
|
}
|
|
366
|
-
if (
|
|
366
|
+
if ($rJboqN === "basic") {
|
|
367
367
|
try {
|
|
368
368
|
const licenseUrl = "https://needle.tools/api/v1/needle-engine/check?location=" + encodeURIComponent(window.location.href) + "&version=" + VERSION + "&generator=" + encodeURIComponent(GENERATOR);
|
|
369
369
|
const res = await fetch(licenseUrl, {
|
|
@@ -377,31 +377,31 @@ async function $pek() {
|
|
|
377
377
|
applicationIsForbidden = false;
|
|
378
378
|
if (debug)
|
|
379
379
|
console.log("License check succeeded");
|
|
380
|
-
|
|
381
|
-
|
|
380
|
+
$rJboqN = "pro";
|
|
381
|
+
$bjsviJ(true);
|
|
382
382
|
}
|
|
383
383
|
else if (res?.status === 403) {
|
|
384
|
-
|
|
384
|
+
$bjsviJ(false);
|
|
385
385
|
applicationIsForbidden = true;
|
|
386
386
|
applicationForbiddenText = await res.text();
|
|
387
387
|
}
|
|
388
388
|
else {
|
|
389
|
-
|
|
389
|
+
$bjsviJ(false);
|
|
390
390
|
if (debug)
|
|
391
391
|
console.log("License check failed with status " + res?.status);
|
|
392
392
|
}
|
|
393
393
|
}
|
|
394
394
|
catch (err) {
|
|
395
|
-
|
|
395
|
+
$bjsviJ(false);
|
|
396
396
|
if (debug)
|
|
397
397
|
console.error("License check failed", err);
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
else if (debug)
|
|
401
|
-
console.log("Runtime license check is skipped because license is already applied as \"" +
|
|
401
|
+
console.log("Runtime license check is skipped because license is already applied as \"" + $rJboqN + "\"");
|
|
402
402
|
}
|
|
403
|
-
|
|
404
|
-
async function
|
|
403
|
+
ICD = _EiMi();
|
|
404
|
+
async function __jSWGURd(ctx) {
|
|
405
405
|
function createForbiddenElement() {
|
|
406
406
|
const div = document.createElement("div");
|
|
407
407
|
div.className = "needle-forbidden";
|
|
@@ -469,43 +469,43 @@ async function __rlGEVK(ctx) {
|
|
|
469
469
|
}
|
|
470
470
|
}, 500);
|
|
471
471
|
}
|
|
472
|
-
async function
|
|
472
|
+
async function __HewJRdQ(ctx) {
|
|
473
473
|
try {
|
|
474
|
-
if (!
|
|
475
|
-
return
|
|
474
|
+
if (!_XtEQ() && !_$qWUhYZU()) {
|
|
475
|
+
return __ujmxoKP(ctx);
|
|
476
476
|
}
|
|
477
477
|
}
|
|
478
478
|
catch (err) {
|
|
479
479
|
if (debug)
|
|
480
480
|
console.log("License check failed", err);
|
|
481
|
-
return
|
|
481
|
+
return __ujmxoKP(ctx);
|
|
482
482
|
}
|
|
483
483
|
if (debug)
|
|
484
|
-
|
|
484
|
+
__ujmxoKP(ctx);
|
|
485
485
|
}
|
|
486
|
-
async function
|
|
486
|
+
async function __ujmxoKP(ctx) {
|
|
487
487
|
// if the engine loads faster than the license check, we need to capture the ready event here
|
|
488
488
|
let isReady = false;
|
|
489
489
|
ctx.domElement.addEventListener("ready", () => isReady = true);
|
|
490
|
-
await
|
|
491
|
-
if (
|
|
490
|
+
await ICD?.catch(() => { });
|
|
491
|
+
if (_XtEQ() || _$qWUhYZU())
|
|
492
492
|
return;
|
|
493
|
-
if (
|
|
494
|
-
|
|
493
|
+
if ($fwGZrGe() === false)
|
|
494
|
+
_rIQtT();
|
|
495
495
|
// check if the engine is already ready (meaning has finished loading)
|
|
496
496
|
if (isReady) {
|
|
497
|
-
|
|
497
|
+
ZzOMzy(ctx);
|
|
498
498
|
}
|
|
499
499
|
else {
|
|
500
500
|
ctx.domElement.addEventListener("ready", () => {
|
|
501
|
-
|
|
501
|
+
ZzOMzy(ctx);
|
|
502
502
|
});
|
|
503
503
|
}
|
|
504
504
|
}
|
|
505
505
|
// const licenseElementIdentifier = "needle-license-element";
|
|
506
506
|
// const licenseDuration = 10000;
|
|
507
507
|
// const licenseDelay = 1200;
|
|
508
|
-
function
|
|
508
|
+
function ZzOMzy(ctx) {
|
|
509
509
|
const style = `
|
|
510
510
|
position: relative;
|
|
511
511
|
display: block;
|
|
@@ -517,7 +517,7 @@ function __CRBs(ctx) {
|
|
|
517
517
|
padding: 10px;
|
|
518
518
|
padding-left: 30px;
|
|
519
519
|
`;
|
|
520
|
-
if (
|
|
520
|
+
if ($rJboqN === "edu") {
|
|
521
521
|
if (navigator.webdriver) {
|
|
522
522
|
console.log("This project is supported by Needle for Education – https://needle.tools");
|
|
523
523
|
}
|
|
@@ -571,7 +571,7 @@ function __CRBs(ctx) {
|
|
|
571
571
|
expectedBannerStyle = banner.style.cssText;
|
|
572
572
|
}
|
|
573
573
|
}, 1000);
|
|
574
|
-
if (
|
|
574
|
+
if (_BxFwJ()) {
|
|
575
575
|
const removeDelay = 20_000;
|
|
576
576
|
setTimeout(() => {
|
|
577
577
|
clearInterval(interval);
|
|
@@ -580,14 +580,14 @@ function __CRBs(ctx) {
|
|
|
580
580
|
const intervalInMinutes = 5;
|
|
581
581
|
setTimeout(() => {
|
|
582
582
|
if (ctx.domElement.parentNode)
|
|
583
|
-
|
|
583
|
+
ZzOMzy(ctx);
|
|
584
584
|
}, 1000 * 60 * intervalInMinutes);
|
|
585
585
|
}, removeDelay);
|
|
586
586
|
}
|
|
587
587
|
}
|
|
588
588
|
const base64Logo = "data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";
|
|
589
589
|
let lastLogTime = 0;
|
|
590
|
-
async function
|
|
590
|
+
async function _rIQtT(_logo) {
|
|
591
591
|
const now = Date.now();
|
|
592
592
|
if (now - lastLogTime < 2000)
|
|
593
593
|
return;
|
|
@@ -619,7 +619,7 @@ async function __PJeisZrd(_logo) {
|
|
|
619
619
|
console.log("%c " + licenseText, style);
|
|
620
620
|
}
|
|
621
621
|
}
|
|
622
|
-
async function
|
|
622
|
+
async function _$wmvwSlSB(context) {
|
|
623
623
|
// We can't send beacons from cross-origin isolated pages
|
|
624
624
|
if (window.crossOriginIsolated)
|
|
625
625
|
return;
|
|
@@ -633,7 +633,7 @@ async function __OmIq(context) {
|
|
|
633
633
|
if (analyticsUrl) {
|
|
634
634
|
// current url without query parameters
|
|
635
635
|
const currentUrl = window.location.href.split("?")[0];
|
|
636
|
-
const license =
|
|
636
|
+
const license = $rJboqN;
|
|
637
637
|
const beaconData = {
|
|
638
638
|
license,
|
|
639
639
|
url: currentUrl,
|