From a31d0deb4eeb87e3b172dff2924ed454e5b94be5 Mon Sep 17 00:00:00 2001 From: Casper Warden <216465704+casperwardensl@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:32:39 +0000 Subject: [PATCH] Choose the right transfer method for assets --- lib/classes/ObjectResolver.ts | 15 ++++--- lib/classes/commands/AssetCommands.ts | 56 ++++++++++++++++++++------- lib/classes/interfaces/IResolveJob.ts | 4 +- package.json | 2 +- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/lib/classes/ObjectResolver.ts b/lib/classes/ObjectResolver.ts index 4a311f0..d4c40e8 100644 --- a/lib/classes/ObjectResolver.ts +++ b/lib/classes/ObjectResolver.ts @@ -53,14 +53,13 @@ export class ObjectResolver { this.objectsInQueue[id] = { object: objs[id], - skipInventory: options.skipInventory === true, - log: options.outputLog === true + options }; this.queue.push(id); } - else if (this.objectsInQueue[id].skipInventory && !options.skipInventory) + else if (this.objectsInQueue[id].options.skipInventory && !options.skipInventory) { - this.objectsInQueue[id].skipInventory = true + this.objectsInQueue[id].options.skipInventory = false; } }; @@ -324,12 +323,12 @@ export class ObjectResolver { return; } - if (!job.skipInventory) + if (!job.options.skipInventory && (job.options.includeTempObjects || ((job.object.Flags ?? 0) & PrimFlags.TemporaryOnRez) === 0)) { const o = job.object; if ((o.resolveAttempts === undefined || o.resolveAttempts < 3) && o.FullID !== undefined && o.name !== undefined && o.Flags !== undefined && !(o.Flags & PrimFlags.InventoryEmpty) && (!o.inventory || o.inventory.length === 0)) { - if (job.log) + if (job.options.outputLog) { // console.log('Processing inventory for ' + job.object.ID); } @@ -358,7 +357,7 @@ export class ObjectResolver } else { - if (job.log) + if (job.options.outputLog) { // console.log('Skipping inventory for ' + job.object.ID); } @@ -461,7 +460,7 @@ export class ObjectResolver await Promise.all(promises); for (const job of jobs) { - if (job.log) + if (job.options.outputLog) { // console.log('Signalling resolve OK for ' + job.object.ID); } diff --git a/lib/classes/commands/AssetCommands.ts b/lib/classes/commands/AssetCommands.ts index 7b24f3a..f70f168 100644 --- a/lib/classes/commands/AssetCommands.ts +++ b/lib/classes/commands/AssetCommands.ts @@ -21,6 +21,7 @@ import { BulkUpdateInventoryEvent } from '../../events/BulkUpdateInventoryEvent' import { FilterResponse } from '../../enums/FilterResponse'; import { LLLindenText } from '../LLLindenText'; import { Subscription } from 'rxjs'; +import { Logger } from '../Logger'; export class AssetCommands extends CommandsBase { @@ -30,26 +31,53 @@ export class AssetCommands extends CommandsBase { uuid = new UUID(uuid); } + try { - const result = await this.currentRegion.caps.downloadAsset(uuid, type); - if (result.toString('utf-8').trim() === 'Not found!') + switch (type) { - throw new Error('Asset not found'); + case HTTPAssets.ASSET_TEXTURE: + case HTTPAssets.ASSET_SOUND: + case HTTPAssets.ASSET_ANIMATION: + case HTTPAssets.ASSET_GESTURE: + case HTTPAssets.ASSET_LANDMARK: + case HTTPAssets.ASSET_CLOTHING: + case HTTPAssets.ASSET_MATERIAL: + case HTTPAssets.ASSET_BODYPART: + case HTTPAssets.ASSET_MESH: + return this.currentRegion.caps.downloadAsset(uuid, type); + case HTTPAssets.ASSET_CALLINGCARD: + case HTTPAssets.ASSET_SCRIPT: + case HTTPAssets.ASSET_OBJECT: + case HTTPAssets.ASSET_NOTECARD: + case HTTPAssets.ASSET_CATEGORY: + case HTTPAssets.ASSET_LSL_TEXT: + case HTTPAssets.ASSET_LSL_BYTECODE: + case HTTPAssets.ASSET_SIMSTATE: + case HTTPAssets.ASSET_LINK: + case HTTPAssets.ASSET_LINK_FOLDER: + case HTTPAssets.ASSET_WIDGET: + case HTTPAssets.ASSET_PERSON: + case HTTPAssets.ASSET_SETTINGS: + { + const transferParams = Buffer.allocUnsafe(20); + uuid.writeToBuffer(transferParams, 0); + transferParams.writeInt32LE(Utils.HTTPAssetTypeToAssetType(type), 16); + return this.transfer(TransferChannelType.Asset, TransferSourceType.Asset, false, transferParams); + } } - else if (result.toString('utf-8').trim() === 'Incorrect Syntax') - { - throw new Error('Invalid Syntax'); - } - return result; } - catch (error) + catch (e: unknown) { - // Fall back to old asset transfer - const transferParams = Buffer.allocUnsafe(20); - uuid.writeToBuffer(transferParams, 0); - transferParams.writeInt32LE(parseInt(type, 10), 16); - return this.transfer(TransferChannelType.Asset, TransferSourceType.Asset, false, transferParams); + if (e instanceof Error) + { + Logger.Error('Failed to download ' + type + ' asset ' + uuid.toString() + ' - ' + e.message) + } + else + { + Logger.Error('Failed to download ' + type + ' asset ' + uuid.toString() + ' - ' + String(e)); + } + throw e; } } diff --git a/lib/classes/interfaces/IResolveJob.ts b/lib/classes/interfaces/IResolveJob.ts index 51a45e0..2eb7239 100644 --- a/lib/classes/interfaces/IResolveJob.ts +++ b/lib/classes/interfaces/IResolveJob.ts @@ -1,8 +1,8 @@ import { GameObject } from '../..'; +import { GetObjectsOptions } from '../commands/RegionCommands'; export interface IResolveJob { object: GameObject, - skipInventory: boolean, - log: boolean + options: GetObjectsOptions, } diff --git a/package.json b/package.json index 5a17b21..5101f6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@caspertech/node-metaverse", - "version": "0.6.15", + "version": "0.6.16", "description": "A node.js interface for Second Life.", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts",