From 6b8ca941a866869acd434e7d06f4e62da681b353 Mon Sep 17 00:00:00 2001 From: Gon Pombo Date: Wed, 1 Nov 2023 17:17:57 -0300 Subject: [PATCH] fix smart werabale hot reload (#822) --- .../sdk-commands/src/commands/build/index.ts | 2 +- .../src/commands/pack-smart-wearable/index.ts | 2 +- .../sdk-commands/src/commands/start/index.ts | 6 +- .../src/commands/start/server/endpoints.ts | 26 +++--- .../start/server/file-watch-notifier.ts | 11 ++- .../sdk-commands/src/logic/project-files.ts | 2 +- .../src/logic/project-validations.ts | 4 +- .../AvatarWearables_TX.png | Bin 0 -> 8491 bytes .../fixtures/sdk7-smart-wearable/glasses.glb | Bin 0 -> 88084 bytes .../fixtures/sdk7-smart-wearable/package.json | 25 ++++++ .../fixtures/sdk7-smart-wearable/scene.json | 25 ++++++ .../fixtures/sdk7-smart-wearable/src/index.ts | 85 ++++++++++++++++++ .../sdk7-smart-wearable/thumbnail.png | Bin 0 -> 14220 bytes .../sdk7-smart-wearable/tsconfig.json | 8 ++ .../sdk7-smart-wearable/wearable.json | 29 ++++++ 15 files changed, 198 insertions(+), 27 deletions(-) create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/AvatarWearables_TX.png create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/glasses.glb create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/package.json create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/scene.json create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/src/index.ts create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/thumbnail.png create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/tsconfig.json create mode 100644 test/build-ecs/fixtures/sdk7-smart-wearable/wearable.json diff --git a/packages/@dcl/sdk-commands/src/commands/build/index.ts b/packages/@dcl/sdk-commands/src/commands/build/index.ts index bec3a93b2..8770f7144 100644 --- a/packages/@dcl/sdk-commands/src/commands/build/index.ts +++ b/packages/@dcl/sdk-commands/src/commands/build/index.ts @@ -50,7 +50,7 @@ export async function main(options: Options) { for (const project of workspace.projects) { printCurrentProjectStarting(options.components.logger, project, workspace) - if (project.kind === 'scene' || project.kind === 'wearable') { + if (project.kind === 'scene' || project.kind === 'smart-wearable') { await buildScene(options, project) } } diff --git a/packages/@dcl/sdk-commands/src/commands/pack-smart-wearable/index.ts b/packages/@dcl/sdk-commands/src/commands/pack-smart-wearable/index.ts index 1daf0d678..1eaca4898 100644 --- a/packages/@dcl/sdk-commands/src/commands/pack-smart-wearable/index.ts +++ b/packages/@dcl/sdk-commands/src/commands/pack-smart-wearable/index.ts @@ -43,7 +43,7 @@ export async function main(options: Options) { for (const project of workspace.projects) { printCurrentProjectStarting(options.components.logger, project, workspace) - if (project.kind === 'wearable') { + if (project.kind === 'smart-wearable') { await packSmartWearable(options, project) } } diff --git a/packages/@dcl/sdk-commands/src/commands/start/index.ts b/packages/@dcl/sdk-commands/src/commands/start/index.ts index 29f7f8612..ac8d8c058 100644 --- a/packages/@dcl/sdk-commands/src/commands/start/index.ts +++ b/packages/@dcl/sdk-commands/src/commands/start/index.ts @@ -100,8 +100,8 @@ export async function main(options: Options) { printWarning(options.components.logger, 'Support for multiple projects is still experimental.') for (const project of workspace.projects) { - if (project.kind === 'wearable') hasSmartWearable = true - if (project.kind === 'scene' || project.kind === 'wearable') { + if (project.kind === 'smart-wearable') hasSmartWearable = true + if (project.kind === 'scene' || project.kind === 'smart-wearable') { printCurrentProjectStarting(options.components.logger, project, workspace) // first run `npm run build`, this can be disabled with --skip-build @@ -170,7 +170,7 @@ export async function main(options: Options) { await wireRouter(components, workspace, dataLayer) if (watch) { for (const project of workspace.projects) { - await wireFileWatcherToWebSockets(components, project.workingDirectory) + await wireFileWatcherToWebSockets(components, project.workingDirectory, project.kind) } } await startComponents() diff --git a/packages/@dcl/sdk-commands/src/commands/start/server/endpoints.ts b/packages/@dcl/sdk-commands/src/commands/start/server/endpoints.ts index 47035074e..a91bc6f0d 100644 --- a/packages/@dcl/sdk-commands/src/commands/start/server/endpoints.ts +++ b/packages/@dcl/sdk-commands/src/commands/start/server/endpoints.ts @@ -17,10 +17,6 @@ import { getCatalystBaseUrl } from '../../../logic/config' import { Workspace } from '../../../logic/workspace-validations' import { ProjectUnion, WearableProject } from '../../../logic/project-validations' -function smartWearableNameToId(name: string) { - return name.toLocaleLowerCase().replace(/ /g, '-') -} - type LambdasWearable = Wearable & { baseUrl: string } @@ -169,7 +165,7 @@ async function serveFolders( if (path.resolve(fullPath) === path.resolve(baseProject.workingDirectory)) { // if we are talking about the root directory, then we must return the json of the entity - const entity = await fakeEntityV3FromProject(components, baseProject, b64HashingFunction) + const entity = await fakeEntityV3FromProject(components, baseProject, async ($) => b64HashingFunction($)) if (!entity) return { status: 404 } @@ -245,7 +241,7 @@ async function serveFolders( return { body: { ok: true, - data: wearables.filter((wearable) => smartWearableNameToId(wearable?.name) === wearableId) + data: wearables.filter((wearable) => wearable.id === wearableCache.get(wearableId)) } } }) @@ -270,7 +266,7 @@ async function getAllPreviewWearables( const wearablePathArray: string[] = [] for (const project of workspace.projects) { - if (project.kind === 'wearable') { + if (project.kind === 'smart-wearable') { const wearableJsonPath = path.resolve(project.workingDirectory, 'wearable.json') if (await components.fs.fileExists(wearableJsonPath)) { wearablePathArray.push(wearableJsonPath) @@ -281,7 +277,7 @@ async function getAllPreviewWearables( const ret: LambdasWearable[] = [] for (const project of workspace.projects) { try { - if (project.kind === 'wearable') ret.push(await serveWearable(components, project, baseUrl)) + if (project.kind === 'smart-wearable') ret.push(await serveWearable(components, project, baseUrl)) } catch (err) { components.logger.error( `Couldn't mock the wearable ${project.workingDirectory}. Please verify the correct format and scheme.` + err @@ -309,10 +305,8 @@ async function serveWearable( throw new Error(`Invalid wearable.json (${wearableJsonPath})`) } - const projectFiles = await getProjectPublishableFilesWithHashes( - components, - project.workingDirectory, - b64HashingFunction + const projectFiles = await getProjectPublishableFilesWithHashes(components, project.workingDirectory, async ($) => + b64HashingFunction($) ) const contentFiles = projectFilesToContentMappings(project.workingDirectory, projectFiles) @@ -321,7 +315,7 @@ async function serveWearable( thumbnailFiltered.length > 0 && thumbnailFiltered[0]!.hash && `${baseUrl}/${thumbnailFiltered[0].hash}` // Set wearable ID. - const sceneHash = await b64HashingFunction(JSON.stringify(project.scene)) + const sceneHash = b64HashingFunction(project.workingDirectory) const wearableId = wearableCache.get(sceneHash) ?? `urn:${uuidv4()}` wearableCache.set(sceneHash, wearableId) @@ -365,7 +359,9 @@ async function getSceneJson( const resultEntities: Entity[] = [] const allDeployments = await Promise.all( - workspace.projects.map((project) => fakeEntityV3FromProject(components, project, b64HashingFunction)) + workspace.projects.map((project) => + fakeEntityV3FromProject(components, project, async ($) => b64HashingFunction($)) + ) ) for (const pointer of Array.from(requestedPointers)) { @@ -504,7 +500,7 @@ async function fakeEntityV3FromProject( metadata: sceneJson, content: contentFiles } - } else if (project.kind === 'wearable') { + } else if (project.kind === 'smart-wearable') { const wearableJsonPath = path.resolve(project.workingDirectory, 'wearable.json') try { const wearableJson = JSON.parse(await components.fs.readFile(wearableJsonPath, 'utf-8')) diff --git a/packages/@dcl/sdk-commands/src/commands/start/server/file-watch-notifier.ts b/packages/@dcl/sdk-commands/src/commands/start/server/file-watch-notifier.ts index 6ac5f259a..47baa2ad5 100644 --- a/packages/@dcl/sdk-commands/src/commands/start/server/file-watch-notifier.ts +++ b/packages/@dcl/sdk-commands/src/commands/start/server/file-watch-notifier.ts @@ -5,6 +5,8 @@ import chokidar from 'chokidar' import { getDCLIgnorePatterns } from '../../../logic/dcl-ignore' import { PreviewComponents } from '../types' import { sceneUpdateClients } from './routes' +import { ProjectUnion } from '../../../logic/project-validations' +import { b64HashingFunction } from '../../../logic/project-files' function debounce void>(callback: T, delay: number) { let debounceTimer: NodeJS.Timeout @@ -21,7 +23,8 @@ function debounce void>(callback: T, delay: number */ export async function wireFileWatcherToWebSockets( components: Pick, - projectRoot: string + projectRoot: string, + projectKind: ProjectUnion['kind'] ) { const ignored = await getDCLIgnorePatterns(components, projectRoot) @@ -35,7 +38,7 @@ export async function wireFileWatcherToWebSockets( 'all', debounce(async (_, _file) => { // TODO: accumulate changes in an array and debounce - return updateScene(projectRoot, sceneUpdateClients) + return updateScene(projectRoot, sceneUpdateClients, projectKind) }, 500) ) } @@ -43,12 +46,12 @@ export async function wireFileWatcherToWebSockets( /* * IMPORTANT: this is a legacy protocol and needs to be revisited for SDK7 */ -function updateScene(dir: string, clients: Set): void { +function updateScene(dir: string, clients: Set, projectKind: ProjectUnion['kind']): void { for (const client of clients) { if (client.readyState === WebSocket.OPEN) { const message: sdk.SceneUpdate = { type: sdk.SCENE_UPDATE, - payload: { sceneId: 'b64-' + Buffer.from(dir).toString('base64'), sceneType: sdk.ProjectType.SCENE } + payload: { sceneId: b64HashingFunction(dir), sceneType: projectKind } } client.send(sdk.UPDATE) diff --git a/packages/@dcl/sdk-commands/src/logic/project-files.ts b/packages/@dcl/sdk-commands/src/logic/project-files.ts index 5cba82095..d3f3c478a 100644 --- a/packages/@dcl/sdk-commands/src/logic/project-files.ts +++ b/packages/@dcl/sdk-commands/src/logic/project-files.ts @@ -102,7 +102,7 @@ export async function getProjectPublishableFilesWithHashes( return ret } -export const b64HashingFunction = async (str: string) => 'b64-' + Buffer.from(str).toString('base64') +export const b64HashingFunction = (str: string) => 'b64-' + Buffer.from(str).toString('base64') // export const ipfsHashingFunction = async (str: string) => hashV1(Buffer.from(str, 'utf8')) interface PackageJson { diff --git a/packages/@dcl/sdk-commands/src/logic/project-validations.ts b/packages/@dcl/sdk-commands/src/logic/project-validations.ts index 115935a85..979b2123a 100644 --- a/packages/@dcl/sdk-commands/src/logic/project-validations.ts +++ b/packages/@dcl/sdk-commands/src/logic/project-validations.ts @@ -11,7 +11,7 @@ import { getPackageJson } from './project-files' export type BaseProject = { workingDirectory: string } export type SceneProject = { kind: 'scene'; scene: Scene } & BaseProject -export type WearableProject = { kind: 'wearable'; scene: Scene } & BaseProject +export type WearableProject = { kind: 'smart-wearable'; scene: Scene } & BaseProject export type ProjectUnion = SceneProject | WearableProject /** @@ -29,7 +29,7 @@ export async function assertValidProjectFolder( switch (true) { case await components.fs.fileExists(getSmartWearableFile(workingDirectory)): { await getValidWearableJson(components, workingDirectory) - return { kind: 'wearable', scene: await getValidSceneJson(components, workingDirectory), workingDirectory } + return { kind: 'smart-wearable', scene: await getValidSceneJson(components, workingDirectory), workingDirectory } } case await components.fs.fileExists(getSceneFilePath(workingDirectory)): { diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/AvatarWearables_TX.png b/test/build-ecs/fixtures/sdk7-smart-wearable/AvatarWearables_TX.png new file mode 100644 index 0000000000000000000000000000000000000000..e25400f67b8d8fc4e0bff612990c2906d5b5102c GIT binary patch literal 8491 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 A-~a#s literal 0 HcmV?d00001 diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/glasses.glb b/test/build-ecs/fixtures/sdk7-smart-wearable/glasses.glb new file mode 100644 index 0000000000000000000000000000000000000000..5d1eb27ced6a5a9d5d28531ff2a9b46cab802739 GIT binary patch literal 88084 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%0Di<%(t8n`P!ciTE}gH^?2uvN*w8V4Gyo z;q#b+q|FuUuD($TW2F7(xG_aIq1(bA2)az;AI(J1eGSGhV?LONJm%t+nq+GI!GqTC z7r4Tl%yaTw>;gX_NN3>JU8$;q=9zx&+Xu)Z;W z$NagS#%}oyi0$qY_h0EheT8wE2Htg=7qsUzJNg33OS>IxYm*Q0`2HB|{>s|rMmkTf z{`(zyGsK_`?H?oXg&Al0^OfGj_vNfDfBG2upFEj(oc{~P)ynFaU^>sj9%U+SKn&Ut ze-ikZ6-9hek{j{Q4jHuV|KM47`7H8>=8nMfXAL%=p1rU>3^P7ouSvJh)P7N0L%coR zUkJ@h;tyV5ME<}w&bh%Nhv$qd6D=P+f8Z+bEs)I^JipNYflQ0lEg%hk7jT;3?Vf7k zj)T7@@&C6n4`rt;IRYPe1nOsk{|{A&zhBV*72y9SmDP&;#l)kUBaIF|L*oDcfdBIn zw?dp@%AtOx=zkV&xsBle1n_@Tf(zu!Y4$D(u2QDd@OLHt9|iu`uZ)8H7^V~IKL-CV zXssq5{qF$(A1_1SbDCc}bT(P8g%5Q4e+Ky97yRFCA4C2*3I11${wMyg;Q#Nz|JTo? z6CZo5S#=EDzEk4=dag~STlgOBzuY+%%XWyJgfjxikN!Uh{@2t^C4N?Kze)veAM`i+ zKfm$0s=i_Z?mtFbWVb|#{w6*W{J#zSzv1Cn;zNN~597ZE{<@QAfnPX`j|2Y?^3`oR z^9peLXA=Lf@&4Sb$||ApZ+_^hI0CU%a7N(x=Yv1n!T-;Hyh-nWk6XK032xu#^gr(Z zsmeC9?r071OWda@(jXQNX9V)-e*ye|aBVB`@A`+A7l7M~CH{_;g_RHRA(X$qG*ezA z`kQ$4|2Xh}b3y^}4?IQwo`jzWe6ap;G0tD%o44gn!}wV6{|F~vANsTy-MS!9^gp^N z?!)==?qx`6zk|B;^^A1QC|-%EUb|I>LB zbIJch`~&d+mKu@2d;SISXPo{=o_#w~K6C#$;?ITq$)`Rf{}1s!;D7gAk&oU!K>YS$ z{FchI#Md_Y%DX#W=5JP%4)G(nQ*&|r0|O5Hy~pADxpyYWGv}t#{@GP!gR`CC6C;!F$7$fps zqW>A>Ujts|KMi?q#Cx+84n3H;w%=}r9dytPVndxOOPy7u+Tm;f)z zXIV;$0%LeaAdmik8~p!4k{j`(j3V#u|NHrI8~DTH%c+0ma`X4KY|NmGPK6dE;!>jNGyF-Tf{{pF|_F(`3 literal 0 HcmV?d00001 diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/package.json b/test/build-ecs/fixtures/sdk7-smart-wearable/package.json new file mode 100644 index 000000000..4776b3051 --- /dev/null +++ b/test/build-ecs/fixtures/sdk7-smart-wearable/package.json @@ -0,0 +1,25 @@ +{ + "name": "simple-scene", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "git+https://github.com/decentraland/js-sdk-toolchain.git" + }, + "license": "Apache-2.0", + "description": "My new Decentraland project", + "scripts": { + "start": "sdk-commands start", + "build": "sdk-commands build", + "build-prod": "sdk-commands build --production", + "watch": "sdk-commands build --watch" + }, + "devDependencies": { + "@dcl/ecs": "file:../../../../packages/@dcl/ecs", + "@dcl/js-runtime": "7.0.0", + "@dcl/sdk": "file:../../../../packages/@dcl/sdk", + "@dcl/sdk-commands": "file:../../../../packages/@dcl/sdk-commands" + }, + "dependencies": { + "@dcl/ecs-math": "^2.0.1-20221108141807.commit-a1344cb" + } +} diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/scene.json b/test/build-ecs/fixtures/sdk7-smart-wearable/scene.json new file mode 100644 index 000000000..cf61d2f1c --- /dev/null +++ b/test/build-ecs/fixtures/sdk7-smart-wearable/scene.json @@ -0,0 +1,25 @@ +{ + "ecs7": true, + "runtimeVersion": "7", + "isPortableExperience": true, + "display": { + "title": "SDK7 Smart Wearable", + "description": "SDK7 Smart Wearable description here", + "navmapThumbnail": "images/thumbnail.png", + "favicon": "favicon_asset" + }, + "owner": "", + "contact": { + "name": "SDK", + "email": "" + }, + "main": "bin/game.js", + "scene": { + "parcels": [ + "0,0" + ], + "base": "0,0" + }, + "requiredPermissions": [], + "featureToggles": {} +} \ No newline at end of file diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/src/index.ts b/test/build-ecs/fixtures/sdk7-smart-wearable/src/index.ts new file mode 100644 index 000000000..5abc63fcf --- /dev/null +++ b/test/build-ecs/fixtures/sdk7-smart-wearable/src/index.ts @@ -0,0 +1,85 @@ +import { + engine, + Entity, + InputAction, + MeshCollider, + MeshRenderer, + Transform, + pointerEventsSystem, + SyncComponents, + Schemas, + Material, + PointerEvents, + PointerEventType, + inputSystem +} from '@dcl/ecs' +import { Vector3, Quaternion, Color4 } from '@dcl/sdk/math' + +const Door = engine.defineComponent('door', { open: Schemas.Boolean }) + +export function getRandomHexColor(): string { + const letters = '012345789ABC sDEF' + let color = '#' + for (let i = 0; i < 6; i++) { + color += letters[Math.floor(Math.random() * 16)] + } + return color +} + +// Cube factory +function createCube(x: number, y: number, z: number): Entity { + const meshEntity = engine.addEntity() + Transform.create(meshEntity, { position: { x, y, z } }) + MeshRenderer.create(meshEntity, { mesh: { $case: 'box', box: { uvs: [] } } }) + MeshCollider.create(meshEntity, { mesh: { $case: 'box', box: {} } }) + Material.setPbrMaterial(meshEntity, { albedoColor: Color4.fromHexString(getRandomHexColor()) }) + + Door.create(meshEntity, { open: false }) + + SyncComponents.create(meshEntity, { componentIds: [Door.componentId, Material.componentId] }) + + PointerEvents.create(meshEntity, { + pointerEvents: [ + { eventType: PointerEventType.PET_DOWN, eventInfo: { button: InputAction.IA_POINTER, hoverText: 'Change Color' } } + ] + }) + + return meshEntity +} + +function changeColorSystem() { + for (const [entity] of engine.getEntitiesWith(Door, PointerEvents)) { + if (inputSystem.isTriggered(InputAction.IA_POINTER, PointerEventType.PET_DOWN, entity)) { + Material.setPbrMaterial(entity, { albedoColor: Color4.fromHexString(getRandomHexColor()) }) + const door = Door.getMutable(entity) + door.open = !door.open + console.log(`The door was ${door.open ? 'opened' : 'closed'}`) + } + } +} + +// Systems +function circularSystem(dt: number) { + const entitiesWithMeshRenderer = engine.getEntitiesWith(MeshRenderer, Transform) + for (const [entity, _meshRenderer, _transform] of entitiesWithMeshRenderer) { + const mutableTransform = Transform.getMutable(entity) + mutableTransform.rotation = Quaternion.multiply( + mutableTransform.rotation, + Quaternion.fromAngleAxis(dt * 1, Vector3.Up()) + ) + } +} + +export function main() { + const initEntity = createCube(8, 1, 8) + + pointerEventsSystem.onPointerDown( + { entity: initEntity, opts: { button: InputAction.IA_POINTER, hoverText: 'CASLA' } }, + function () { + createCube(1 + Math.random() * 8, Math.random() * 8, 1 + Math.random() * 8) + } + ) + + engine.addSystem(circularSystem) + engine.addSystem(changeColorSystem) +} diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/thumbnail.png b/test/build-ecs/fixtures/sdk7-smart-wearable/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..59f780aa04597f5755789454a7cc3ca855135240 GIT binary patch literal 14220 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 JrC}TWKLCGJWIF%= literal 0 HcmV?d00001 diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/tsconfig.json b/test/build-ecs/fixtures/sdk7-smart-wearable/tsconfig.json new file mode 100644 index 000000000..c7e5890d4 --- /dev/null +++ b/test/build-ecs/fixtures/sdk7-smart-wearable/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "allowJs": true, + "baseUrl": "." + }, + "extends": "@dcl/sdk/types/tsconfig.ecs7.json", + "compileOnSave": false +} \ No newline at end of file diff --git a/test/build-ecs/fixtures/sdk7-smart-wearable/wearable.json b/test/build-ecs/fixtures/sdk7-smart-wearable/wearable.json new file mode 100644 index 000000000..8fe0b8c93 --- /dev/null +++ b/test/build-ecs/fixtures/sdk7-smart-wearable/wearable.json @@ -0,0 +1,29 @@ +{ + "data": { + "replaces": [], + "hides": [], + "tags": [ + "special", + "new", + "eyebrows" + ], + "representations": [ + { + "bodyShapes": [ + "urn:decentraland:off-chain:base-avatars:BaseMale", + "urn:decentraland:off-chain:base-avatars:BaseFemale" + ], + "mainFile": "glasses.glb", + "contents": [ + "glasses.glb" + ], + "overrideHides": [], + "overrideReplaces": [] + } + ], + "category": "eyewear" + }, + "name": "Smart Wearable Example", + "description": "Put the glasses to see a new world", + "rarity": "mythic" +} \ No newline at end of file