@needle-tools/engine 4.4.0-beta → 4.4.0-beta.10
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 +65 -2
- package/dist/assets/generateMeshBVH.worker-b7788939.js +25 -0
- package/dist/needle-engine.bundle.js +6808 -6645
- package/dist/needle-engine.bundle.light.js +7071 -6908
- package/dist/needle-engine.bundle.light.min.js +169 -139
- package/dist/needle-engine.bundle.light.umd.cjs +173 -143
- package/dist/needle-engine.bundle.min.js +169 -139
- package/dist/needle-engine.bundle.umd.cjs +172 -142
- package/dist/needle-engine.d.ts +0 -9
- package/dist/needle-engine.js +468 -467
- package/dist/needle-engine.light.d.ts +0 -9
- package/dist/needle-engine.light.js +468 -467
- package/dist/needle-engine.light.min.js +1 -1
- package/dist/needle-engine.light.umd.cjs +1 -1
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/postprocessing.js +1673 -1527
- package/dist/postprocessing.light.js +1673 -1527
- package/dist/postprocessing.light.min.js +80 -66
- package/dist/postprocessing.light.umd.cjs +83 -69
- package/dist/postprocessing.min.js +80 -66
- package/dist/postprocessing.umd.cjs +83 -69
- package/dist/vendor.js +5109 -5123
- package/dist/vendor.light.js +5109 -5123
- package/dist/vendor.light.min.js +84 -84
- package/dist/vendor.light.umd.cjs +78 -78
- package/dist/vendor.min.js +84 -84
- package/dist/vendor.umd.cjs +78 -78
- package/lib/engine/codegen/register_types.js +2 -0
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_components.js +3 -1
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_context.d.ts +10 -1
- package/lib/engine/engine_context.js +33 -12
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_element.js +12 -10
- package/lib/engine/engine_element.js.map +1 -1
- package/lib/engine/engine_gameobject.js +5 -0
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_license.d.ts +2 -0
- package/lib/engine/engine_license.js +103 -62
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_networking_blob.js +40 -24
- package/lib/engine/engine_networking_blob.js.map +1 -1
- package/lib/engine/engine_physics_rapier.js +10 -9
- package/lib/engine/engine_physics_rapier.js.map +1 -1
- package/lib/engine/engine_serialization_core.js +6 -2
- package/lib/engine/engine_serialization_core.js.map +1 -1
- package/lib/engine/engine_utils_screenshot.js +1 -1
- package/lib/engine/engine_utils_screenshot.js.map +1 -1
- package/lib/engine/js-extensions/RGBAColor.d.ts +1 -0
- package/lib/engine/js-extensions/RGBAColor.js +48 -0
- package/lib/engine/js-extensions/RGBAColor.js.map +1 -1
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +4 -3
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +6 -6
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +4 -0
- package/lib/engine/webcomponents/needle menu/needle-menu.js +13 -2
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/xr/NeedleXRController.js +2 -3
- package/lib/engine/xr/NeedleXRController.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.js +12 -12
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine-components/AudioSource.js +7 -0
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/Camera.js +18 -12
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CameraUtils.js +8 -14
- package/lib/engine-components/CameraUtils.js.map +1 -1
- package/lib/engine-components/GroundProjection.js +1 -1
- package/lib/engine-components/GroundProjection.js.map +1 -1
- package/lib/engine-components/NeedleMenu.js +1 -1
- package/lib/engine-components/NeedleMenu.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +3 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/ReflectionProbe.d.ts +1 -0
- package/lib/engine-components/ReflectionProbe.js +16 -9
- package/lib/engine-components/ReflectionProbe.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.js +28 -7
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/SyncedTransform.d.ts +6 -0
- package/lib/engine-components/SyncedTransform.js +10 -5
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -0
- package/lib/engine-components/codegen/components.js +1 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +2 -1
- package/lib/engine-components/export/usdz/extensions/USDZUI.js.map +1 -1
- package/lib/engine-components/ui/BaseUIComponent.d.ts +0 -1
- package/lib/engine-components/ui/BaseUIComponent.js +1 -1
- package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
- package/lib/engine-components/ui/EventSystem.js +1 -1
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/Graphic.js +1 -0
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/RaycastUtils.js +1 -1
- package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
- package/lib/engine-components/ui/RectTransform.d.ts +2 -2
- package/lib/engine-components/ui/RectTransform.js +9 -6
- package/lib/engine-components/ui/RectTransform.js.map +1 -1
- package/lib/engine-components/ui/Symbols.d.ts +1 -0
- package/lib/engine-components/ui/Symbols.js +2 -0
- package/lib/engine-components/ui/Symbols.js.map +1 -0
- package/lib/engine-components/ui/Utils.js +1 -1
- package/lib/engine-components/ui/Utils.js.map +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +1 -1
- package/lib/engine-components/utils/EnvironmentScene.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.js.map +1 -1
- package/package.json +3 -3
- package/plugins/common/buildinfo.js +1 -0
- package/plugins/common/cloud.js +2 -0
- package/plugins/common/license.js +174 -33
- package/plugins/types/userconfig.d.ts +5 -0
- package/plugins/vite/build-pipeline.js +4 -3
- package/plugins/vite/dependencies.js +17 -7
- package/plugins/vite/facebook-instant-games.js +7 -4
- package/plugins/vite/index.js +1 -1
- package/src/engine/codegen/register_types.ts +2 -0
- package/src/engine/engine_addressables.ts +3 -2
- package/src/engine/engine_components.ts +2 -1
- package/src/engine/engine_context.ts +36 -12
- package/src/engine/engine_element.ts +10 -9
- package/src/engine/engine_gameobject.ts +7 -0
- package/src/engine/engine_license.ts +116 -67
- package/src/engine/engine_networking_blob.ts +47 -26
- package/src/engine/engine_physics_rapier.ts +10 -12
- package/src/engine/engine_serialization_core.ts +6 -1
- package/src/engine/engine_utils_screenshot.ts +1 -1
- package/src/engine/js-extensions/RGBAColor.ts +50 -0
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +6 -6
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +6 -6
- package/src/engine/webcomponents/needle menu/needle-menu.ts +13 -2
- package/src/engine/xr/NeedleXRController.ts +2 -3
- package/src/engine/xr/NeedleXRSession.ts +12 -12
- package/src/engine-components/AudioSource.ts +8 -3
- package/src/engine-components/Camera.ts +34 -22
- package/src/engine-components/CameraUtils.ts +8 -16
- package/src/engine-components/GroundProjection.ts +1 -1
- package/src/engine-components/NeedleMenu.ts +1 -1
- package/src/engine-components/OrbitControls.ts +2 -1
- package/src/engine-components/ReflectionProbe.ts +15 -8
- package/src/engine-components/SceneSwitcher.ts +28 -11
- package/src/engine-components/SyncedTransform.ts +11 -6
- package/src/engine-components/codegen/components.ts +1 -0
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +2 -2
- package/src/engine-components/ui/BaseUIComponent.ts +1 -1
- package/src/engine-components/ui/EventSystem.ts +1 -1
- package/src/engine-components/ui/Graphic.ts +1 -1
- package/src/engine-components/ui/RaycastUtils.ts +1 -1
- package/src/engine-components/ui/RectTransform.ts +10 -7
- package/src/engine-components/ui/Symbols.ts +2 -0
- package/src/engine-components/ui/Utils.ts +2 -1
- package/src/engine-components/utils/EnvironmentScene.ts +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MeshBasicMaterial, Scene } from 'three';
|
|
2
|
-
export
|
|
2
|
+
export declare class EnvironmentScene extends Scene {
|
|
3
3
|
constructor(name: 'legacy' | 'neutral');
|
|
4
4
|
createAreaLightMaterial(intensity: number): MeshBasicMaterial;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvironmentScene.js","sourceRoot":"","sources":["../../../src/engine-components/utils/EnvironmentScene.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"EnvironmentScene.js","sourceRoot":"","sources":["../../../src/engine-components/utils/EnvironmentScene.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "4.4.0-beta",
|
|
4
|
-
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in",
|
|
3
|
+
"version": "4.4.0-beta.10",
|
|
4
|
+
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.",
|
|
5
5
|
"main": "dist/needle-engine.min.js",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
],
|
|
87
87
|
"dependencies": {
|
|
88
88
|
"@dimforge/rapier3d-compat": "^0.14.0",
|
|
89
|
-
"@needle-tools/gltf-progressive": "^2.1.
|
|
89
|
+
"@needle-tools/gltf-progressive": "^2.1.4",
|
|
90
90
|
"@webxr-input-profiles/motion-controllers": "^1.0.0",
|
|
91
91
|
"flatbuffers": "2.0.4",
|
|
92
92
|
"md5": "^2.3.0",
|
|
@@ -27,6 +27,7 @@ export function createBuildInfoFile(buildDirectory) {
|
|
|
27
27
|
console.warn(`WARN: Could not write build info file to \"${buildInfoPath}\"`);
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
+
console.log(`[needle-buildinfo] - Build info file successfully written to \"${buildInfoPath}\"`);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
/** Recursively collect all files in a directory
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
+
import { NEEDLE_CLOUD_CLI_NAME } from "./cloud.js";
|
|
3
|
+
import { existsSync } from "fs";
|
|
2
4
|
|
|
3
5
|
const port = 8424;
|
|
4
|
-
const packageName = "needle-cloud@version-1";
|
|
5
6
|
const licenseServerUrl = `http://localhost:${port}/api/license`;
|
|
6
7
|
const projectIdentifierUrl = `http://localhost:${port}/api/public_key`;
|
|
8
|
+
const needleCloudApiEndpoint = "https://cloud.needle.tools/api";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Replace license string - used for webpack
|
|
@@ -11,7 +13,7 @@ const projectIdentifierUrl = `http://localhost:${port}/api/public_key`;
|
|
|
11
13
|
* @param {{team:string|undefined}} opts
|
|
12
14
|
*/
|
|
13
15
|
export async function replaceLicense(code, opts) {
|
|
14
|
-
const index = code
|
|
16
|
+
const index = code?.indexOf("NEEDLE_ENGINE_LICENSE_TYPE");
|
|
15
17
|
if (index >= 0) {
|
|
16
18
|
const licenseType = await resolveLicense(opts);
|
|
17
19
|
if (!licenseType) {
|
|
@@ -28,22 +30,72 @@ export async function replaceLicense(code, opts) {
|
|
|
28
30
|
return code;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
|
|
32
33
|
/**
|
|
33
34
|
* Resolve the license using the needle engine licensing server
|
|
34
35
|
* @param {{accessToken?:string, team?:string} | null} args
|
|
35
36
|
* @returns {Promise<string | null>}
|
|
36
37
|
*/
|
|
37
38
|
export async function resolveLicense(args = null) {
|
|
38
|
-
// Wait for the server to start
|
|
39
|
-
await waitForLicenseServer();
|
|
40
|
-
|
|
41
39
|
let accessToken = args?.accessToken;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
|
|
41
|
+
if (!accessToken && process.env.CI) {
|
|
42
|
+
if (process.env.NEEDLE_CLOUD_TOKEN) {
|
|
43
|
+
console.log("[needle-license] INFO: Using Needle Cloud access token from environment variable");
|
|
44
|
+
accessToken = process.env.NEEDLE_CLOUD_TOKEN;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.warn("[needle-license] WARN: Missing NEEDLE_CLOUD_TOKEN for CI environment run");
|
|
48
|
+
}
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
if (accessToken) {
|
|
52
|
+
const timeout = AbortSignal.timeout(10_000);
|
|
53
|
+
const url = new URL(`${needleCloudApiEndpoint}/v1/account/get/licenses`);
|
|
54
|
+
const res = await fetch(url, {
|
|
55
|
+
method: "GET",
|
|
56
|
+
signal: timeout,
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: `Bearer ${accessToken}`,
|
|
59
|
+
"x-needle": "cli"
|
|
60
|
+
}
|
|
61
|
+
}).catch(err => {
|
|
62
|
+
return { ok: false, error: err.message };
|
|
63
|
+
});
|
|
64
|
+
if ("error" in res) {
|
|
65
|
+
console.error(`[needle-license] Could not fetch license from Needle Cloud API (${res.error})`);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (res.ok) {
|
|
69
|
+
const text = await res.text();
|
|
70
|
+
return tryParseLicense(text);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.error(`[needle-license] Could not fetch license from Needle Cloud API (${res.status})`);
|
|
74
|
+
if (process.env.CI) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (process.env.CI) {
|
|
80
|
+
const isGithubCI = process.env.GITHUB_ACTIONS;
|
|
81
|
+
let message = "[needle-license] WARN: Missing NEEDLE_CLOUD_TOKEN for CI environment run.";
|
|
82
|
+
if (isGithubCI) {
|
|
83
|
+
const repositoryUrl = process.env.GITHUB_REPOSITORY;
|
|
84
|
+
const url = `${repositoryUrl}/settings/secrets/actions`;
|
|
85
|
+
message += `\nPlease add the token to your GitHub repository secrets: ${url}`;
|
|
86
|
+
}
|
|
87
|
+
console.warn(message);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
else if (isStackblitz()) {
|
|
91
|
+
console.error("[needle-license] License server is not available in Stackblitz. Please use an access token for authorization.");
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Fallback to use CLI
|
|
96
|
+
// Wait for the server to start
|
|
97
|
+
await waitForLicenseServer();
|
|
98
|
+
|
|
47
99
|
const url = new URL(licenseServerUrl);
|
|
48
100
|
if (args?.team)
|
|
49
101
|
url.searchParams.append("org", args.team);
|
|
@@ -51,20 +103,22 @@ export async function resolveLicense(args = null) {
|
|
|
51
103
|
url.searchParams.append("token", accessToken);
|
|
52
104
|
}
|
|
53
105
|
|
|
54
|
-
console.log(`INFO: Fetching license...`);
|
|
106
|
+
console.log(`[needle-license] INFO: Fetching license...`);
|
|
107
|
+
const timeout = AbortSignal.timeout(10_000);
|
|
55
108
|
const licenseResponse = await fetch(url.toString(), {
|
|
56
109
|
method: "GET",
|
|
110
|
+
signal: timeout
|
|
57
111
|
}).catch(err => {
|
|
58
|
-
if (err.cause
|
|
59
|
-
return { error: "ERR: Failed to connect to license server (ECONNREFUSED)" };
|
|
112
|
+
if (err.cause?.code === "ECONNREFUSED") {
|
|
113
|
+
return { error: "[needle-license] ERR: Failed to connect to license server (ECONNREFUSED)" };
|
|
60
114
|
}
|
|
61
115
|
else {
|
|
62
|
-
return { error: "ERR: Failed to fetch license." };
|
|
116
|
+
return { error: "[needle-license] ERR: Failed to fetch license." };
|
|
63
117
|
}
|
|
64
118
|
});
|
|
65
119
|
|
|
66
120
|
if (!licenseResponse) {
|
|
67
|
-
console.warn("WARN: Failed to fetch license");
|
|
121
|
+
console.warn("[needle-license] WARN: Failed to fetch license");
|
|
68
122
|
return null;
|
|
69
123
|
}
|
|
70
124
|
else if ("error" in licenseResponse) {
|
|
@@ -72,59 +126,128 @@ export async function resolveLicense(args = null) {
|
|
|
72
126
|
return null;
|
|
73
127
|
}
|
|
74
128
|
else if (!licenseResponse.ok) {
|
|
75
|
-
|
|
129
|
+
if (licenseResponse.status === 500)
|
|
130
|
+
console.error(`[needle-license] ERROR: Failed to fetch license (${licenseResponse.status})`);
|
|
131
|
+
else
|
|
132
|
+
console.log(`[needle-license] No license found (${licenseResponse.status})`);
|
|
76
133
|
return null;
|
|
77
134
|
}
|
|
78
135
|
|
|
79
136
|
const text = await licenseResponse.text();
|
|
137
|
+
return tryParseLicense(text);
|
|
138
|
+
}
|
|
139
|
+
|
|
80
140
|
|
|
141
|
+
/**
|
|
142
|
+
* @param {string} str License string
|
|
143
|
+
*/
|
|
144
|
+
function tryParseLicense(str) {
|
|
81
145
|
try {
|
|
82
146
|
/** @type {{needle_engine_license:string}} */
|
|
83
|
-
const licenseJson = JSON.parse(
|
|
84
|
-
console.log("\n");
|
|
147
|
+
const licenseJson = JSON.parse(str);
|
|
85
148
|
if (licenseJson.needle_engine_license) {
|
|
86
|
-
console.log(`INFO: Successfully received \"${licenseJson.needle_engine_license?.toUpperCase()}\" license`)
|
|
149
|
+
console.log(`[needle-license] INFO: Successfully received \"${licenseJson.needle_engine_license?.toUpperCase()}\" license`)
|
|
87
150
|
return licenseJson.needle_engine_license;
|
|
88
151
|
}
|
|
89
152
|
if ("error" in licenseJson) {
|
|
90
|
-
console.error(`ERROR in license check: \"${licenseJson.error}\"`);
|
|
153
|
+
console.error(`[needle-license] ERROR in license check: \"${licenseJson.error}\"`);
|
|
91
154
|
}
|
|
92
155
|
else if (licenseJson.needle_engine_license == null) {
|
|
93
156
|
return null;
|
|
94
157
|
}
|
|
95
158
|
else {
|
|
96
|
-
console.warn("WARN: Received invalid license.", licenseJson);
|
|
159
|
+
console.warn("[needle-license] WARN: Received invalid license.", licenseJson);
|
|
97
160
|
}
|
|
98
161
|
return null;
|
|
99
162
|
}
|
|
100
163
|
catch (err) {
|
|
101
|
-
console.error("ERROR: Failed to parse license response");
|
|
164
|
+
console.error("[needle-license] ERROR: Failed to parse license response");
|
|
102
165
|
return null;
|
|
103
166
|
}
|
|
104
167
|
}
|
|
105
168
|
|
|
106
169
|
|
|
107
|
-
|
|
108
170
|
/**
|
|
109
171
|
* @param {string | undefined} project_id
|
|
110
172
|
*/
|
|
111
173
|
export async function getPublicIdentifier(project_id) {
|
|
174
|
+
|
|
175
|
+
let accessToken = undefined;
|
|
176
|
+
if (process.env.CI) {
|
|
177
|
+
if (process.env.NEEDLE_CLOUD_TOKEN) {
|
|
178
|
+
console.log("[needle-identifier] INFO: Using Needle Cloud access token from environment variable");
|
|
179
|
+
accessToken = process.env.NEEDLE_CLOUD_TOKEN;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const url = new URL(`${needleCloudApiEndpoint}/v1/account/public_key`);
|
|
183
|
+
const body = {
|
|
184
|
+
project_id: project_id || process.env.GITHUB_REPOSITORY || undefined,
|
|
185
|
+
machine_id: process.env.GITHUB_REPOSITORY_ID || "unknown",
|
|
186
|
+
}
|
|
187
|
+
const timeout = AbortSignal.timeout(10_000);
|
|
188
|
+
const res = await fetch(url, {
|
|
189
|
+
method: "POST",
|
|
190
|
+
signal: timeout,
|
|
191
|
+
headers: {
|
|
192
|
+
Authorization: `Bearer ${accessToken}`,
|
|
193
|
+
"Content-Type": "application/json",
|
|
194
|
+
"x-needle": "cli"
|
|
195
|
+
},
|
|
196
|
+
body: JSON.stringify(body),
|
|
197
|
+
}).catch(err => {
|
|
198
|
+
return { ok: false, error: err.message };
|
|
199
|
+
});
|
|
200
|
+
if ("error" in res) {
|
|
201
|
+
console.error(`[needle-identifier] Could not fetch project identifier from Needle Cloud API (${res.error})`);
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
if (res.ok) {
|
|
205
|
+
const text = await res.text();
|
|
206
|
+
try {
|
|
207
|
+
/** @type {{public_key:string}} */
|
|
208
|
+
const json = JSON.parse(text);
|
|
209
|
+
console.log(`[needle-identifier] INFO: Successfully received public project identifier`);
|
|
210
|
+
return json.public_key;
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.error("[needle-identifier] ERROR: Failed to parse project identifier response");
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const message = await res.text();
|
|
219
|
+
console.error(`[needle-identifier] Could not fetch project identifier from Needle Cloud API (${res.status}, ${res.statusText}, ${message})`);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else if (isStackblitz()) {
|
|
224
|
+
console.error("[needle-license] License server is not available in Stackblitz. Please use an access token for authorization.");
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
112
230
|
// Wait for the server to start
|
|
113
231
|
await waitForLicenseServer();
|
|
114
232
|
|
|
233
|
+
console.log(`[needle-identifier] INFO: Fetching project identifier...`);
|
|
234
|
+
const url = new URL(projectIdentifierUrl);
|
|
235
|
+
if (project_id) url.searchParams.append("project_id", project_id);
|
|
236
|
+
const timeout = AbortSignal.timeout(10_000);
|
|
115
237
|
const res = await fetch(projectIdentifierUrl, {
|
|
116
238
|
method: "GET",
|
|
239
|
+
signal: timeout
|
|
117
240
|
}).catch(err => {
|
|
118
|
-
if (err.cause
|
|
119
|
-
return { error: "Could not connect to the license server: The connection was actively refused" };
|
|
241
|
+
if (err.cause?.code === "ECONNREFUSED") {
|
|
242
|
+
return { error: "[needle-identifier] Could not connect to the license server: The connection was actively refused" };
|
|
120
243
|
}
|
|
121
244
|
else {
|
|
122
|
-
return { error: "ERR: Failed to fetch project identifier." };
|
|
245
|
+
return { error: "[needle-identifier] ERR: Failed to fetch project identifier." };
|
|
123
246
|
}
|
|
124
247
|
})
|
|
125
248
|
|
|
126
249
|
if (!res) {
|
|
127
|
-
console.warn("WARN: Failed to fetch project identifier");
|
|
250
|
+
console.warn("[needle-identifier] WARN: Failed to fetch project identifier");
|
|
128
251
|
return null;
|
|
129
252
|
}
|
|
130
253
|
else if ("error" in res) {
|
|
@@ -132,7 +255,7 @@ export async function getPublicIdentifier(project_id) {
|
|
|
132
255
|
return null;
|
|
133
256
|
}
|
|
134
257
|
else if (!res.ok) {
|
|
135
|
-
console.error("ERROR: Failed to fetch project identifier");
|
|
258
|
+
console.error("[needle-identifier] ERROR: Failed to fetch project identifier");
|
|
136
259
|
return null;
|
|
137
260
|
}
|
|
138
261
|
const text = await res.text();
|
|
@@ -154,24 +277,38 @@ export async function getPublicIdentifier(project_id) {
|
|
|
154
277
|
// we need to to wait for the root URL to return a response
|
|
155
278
|
async function waitForLicenseServer() {
|
|
156
279
|
// Make sure the licensing server is running
|
|
157
|
-
runCommand("npx", ["--yes",
|
|
280
|
+
const startcmd = runCommand("npx", ["--yes", NEEDLE_CLOUD_CLI_NAME, "start-server"]);
|
|
281
|
+
let isRunning = true;
|
|
282
|
+
startcmd.then(() => isRunning = false);
|
|
158
283
|
|
|
159
284
|
let attempts = 0;
|
|
160
285
|
const maxAttempts = 10;
|
|
161
286
|
do {
|
|
287
|
+
const timeout = AbortSignal.timeout(1_000);
|
|
162
288
|
const response = await fetch(licenseServerUrl, {
|
|
163
289
|
method: "GET",
|
|
290
|
+
signal: timeout
|
|
164
291
|
}).catch(err => {
|
|
165
|
-
if (err.cause
|
|
166
|
-
|
|
167
|
-
|
|
292
|
+
if (err.cause?.code === "ECONNREFUSED") {
|
|
293
|
+
if (!isRunning) {
|
|
294
|
+
console.error("[needle-license] ERR: Failed to connect to license server (ECONNREFUSED)");
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Waiting for server to start
|
|
298
|
+
// EConnectRefuse happen if starting the license server for the first time
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
if (attempts === maxAttempts) {
|
|
303
|
+
console.error("[needle-license] ERR: Failed to start license server...", err.message);
|
|
304
|
+
}
|
|
168
305
|
}
|
|
169
306
|
});
|
|
170
307
|
if (response) {
|
|
171
308
|
return true;
|
|
172
309
|
}
|
|
173
310
|
if (attempts === 0) {
|
|
174
|
-
console.log("INFO: Waiting for license server to start...");
|
|
311
|
+
console.log("[needle-license] INFO: Waiting for license server to start...");
|
|
175
312
|
}
|
|
176
313
|
attempts++;
|
|
177
314
|
if (attempts <= maxAttempts) {
|
|
@@ -183,6 +320,10 @@ async function waitForLicenseServer() {
|
|
|
183
320
|
}
|
|
184
321
|
|
|
185
322
|
|
|
323
|
+
function isStackblitz() {
|
|
324
|
+
return existsSync("/home/.stackblitz")
|
|
325
|
+
}
|
|
326
|
+
|
|
186
327
|
/**
|
|
187
328
|
* @param {string} processName
|
|
188
329
|
* @param {string[]} args
|
|
@@ -194,7 +335,7 @@ async function runCommand(processName, args) {
|
|
|
194
335
|
if (code === 0) {
|
|
195
336
|
resolve(true);
|
|
196
337
|
} else {
|
|
197
|
-
console.warn(`WARN: \"${processName}\" process exited with code ${code}\nProcess Arguments: ${args.join(" ")}`);
|
|
338
|
+
console.warn(`[needle-license] WARN: \"${processName}\" process exited with code ${code}\nProcess Arguments: ${args.join(" ")}`);
|
|
198
339
|
resolve(false);
|
|
199
340
|
}
|
|
200
341
|
});
|
|
@@ -46,6 +46,8 @@ export type userSettings = {
|
|
|
46
46
|
|
|
47
47
|
noCodegenTransform?: boolean;
|
|
48
48
|
noFacebookInstantGames?: boolean;
|
|
49
|
+
/** Custom configuration for facebook instant games. */
|
|
50
|
+
facebookInstantGames: {}
|
|
49
51
|
/** Set to true to create an imports.log file that shows all module imports. The file is generated when stopping the server. */
|
|
50
52
|
logModuleImportChains?: boolean;
|
|
51
53
|
|
|
@@ -71,6 +73,9 @@ export type userSettings = {
|
|
|
71
73
|
* @example "2.2.0-alpha"
|
|
72
74
|
*/
|
|
73
75
|
version?: string;
|
|
76
|
+
|
|
77
|
+
/** If defined the access token will be used to run compression on Needle Cloud */
|
|
78
|
+
accessToken?: string | undefined;
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
/** required for @serializable https://github.com/vitejs/vite/issues/13736 */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChildProcess, exec } from 'child_process';
|
|
2
|
+
import { NEEDLE_CLOUD_CLI_NAME } from '../common/cloud.js';
|
|
2
3
|
import { getOutputDirectory, loadConfig } from './config.js';
|
|
3
4
|
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';
|
|
4
5
|
import { copyFilesSync } from '../common/files.js';
|
|
@@ -168,7 +169,7 @@ export const needleBuildPipeline = async (command, config, userSettings) => {
|
|
|
168
169
|
return buildPipelineTask = buildPipelineTask?.then(() => {
|
|
169
170
|
// Copy the results to their final output directory.
|
|
170
171
|
if (buildPipelineTaskResults != null) {
|
|
171
|
-
log(
|
|
172
|
+
log(`Copying files from temporary output directory to final output directory at \"${buildPipelineTaskResults.outputDirectory}\"`);
|
|
172
173
|
const ctx = { count: 0 }
|
|
173
174
|
copyFilesSync(buildPipelineTaskResults.tempDirectory, buildPipelineTaskResults.outputDirectory, true, ctx);
|
|
174
175
|
log(`Copied ${ctx.count} file(s)`);
|
|
@@ -255,7 +256,7 @@ async function invokeBuildPipeline(opts) {
|
|
|
255
256
|
/** @type {null | ChildProcess} */
|
|
256
257
|
let proc = null;
|
|
257
258
|
|
|
258
|
-
let cloudAccessToken = opts.license?.accessToken;
|
|
259
|
+
let cloudAccessToken = opts.buildPipeline?.accessToken || opts.license?.accessToken;
|
|
259
260
|
if (!cloudAccessToken) {
|
|
260
261
|
cloudAccessToken = process.env.NEEDLE_CLOUD_TOKEN;
|
|
261
262
|
}
|
|
@@ -292,7 +293,7 @@ async function invokeBuildPipeline(opts) {
|
|
|
292
293
|
if (!cloudAccessToken || !(typeof cloudAccessToken === "string") || cloudAccessToken.length <= 0) {
|
|
293
294
|
throw new Error("No cloud access token configured. Please set it via process.env.NEEDLE_CLOUD_TOKEN or in the vite.config.js");
|
|
294
295
|
}
|
|
295
|
-
let cmd = `npx --yes
|
|
296
|
+
let cmd = `npx --yes ${NEEDLE_CLOUD_CLI_NAME} optimize "${outputDirectory}" --token ${cloudAccessToken}`;
|
|
296
297
|
let projectName = opts.buildPipeline?.projectName;
|
|
297
298
|
// Default project name for compression
|
|
298
299
|
// TODO: maybe this should be taken from the package.json name field or needle.config?
|
|
@@ -45,6 +45,13 @@ function handleOptimizeDeps(config) {
|
|
|
45
45
|
// This needs to be excluded from optimization because otherwise the worker import fails
|
|
46
46
|
// three-mesh-bvh/src/workers/generateMeshBVH.worker.js?worker
|
|
47
47
|
config.optimizeDeps.exclude.push("three-mesh-bvh");
|
|
48
|
+
|
|
49
|
+
if (!config.server) config.server = {};
|
|
50
|
+
if (!config.server.fs) config.server.fs = {};
|
|
51
|
+
if (config.server.fs.strict === undefined) {
|
|
52
|
+
// we need to disable strictness to allow importing the worker from three-mesh-bvh node_modules in our GenerateMeshBVHWorker.js file
|
|
53
|
+
config.server.fs.strict = false;
|
|
54
|
+
}
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
|
|
@@ -72,13 +79,16 @@ function handleManualChunks(config) {
|
|
|
72
79
|
})
|
|
73
80
|
}
|
|
74
81
|
else {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
// If preserveModules is true we can not modify the chunkFileNames
|
|
83
|
+
if (rollupOutput.preserveModules !== true) {
|
|
84
|
+
if (rollupOutput.manualChunks) {
|
|
85
|
+
// if the user has already defined manualChunks, we don't want to overwrite it
|
|
86
|
+
console.log("[needle-dependencies] manualChunks already defined");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log("[needle-dependencies] registering manualChunks");
|
|
90
|
+
rollupOutput.manualChunks = needleManualChunks;
|
|
91
|
+
}
|
|
82
92
|
}
|
|
83
93
|
|
|
84
94
|
if (rollupOutput.chunkFileNames) {
|
|
@@ -39,20 +39,23 @@ export const needleFacebookInstantGames = (command, config, userSettings) => {
|
|
|
39
39
|
if (userSettings.noFacebookInstantGames === true) return;
|
|
40
40
|
|
|
41
41
|
// If the config is not present it means that we don't want to use fb instant games
|
|
42
|
-
if (!config || !config.facebookInstantGames) return;
|
|
42
|
+
if (!config || !(userSettings.facebookInstantGames || config.facebookInstantGames)) return;
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
/** @type {import('../types').userSettings["facebookInstantGames"]} */
|
|
45
|
+
const facebookInstantGamesConfig = { ...config.facebookInstantGames, ...userSettings.facebookInstantGames };
|
|
46
|
+
|
|
47
|
+
log("Setup Facebook Instant Games", facebookInstantGamesConfig);
|
|
45
48
|
|
|
46
49
|
|
|
47
50
|
// https://developers.facebook.com/docs/games/build/instant-games/reference/bundle-config
|
|
48
51
|
let bundleConfig = {}
|
|
49
52
|
const bundleConfigPath = process.cwd() + "/fbapp-config.json";
|
|
50
53
|
if (existsSync(bundleConfigPath)) {
|
|
51
|
-
log(
|
|
54
|
+
log(`Found facebook bundle config exists at "${bundleConfigPath}" ...`);
|
|
52
55
|
bundleConfig = JSON.parse(readFileSync(bundleConfigPath, 'utf8'));
|
|
53
56
|
}
|
|
54
57
|
else {
|
|
55
|
-
log(
|
|
58
|
+
log(`No facebook bundle config exists at "${bundleConfigPath}" - will generate one now`);
|
|
56
59
|
}
|
|
57
60
|
|
|
58
61
|
// Make sure the bundle has the required arguments:
|
package/plugins/vite/index.js
CHANGED
|
@@ -96,7 +96,7 @@ const defaultUserSettings = {
|
|
|
96
96
|
}
|
|
97
97
|
* ```
|
|
98
98
|
* @param {"build" | "serve"} command
|
|
99
|
-
* @param {{} | undefined} config
|
|
99
|
+
* @param {{} | undefined | null} config
|
|
100
100
|
* @param {import('../types/index.js').userSettings} userSettings
|
|
101
101
|
*/
|
|
102
102
|
export const needlePlugins = async (command, config = undefined, userSettings = {}) => {
|
|
@@ -129,6 +129,7 @@ import { SpatialGrabRaycaster } from "../../engine-components/ui/Raycaster.js";
|
|
|
129
129
|
import { RectTransform } from "../../engine-components/ui/RectTransform.js";
|
|
130
130
|
import { SpatialHtml } from "../../engine-components/ui/SpatialHtml.js";
|
|
131
131
|
import { Text } from "../../engine-components/ui/Text.js";
|
|
132
|
+
import { EnvironmentScene } from "../../engine-components/utils/EnvironmentScene.js";
|
|
132
133
|
import { LookAt } from "../../engine-components/utils/LookAt.js";
|
|
133
134
|
import { OpenURL } from "../../engine-components/utils/OpenURL.js";
|
|
134
135
|
import { VideoPlayer } from "../../engine-components/VideoPlayer.js";
|
|
@@ -278,6 +279,7 @@ TypeStore.add("SpatialGrabRaycaster", SpatialGrabRaycaster);
|
|
|
278
279
|
TypeStore.add("RectTransform", RectTransform);
|
|
279
280
|
TypeStore.add("SpatialHtml", SpatialHtml);
|
|
280
281
|
TypeStore.add("Text", Text);
|
|
282
|
+
TypeStore.add("EnvironmentScene", EnvironmentScene);
|
|
281
283
|
TypeStore.add("LookAt", LookAt);
|
|
282
284
|
TypeStore.add("OpenURL", OpenURL);
|
|
283
285
|
TypeStore.add("VideoPlayer", VideoPlayer);
|
|
@@ -280,8 +280,9 @@ export class AssetReference {
|
|
|
280
280
|
if (debug)
|
|
281
281
|
console.log("loadAssetAsync", this.url);
|
|
282
282
|
if (!this.mustLoad) return this.asset;
|
|
283
|
-
|
|
284
|
-
|
|
283
|
+
|
|
284
|
+
if (prog) this._progressListeners.push(prog);
|
|
285
|
+
|
|
285
286
|
if (this._loading !== undefined) {
|
|
286
287
|
// console.warn("Wait for other loading thiny");
|
|
287
288
|
return this._loading.then(_ => this.asset);
|
|
@@ -92,10 +92,11 @@ export function addComponent<T extends IComponent>(obj: Object3D, componentInsta
|
|
|
92
92
|
|
|
93
93
|
if (componentInstance.gameObject === obj) return componentInstance;
|
|
94
94
|
// TODO: update raycast array
|
|
95
|
-
if (componentInstance.gameObject && componentInstance.gameObject.userData
|
|
95
|
+
if (componentInstance.gameObject && componentInstance.gameObject.userData?.components) {
|
|
96
96
|
const index = componentInstance.gameObject.userData.components.indexOf(componentInstance);
|
|
97
97
|
componentInstance.gameObject.userData.components.splice(index, 1);
|
|
98
98
|
}
|
|
99
|
+
if (!obj.userData) obj.userData = {};
|
|
99
100
|
if (!obj.userData.components) obj.userData.components = [];
|
|
100
101
|
else if (obj.userData.components.includes(componentInstance)) return componentInstance;
|
|
101
102
|
// TODO: do we want to disable and enable when moving?
|