@needle-tools/engine 5.1.0-experimental.08fa2ef → 5.1.0-experimental.13e2eed
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/{needle-engine.bundle-6jp9Udrr.min.js → needle-engine.bundle-CaMhhAu6.min.js} +174 -174
- package/dist/{needle-engine.bundle-D5db5ZP1.umd.cjs → needle-engine.bundle-Cz1ToXrF.umd.cjs} +145 -145
- package/dist/{needle-engine.bundle-CB0g67az.js → needle-engine.bundle-DSqoJ8lF.js} +6009 -5947
- package/dist/needle-engine.d.ts +28 -28
- package/dist/needle-engine.js +160 -160
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- 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_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 +80 -78
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_networking_blob.js +3 -3
- package/lib/engine/engine_utils_qrcode.js +2 -2
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
- 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.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-components/export/usdz/USDZExporter.js +4 -4
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/package.json +1 -1
- package/plugins/common/license.js +4 -4
- package/plugins/vite/license.js +4 -4
- package/src/engine/api.ts +1 -1
- package/src/engine/engine_init.ts +2 -2
- package/src/engine/engine_license.ts +80 -76
- package/src/engine/engine_networking_blob.ts +3 -3
- 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/export/usdz/USDZExporter.ts +4 -4
|
@@ -9,19 +9,19 @@ import { getParam } from "./engine_utils.js";
|
|
|
9
9
|
|
|
10
10
|
const debug = getParam("__debuglic__");
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const __hSech: ((result: boolean) => void)[] = [];
|
|
13
|
+
|
|
14
|
+
// DO NOT EDIT MANUALLY
|
|
15
|
+
let _lFCA: string = "";
|
|
16
|
+
// eslint-disable-next-line prefer-const
|
|
17
|
+
let __FGH: string = "";
|
|
13
18
|
|
|
14
|
-
// These are modified by a bundler (e.g. vite)
|
|
15
|
-
// Do not edit manually
|
|
16
|
-
let _TqYlV: string = "basic";
|
|
17
|
-
// eslint-disable-next-line prefer-const -- value is replaced by the bundler at build time
|
|
18
|
-
let _GYfnW: string = "";
|
|
19
19
|
if (debug) {
|
|
20
|
-
console.log("License Type: " +
|
|
21
|
-
if (
|
|
22
|
-
console.log("License JWT: " +
|
|
20
|
+
console.log("License Type: " + _lFCA);
|
|
21
|
+
if (__FGH) {
|
|
22
|
+
console.log("License JWT: " + __FGH);
|
|
23
23
|
try {
|
|
24
|
-
const payload = JSON.parse(atob(
|
|
24
|
+
const payload = JSON.parse(atob(__FGH.split(".")[1].replace(/-/g, '+').replace(/_/g, '/')));
|
|
25
25
|
console.log("License JWT payload:", payload);
|
|
26
26
|
}
|
|
27
27
|
catch { console.log("License JWT payload: (failed to decode)"); }
|
|
@@ -32,8 +32,8 @@ if (debug) {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/** @internal */
|
|
35
|
-
export function
|
|
36
|
-
switch (
|
|
35
|
+
export function __ZvwOPYX() {
|
|
36
|
+
switch (_lFCA) {
|
|
37
37
|
case "pro":
|
|
38
38
|
case "enterprise":
|
|
39
39
|
return true;
|
|
@@ -42,8 +42,8 @@ export function _DTayQW() {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/** @internal */
|
|
45
|
-
export function
|
|
46
|
-
switch (
|
|
45
|
+
export function _xdl() {
|
|
46
|
+
switch (_lFCA) {
|
|
47
47
|
case "indie":
|
|
48
48
|
return true;
|
|
49
49
|
}
|
|
@@ -51,8 +51,8 @@ export function $JOB() {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/** @internal */
|
|
54
|
-
export function
|
|
55
|
-
switch (
|
|
54
|
+
export function oGz() {
|
|
55
|
+
switch (_lFCA) {
|
|
56
56
|
case "edu":
|
|
57
57
|
return true;
|
|
58
58
|
}
|
|
@@ -60,20 +60,20 @@ export function __eNCB() {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/** @internal */
|
|
63
|
-
export function
|
|
64
|
-
return
|
|
63
|
+
export function $aZfNl() {
|
|
64
|
+
return __ZvwOPYX() || _xdl() || oGz();
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
/** @internal */
|
|
69
|
-
export function
|
|
70
|
-
if (
|
|
69
|
+
export function _lari(cb: (result: boolean) => void) {
|
|
70
|
+
if (__ZvwOPYX() || _xdl() || oGz())
|
|
71
71
|
return cb(true);
|
|
72
|
-
|
|
72
|
+
__hSech.push(cb);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
function
|
|
76
|
-
for (const cb of
|
|
75
|
+
function $NOk(result: boolean) {
|
|
76
|
+
for (const cb of __hSech) {
|
|
77
77
|
try {
|
|
78
78
|
cb(result);
|
|
79
79
|
}
|
|
@@ -84,11 +84,11 @@ function wUuS(result: boolean) {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
// #region JWT
|
|
87
|
+
// #region JWT
|
|
88
88
|
|
|
89
89
|
// ECDSA P-256 public key for verifying license JWTs (verification-only, safe to ship)
|
|
90
90
|
/* eslint-disable no-secrets/no-secrets -- public key, not a secret */
|
|
91
|
-
const $
|
|
91
|
+
const _$hfXcE = {
|
|
92
92
|
kty: "EC",
|
|
93
93
|
crv: "P-256",
|
|
94
94
|
x: "A34nyKMjhQYVgzeE4tyLUYdx34TAKogDa7v7PRaO9Lg",
|
|
@@ -112,7 +112,7 @@ function base64urlDecode(str: string): Uint8Array {
|
|
|
112
112
|
* Verify a JWT license token and return the `type` claim if valid.
|
|
113
113
|
* Returns null if the JWT is missing, malformed, or has an invalid signature.
|
|
114
114
|
*/
|
|
115
|
-
async function
|
|
115
|
+
async function CRYE(jwt: string): Promise<string | null> {
|
|
116
116
|
if (!jwt) return null;
|
|
117
117
|
try {
|
|
118
118
|
const parts = jwt.split(".");
|
|
@@ -122,7 +122,7 @@ async function __YUuTdC(jwt: string): Promise<string | null> {
|
|
|
122
122
|
|
|
123
123
|
const key = await crypto.subtle.importKey(
|
|
124
124
|
"jwk",
|
|
125
|
-
$
|
|
125
|
+
_$hfXcE,
|
|
126
126
|
{ name: "ECDSA", namedCurve: "P-256" },
|
|
127
127
|
false,
|
|
128
128
|
["verify"]
|
|
@@ -182,24 +182,25 @@ async function __YUuTdC(jwt: string): Promise<string | null> {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
/** Verify the injected JWT and update the license type if valid.
|
|
185
|
-
* The engine ONLY trusts the JWT — the plain
|
|
185
|
+
* The engine ONLY trusts the JWT — the plain _lFCA string is ignored. */
|
|
186
186
|
let _jwtVerificationPromise: Promise<void> | undefined = undefined;
|
|
187
|
-
async function _$
|
|
188
|
-
if (!
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
187
|
+
async function _$UzqLATRs(): Promise<void> {
|
|
188
|
+
// NOTE: do NOT add an `if (!__FGH) return` guard here.
|
|
189
|
+
// esbuild (Vite dependency pre-bundling) would see the variable as constant ""
|
|
190
|
+
// and tree-shake the entire JWT verification code path.
|
|
191
|
+
const jwt = __FGH;
|
|
192
|
+
// Clear after reading — this reassignment also prevents esbuild from
|
|
193
|
+
// constant-folding the variable (it now has multiple assignment sites).
|
|
194
|
+
__FGH = "";
|
|
195
|
+
const verifiedType = await CRYE(jwt);
|
|
194
196
|
if (verifiedType) {
|
|
195
|
-
|
|
197
|
+
_lFCA = verifiedType;
|
|
196
198
|
if (debug) console.log("License type set from verified JWT: " + verifiedType);
|
|
197
|
-
|
|
199
|
+
$NOk($aZfNl());
|
|
198
200
|
}
|
|
199
201
|
else {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if (debug) console.warn("JWT verification failed — license reset to basic");
|
|
202
|
+
_lFCA = "basic";
|
|
203
|
+
if (debug && jwt) console.warn("JWT verification failed — license reset to basic");
|
|
203
204
|
}
|
|
204
205
|
}
|
|
205
206
|
|
|
@@ -270,7 +271,7 @@ export namespace Telemetry {
|
|
|
270
271
|
|
|
271
272
|
const attribute = domElement?.getAttribute("no-telemetry");
|
|
272
273
|
if (attribute === "" || attribute === "true" || attribute === "1") {
|
|
273
|
-
if (
|
|
274
|
+
if (_lFCA === "pro" || _lFCA === "enterprise") {
|
|
274
275
|
if (debug) console.debug("Telemetry is disabled via no-telemetry attribute");
|
|
275
276
|
return false;
|
|
276
277
|
}
|
|
@@ -377,29 +378,32 @@ export namespace Telemetry {
|
|
|
377
378
|
}
|
|
378
379
|
|
|
379
380
|
|
|
380
|
-
export function _$
|
|
381
|
+
export function _$tjbq() {
|
|
382
|
+
|
|
383
|
+
if(_lFCA === "") _lFCA = "basic";
|
|
384
|
+
|
|
381
385
|
// Start JWT verification — must be here (not top-level) to avoid tree-shaking
|
|
382
|
-
_jwtVerificationPromise = _$
|
|
386
|
+
_jwtVerificationPromise = _$UzqLATRs();
|
|
383
387
|
|
|
384
388
|
Telemetry.init();
|
|
385
389
|
ContextRegistry.registerCallback(ContextEvent.ContextRegistered, evt => {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
setTimeout(() =>
|
|
390
|
+
__dOUFH(evt.context);
|
|
391
|
+
_cZOAFlg(evt.context);
|
|
392
|
+
setTimeout(() => Hthf(evt.context), 2000);
|
|
389
393
|
});
|
|
390
394
|
}
|
|
391
395
|
|
|
392
|
-
export let
|
|
396
|
+
export let $HKjlYRPK: Promise<void> | undefined = undefined;
|
|
393
397
|
let applicationIsForbidden = false;
|
|
394
398
|
let applicationForbiddenText = "";
|
|
395
|
-
async function
|
|
399
|
+
async function _AwHwO() {
|
|
396
400
|
// Only perform the runtime license check once
|
|
397
|
-
if (
|
|
401
|
+
if ($HKjlYRPK) return $HKjlYRPK;
|
|
398
402
|
// Wait for JWT verification to complete first (if running)
|
|
399
403
|
if (_jwtVerificationPromise) {
|
|
400
404
|
await _jwtVerificationPromise;
|
|
401
405
|
}
|
|
402
|
-
if (
|
|
406
|
+
if (_lFCA === "basic") {
|
|
403
407
|
try {
|
|
404
408
|
const licenseUrl = "https://needle.tools/api/v1/needle-engine/check?location=" + encodeURIComponent(window.location.href) + "&version=" + VERSION + "&generator=" + encodeURIComponent(GENERATOR);
|
|
405
409
|
const res = await fetch(licenseUrl, {
|
|
@@ -411,29 +415,29 @@ async function _xWdntM() {
|
|
|
411
415
|
if (res?.status === 200) {
|
|
412
416
|
applicationIsForbidden = false;
|
|
413
417
|
if (debug) console.log("License check succeeded");
|
|
414
|
-
|
|
415
|
-
|
|
418
|
+
_lFCA = "pro";
|
|
419
|
+
$NOk(true);
|
|
416
420
|
}
|
|
417
421
|
else if (res?.status === 403) {
|
|
418
|
-
|
|
422
|
+
$NOk(false);
|
|
419
423
|
applicationIsForbidden = true;
|
|
420
424
|
applicationForbiddenText = await res.text();
|
|
421
425
|
}
|
|
422
426
|
else {
|
|
423
|
-
|
|
427
|
+
$NOk(false);
|
|
424
428
|
if (debug) console.log("License check failed with status " + res?.status);
|
|
425
429
|
}
|
|
426
430
|
}
|
|
427
431
|
catch (err) {
|
|
428
|
-
|
|
432
|
+
$NOk(false);
|
|
429
433
|
if (debug) console.error("License check failed", err);
|
|
430
434
|
}
|
|
431
435
|
}
|
|
432
|
-
else if (debug) console.log("Runtime license check is skipped because license is already applied as \"" +
|
|
436
|
+
else if (debug) console.log("Runtime license check is skipped because license is already applied as \"" + _lFCA + "\"");
|
|
433
437
|
}
|
|
434
|
-
|
|
438
|
+
$HKjlYRPK = _AwHwO();
|
|
435
439
|
|
|
436
|
-
async function
|
|
440
|
+
async function _cZOAFlg(ctx: IContext) {
|
|
437
441
|
function createForbiddenElement() {
|
|
438
442
|
const div = document.createElement("div");
|
|
439
443
|
div.className = "needle-forbidden";
|
|
@@ -498,40 +502,40 @@ async function _$dIKVrNJ(ctx: IContext) {
|
|
|
498
502
|
}, 500)
|
|
499
503
|
}
|
|
500
504
|
|
|
501
|
-
async function
|
|
505
|
+
async function __dOUFH(ctx: IContext) {
|
|
502
506
|
try {
|
|
503
|
-
if (!
|
|
504
|
-
return
|
|
507
|
+
if (!__ZvwOPYX() && !_xdl()) {
|
|
508
|
+
return uPq(ctx);
|
|
505
509
|
}
|
|
506
510
|
}
|
|
507
511
|
catch (err) {
|
|
508
512
|
if (debug) console.log("License check failed", err)
|
|
509
|
-
return
|
|
513
|
+
return uPq(ctx)
|
|
510
514
|
}
|
|
511
|
-
if (debug)
|
|
515
|
+
if (debug) uPq(ctx)
|
|
512
516
|
}
|
|
513
517
|
|
|
514
518
|
|
|
515
519
|
|
|
516
|
-
async function
|
|
520
|
+
async function uPq(ctx: IContext) {
|
|
517
521
|
|
|
518
522
|
// if the engine loads faster than the license check, we need to capture the ready event here
|
|
519
523
|
let isReady = false;
|
|
520
524
|
ctx.domElement.addEventListener("ready", () => isReady = true);
|
|
521
525
|
|
|
522
|
-
await
|
|
526
|
+
await $HKjlYRPK?.catch(() => { });
|
|
523
527
|
|
|
524
528
|
|
|
525
|
-
if (
|
|
526
|
-
if (
|
|
529
|
+
if (__ZvwOPYX() || _xdl()) return;
|
|
530
|
+
if ($aZfNl() === false) __rraAdZZk();
|
|
527
531
|
|
|
528
532
|
// check if the engine is already ready (meaning has finished loading)
|
|
529
533
|
if (isReady) {
|
|
530
|
-
|
|
534
|
+
bXzSf(ctx);
|
|
531
535
|
}
|
|
532
536
|
else {
|
|
533
537
|
ctx.domElement.addEventListener("ready", () => {
|
|
534
|
-
|
|
538
|
+
bXzSf(ctx);
|
|
535
539
|
});
|
|
536
540
|
}
|
|
537
541
|
}
|
|
@@ -539,7 +543,7 @@ async function LkcJKXX(ctx: IContext) {
|
|
|
539
543
|
// const licenseElementIdentifier = "needle-license-element";
|
|
540
544
|
// const licenseDuration = 10000;
|
|
541
545
|
// const licenseDelay = 1200;
|
|
542
|
-
function
|
|
546
|
+
function bXzSf(ctx: IContext) {
|
|
543
547
|
|
|
544
548
|
const style = `
|
|
545
549
|
position: relative;
|
|
@@ -552,7 +556,7 @@ function $ThBU(ctx: IContext) {
|
|
|
552
556
|
padding: 10px;
|
|
553
557
|
padding-left: 30px;
|
|
554
558
|
`;
|
|
555
|
-
if (
|
|
559
|
+
if (_lFCA === "edu") {
|
|
556
560
|
if (navigator.webdriver) {
|
|
557
561
|
console.log("This project is supported by Needle for Education – https://needle.tools");
|
|
558
562
|
}
|
|
@@ -609,7 +613,7 @@ function $ThBU(ctx: IContext) {
|
|
|
609
613
|
}
|
|
610
614
|
}, 1000);
|
|
611
615
|
|
|
612
|
-
if (
|
|
616
|
+
if (oGz()) {
|
|
613
617
|
const removeDelay = 20_000;
|
|
614
618
|
setTimeout(() => {
|
|
615
619
|
clearInterval(interval);
|
|
@@ -618,7 +622,7 @@ function $ThBU(ctx: IContext) {
|
|
|
618
622
|
const intervalInMinutes = 5;
|
|
619
623
|
setTimeout(() => {
|
|
620
624
|
if (ctx.domElement.parentNode)
|
|
621
|
-
|
|
625
|
+
bXzSf(ctx);
|
|
622
626
|
}, 1000 * 60 * intervalInMinutes)
|
|
623
627
|
}, removeDelay);
|
|
624
628
|
}
|
|
@@ -629,7 +633,7 @@ function $ThBU(ctx: IContext) {
|
|
|
629
633
|
const base64Logo = "data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";
|
|
630
634
|
|
|
631
635
|
let lastLogTime = 0;
|
|
632
|
-
async function
|
|
636
|
+
async function __rraAdZZk(_logo?: string) {
|
|
633
637
|
const now = Date.now();
|
|
634
638
|
if (now - lastLogTime < 2000) return;
|
|
635
639
|
lastLogTime = now;
|
|
@@ -662,7 +666,7 @@ async function __Dnv(_logo?: string) {
|
|
|
662
666
|
}
|
|
663
667
|
|
|
664
668
|
|
|
665
|
-
async function
|
|
669
|
+
async function Hthf(context: IContext) {
|
|
666
670
|
// We can't send beacons from cross-origin isolated pages
|
|
667
671
|
if (window.crossOriginIsolated) return;
|
|
668
672
|
|
|
@@ -677,7 +681,7 @@ async function _mRKmGB(context: IContext) {
|
|
|
677
681
|
|
|
678
682
|
// current url without query parameters
|
|
679
683
|
const currentUrl = window.location.href.split("?")[0];
|
|
680
|
-
const license =
|
|
684
|
+
const license = _lFCA;
|
|
681
685
|
|
|
682
686
|
const beaconData = {
|
|
683
687
|
license,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FileLoader } from "three";
|
|
2
2
|
|
|
3
3
|
import { showBalloonWarning } from "./debug/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { $aZfNl } from "./engine_license.js";
|
|
5
5
|
import { delay } from "./engine_utils.js";
|
|
6
6
|
import { md5AsBytes, md5Hex, sha256Base64 } from "./engine_utils_hash.js";
|
|
7
7
|
|
|
@@ -45,7 +45,7 @@ export namespace BlobStorage {
|
|
|
45
45
|
*/
|
|
46
46
|
export function canUpload(info: { filesize: number }) {
|
|
47
47
|
const sizeInMB = info.filesize / 1024 / 1024;
|
|
48
|
-
if (
|
|
48
|
+
if ($aZfNl()) {
|
|
49
49
|
return sizeInMB < maxSizeInMB;
|
|
50
50
|
}
|
|
51
51
|
return sizeInMB < maxFreeSizeInMB;
|
|
@@ -100,7 +100,7 @@ export namespace BlobStorage {
|
|
|
100
100
|
console.warn(`Your file is too large for uploading (${filesizeInMB.toFixed(1)}MB). Max allowed size is ${maxSizeInMB}MB`);
|
|
101
101
|
return null;
|
|
102
102
|
}
|
|
103
|
-
else if (
|
|
103
|
+
else if (!$aZfNl() && filesizeInMB > maxFreeSizeInMB) {
|
|
104
104
|
if (opts?.silent !== true) showBalloonWarning(`File is too large for uploading. Please get a <a href=\"https://needle.tools/pricing\" target=\"_blank\">commercial license</a> to upload files larger than 5MB`);
|
|
105
105
|
console.warn(`Your file is too large for uploading (${filesizeInMB.toFixed(1)}MB). Max size is 5MB for non-commercial users. Please get a commercial license at https://needle.tools/pricing for larger files (up to 50MB)`);
|
|
106
106
|
return null;
|
|
@@ -4,7 +4,7 @@ import { Quaternion, Vector2, Vector3, Vector4 } from "three";
|
|
|
4
4
|
|
|
5
5
|
import { needleLogoOnlySVG } from "./assets/index.js";
|
|
6
6
|
import { isDevEnvironment } from "./debug/debug.js";
|
|
7
|
-
import {
|
|
7
|
+
import { $aZfNl } from "./engine_license.js";
|
|
8
8
|
import { InternalAttributeUtils } from "./engine_utils_attributes.js";
|
|
9
9
|
import type { NeedleEngineWebComponent } from "./webcomponents/needle-engine.js";
|
|
10
10
|
|
|
@@ -135,7 +135,7 @@ async function internalRenderQRCodeOverlays(canvas: HTMLCanvasElement, args: { s
|
|
|
135
135
|
console.debug("[QR Code] No web component found")
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
const canUseCustomLogo =
|
|
138
|
+
const canUseCustomLogo = $aZfNl();
|
|
139
139
|
|
|
140
140
|
// Query logo src from needle-engine attribute.
|
|
141
141
|
// For any supported attribute it's possible to use "falsey" values (e.g. "0" or "false" to disable the logo in the QR code)
|
|
@@ -2,7 +2,7 @@ import { Mesh, Object3D, TextureLoader, Vector4 } from "three";
|
|
|
2
2
|
import ThreeMeshUI from "three-mesh-ui";
|
|
3
3
|
|
|
4
4
|
import { addNewComponent } from "../../engine_components.js";
|
|
5
|
-
import {
|
|
5
|
+
import { __ZvwOPYX } from "../../engine_license.js";
|
|
6
6
|
import { OneEuroFilterXYZ } from "../../engine_math.js";
|
|
7
7
|
import type { Context } from "../../engine_setup.js";
|
|
8
8
|
import { lookAtObject } from "../../engine_three_utils.js";
|
|
@@ -321,7 +321,7 @@ export class NeedleSpatialMenu {
|
|
|
321
321
|
}
|
|
322
322
|
if (this.menu) {
|
|
323
323
|
const index = this.menu.children.indexOf(this._poweredByNeedleElement as any);
|
|
324
|
-
if (!this._showNeedleLogo &&
|
|
324
|
+
if (!this._showNeedleLogo && __ZvwOPYX()) {
|
|
325
325
|
if (index >= 0) {
|
|
326
326
|
this._poweredByNeedleElement.removeFromParent();
|
|
327
327
|
this.markDirty();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { showBalloonMessage } from "../../debug/debug.js";
|
|
2
2
|
import type { Context } from "../../engine_context.js";
|
|
3
|
-
import {
|
|
3
|
+
import { $aZfNl, _lari, Telemetry } from "../../engine_license.js";
|
|
4
4
|
import { isLocalNetwork } from "../../engine_networking_utils.js";
|
|
5
5
|
import { HTMLElementBase } from "../../engine_ssr.js";
|
|
6
6
|
import { DeviceUtilities, getParam } from "../../engine_utils.js";
|
|
@@ -778,8 +778,8 @@ export class NeedleMenuElement extends HTMLElementBase {
|
|
|
778
778
|
try {
|
|
779
779
|
// if the user has a license then we CAN hide the needle logo
|
|
780
780
|
// calling this method immediately will cause an issue with vite bundling tho
|
|
781
|
-
window.requestAnimationFrame(() =>
|
|
782
|
-
if (res == true &&
|
|
781
|
+
window.requestAnimationFrame(() => _lari(res => {
|
|
782
|
+
if (res == true && $aZfNl() && !debugNonCommercial) {
|
|
783
783
|
let visible = this._userRequestedLogoVisible;
|
|
784
784
|
if (visible === undefined) visible = false;
|
|
785
785
|
this.___onSetLogoVisible(visible);
|
|
@@ -830,7 +830,7 @@ export class NeedleMenuElement extends HTMLElementBase {
|
|
|
830
830
|
// ensure the menu is not hidden or removed
|
|
831
831
|
const requiredParent = this?.parentNode;
|
|
832
832
|
if (this.style.display != "flex" || this.style.visibility != "visible" || this.style.opacity != "1" || requiredParent != this._domElement?.shadowRoot) {
|
|
833
|
-
if (
|
|
833
|
+
if (!$aZfNl()) {
|
|
834
834
|
const change = changeEventCounter++;
|
|
835
835
|
// if a user doesn't have a local pro license *but* for development the menu is hidden then we show a warning
|
|
836
836
|
if (isLocalNetwork() && this._userRequestedMenuVisible === false) {
|
|
@@ -918,7 +918,7 @@ export class NeedleMenuElement extends HTMLElementBase {
|
|
|
918
918
|
showNeedleLogo(visible: boolean) {
|
|
919
919
|
this._userRequestedLogoVisible = visible;
|
|
920
920
|
if (!visible) {
|
|
921
|
-
if (
|
|
921
|
+
if (!$aZfNl() || debugNonCommercial) {
|
|
922
922
|
console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production.");
|
|
923
923
|
const localNetwork = isLocalNetwork()
|
|
924
924
|
if (!localNetwork) return;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { needleLogoOnlySVG } from "../assets/index.js"
|
|
2
2
|
import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { $aZfNl, __ZvwOPYX, $HKjlYRPK } from "../engine_license.js";
|
|
4
4
|
import { Mathf } from "../engine_math.js";
|
|
5
5
|
import { LoadingProgressArgs } from "../engine_setup.js";
|
|
6
6
|
import { getParam } from "../engine_utils.js";
|
|
@@ -205,7 +205,7 @@ export class EngineLoadingView implements ILoadingViewHandler {
|
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
|
|
208
|
-
const hasLicense =
|
|
208
|
+
const hasLicense = __ZvwOPYX();
|
|
209
209
|
if (!existing) {
|
|
210
210
|
this._loadingElement.style.position = "absolute";
|
|
211
211
|
this._loadingElement.style.width = "100%";
|
|
@@ -373,7 +373,7 @@ export class EngineLoadingView implements ILoadingViewHandler {
|
|
|
373
373
|
|
|
374
374
|
// private async handleRuntimeLicense(loadingElement: HTMLElement) {
|
|
375
375
|
// // First check if we have a commercial license
|
|
376
|
-
// let commercialLicense =
|
|
376
|
+
// let commercialLicense = $aZfNl();
|
|
377
377
|
// // if it's the case then we don't need to perform a runtime check
|
|
378
378
|
// if (commercialLicense) return;
|
|
379
379
|
|
|
@@ -393,10 +393,10 @@ export class EngineLoadingView implements ILoadingViewHandler {
|
|
|
393
393
|
// loadingElement.appendChild(nonCommercialContainer);
|
|
394
394
|
|
|
395
395
|
// // Use the runtime license check
|
|
396
|
-
// if (!isDevEnvironment() &&
|
|
396
|
+
// if (!isDevEnvironment() && $HKjlYRPK) {
|
|
397
397
|
// if (debugLicense) console.log("Waiting for runtime license check");
|
|
398
|
-
// await
|
|
399
|
-
// commercialLicense =
|
|
398
|
+
// await $HKjlYRPK;
|
|
399
|
+
// commercialLicense = $aZfNl();
|
|
400
400
|
// }
|
|
401
401
|
// if (commercialLicense) return;
|
|
402
402
|
// nonCommercialContainer.style.transition = "opacity .5s ease-in-out";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
|
|
2
2
|
import { PUBLIC_KEY, VERSION } from "../engine_constants.js";
|
|
3
3
|
import { ContextEvent, ContextRegistry } from "../engine_context_registry.js";
|
|
4
|
-
import {
|
|
4
|
+
import { $aZfNl } from "../engine_license.js";
|
|
5
5
|
import { onStart } from "../engine_lifecycle_api.js";
|
|
6
6
|
import { setDracoDecoderPath, setDracoDecoderType, setKtx2TranscoderPath } from "../engine_loaders.gltf.js";
|
|
7
7
|
import { Context, ContextCreateArgs } from "../engine_setup.js";
|
|
@@ -546,7 +546,7 @@ export class NeedleEngineWebComponent extends HTMLElementBase implements INeedle
|
|
|
546
546
|
|
|
547
547
|
|
|
548
548
|
// Loading start events
|
|
549
|
-
const allowOverridingDefaultLoading =
|
|
549
|
+
const allowOverridingDefaultLoading = $aZfNl();
|
|
550
550
|
// default loading can be overriden by calling preventDefault in the onload start event
|
|
551
551
|
this.ensureLoadStartIsRegistered();
|
|
552
552
|
let useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
|
|
@@ -3,7 +3,7 @@ import { ArrayCamera, AxesHelper, Camera, Color, DirectionalLight, Fog, GridHelp
|
|
|
3
3
|
import { needleLogoOnlySVG } from "../assets/index.js";
|
|
4
4
|
import { isDevEnvironment } from "../debug/index.js";
|
|
5
5
|
import { ObjectUtils, PrimitiveType } from "../engine_create_objects.js";
|
|
6
|
-
import {
|
|
6
|
+
import { $aZfNl } from "../engine_license.js";
|
|
7
7
|
import { Mathf } from "../engine_math.js";
|
|
8
8
|
import { delay, DeviceUtilities } from "../engine_utils.js";
|
|
9
9
|
|
|
@@ -215,7 +215,7 @@ export class TemporaryXRContext {
|
|
|
215
215
|
this._scene.background = new Color(0x000000);
|
|
216
216
|
|
|
217
217
|
let logoSrc = needleLogoOnlySVG;
|
|
218
|
-
if (
|
|
218
|
+
if ($aZfNl()) {
|
|
219
219
|
const htmlComponent = document.querySelector("needle-engine");
|
|
220
220
|
if (htmlComponent) {
|
|
221
221
|
const licenseLogo = htmlComponent.getAttribute("logo-src");
|
|
@@ -3,7 +3,7 @@ import { Euler, Material, Matrix4, Mesh, Object3D, Quaternion, Vector3 } from "t
|
|
|
3
3
|
|
|
4
4
|
import { isDevEnvironment, showBalloonMessage, showBalloonWarning } from "../../../engine/debug/index.js";
|
|
5
5
|
import { findObjectOfType } from "../../../engine/engine_components.js";
|
|
6
|
-
import {
|
|
6
|
+
import { __ZvwOPYX } from "../../../engine/engine_license.js";
|
|
7
7
|
import { serializable } from "../../../engine/engine_serialization.js";
|
|
8
8
|
import { getFormattedDate, Progress } from "../../../engine/engine_time_utils.js";
|
|
9
9
|
import { DeviceUtilities, getParam } from "../../../engine/engine_utils.js";
|
|
@@ -277,7 +277,7 @@ export class USDZExporter extends Behaviour {
|
|
|
277
277
|
let name = this.exportFileName ?? this.objectToExport?.name ?? this.name;
|
|
278
278
|
name += "-" + getFormattedDate(); // seems iOS caches the file in some cases, this ensures we always have a fresh file
|
|
279
279
|
|
|
280
|
-
if (!
|
|
280
|
+
if (!__ZvwOPYX()) {
|
|
281
281
|
if (name !== "") name += "-";
|
|
282
282
|
name += "MadeWithNeedle";
|
|
283
283
|
}
|
|
@@ -682,7 +682,7 @@ export class USDZExporter extends Behaviour {
|
|
|
682
682
|
if (debug)
|
|
683
683
|
showBalloonMessage("Quicklook url: " + callToActionURL);
|
|
684
684
|
if (callToActionURL) {
|
|
685
|
-
if (!
|
|
685
|
+
if (!__ZvwOPYX()) {
|
|
686
686
|
console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing", callToActionURL)
|
|
687
687
|
}
|
|
688
688
|
else {
|
|
@@ -697,7 +697,7 @@ export class USDZExporter extends Behaviour {
|
|
|
697
697
|
private buildQuicklookOverlay(): CustomBranding {
|
|
698
698
|
const obj: CustomBranding = {};
|
|
699
699
|
if (this.customBranding) Object.assign(obj, this.customBranding);
|
|
700
|
-
if (!
|
|
700
|
+
if (!__ZvwOPYX()) {
|
|
701
701
|
console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing");
|
|
702
702
|
obj.callToAction = "Close";
|
|
703
703
|
obj.checkoutTitle = "🌵 Made with Needle";
|