deotalandAi/packages/utils/src/servers/meshyserver.js

138 lines
4.8 KiB
JavaScript

import { request as requestUtils } from '../utils/request.js'
import * as clientApi from '../api/frontend/index.js'
import * as adminApi from '../api/FrontendDesigner'
import { FileServer } from './fileserver.js';
// 获取环境变量中的
const getPorjectType = () => {
// 浏览器环境
if (typeof window !== 'undefined') {
// Vite 环境变量
return import.meta.env.VITE_PROJECTTYPE;
}
// Node.js 环境
if (typeof process !== 'undefined') {
return process.env.VITE_PROJECTTYPE ;
}
};
export class MeshyServer extends FileServer {
RULE = getPorjectType();
// 任务并发队列
static taskQueue = new Map();
//最高并发限制
static MAX_CONCURRENT_TASKS = 10;
static pollingEnabled = true;
constructor() {
super();
}
//提交模型任务返回id
async createModelTask(item={},callback,errorCallback,config={}) {
// 检查当前并发任务数
if(MeshyServer.taskQueue.size >= MeshyServer.MAX_CONCURRENT_TASKS){
window.setElMessage({
type:'warning',
message:'Concurrent limit reached'
})
errorCallback&&errorCallback('Concurrent limit reached');
return Promise.reject('Concurrent limit reached');
}
const taskId = new Date().getTime();
MeshyServer.taskQueue.set(taskId, taskId);
try {
let params = {
project_id: item.project_id,
"payload": {
image_url:'',
ai_model: 'latest',
enable_pbr: false,
should_remesh: false,
should_texture: false,
save_pre_remeshed_model: true,
...config
}
}
let imgurl = item.image_url.indexOf('https://api.deotaland.ai') !== -1
? item.image_url
: await this.uploadFile(item.image_url);
// let imgurl = 'https://api.deotaland.ai/upload/aabf8b4a8df447fa8c3e3f7978c523cc.png';
params.payload.image_url = imgurl;
const requestUrl = this.RULE=='admin'?adminApi.default.IMAGE_TO_3DADMIN:clientApi.default.IMAGE_TO_3D;
const response = await requestUtils.common(requestUrl, params);
// const response = {"code":0,"message":"","success":true,"data":{"id":2215,"message":"任务已提交,正在处理"}}
console.log('创建模型任务响应:', response);
if(response.code==0){
callback&&callback(response?.data?.id,taskId);
}
} catch (error) {
console.error('创建模型任务失败:', error);
errorCallback&&errorCallback(error);
throw error;
}
}
static demoNum = 0;
//查询任务状态
async getModelTaskStatus(resultItem,callback,errorCallback,progressCallback){
const result = resultItem.result;
const resultTask = resultItem.resultTask;
if(!MeshyServer.taskQueue.has(resultTask)){//用户刷新了页面清除了任务队列重新添加进任务队列
MeshyServer.taskQueue.set(resultTask, resultTask);
}
try {
const requestUrl = {
url:this.RULE=='admin'?adminApi.default.FIND_TASK_IDADMIN.url.replace('TASKID', result):clientApi.default.FIND_TASK_ID.url.replace('TASKID', result),
method:this.RULE=='admin'?adminApi.default.FIND_TASK_IDADMIN.method:clientApi.default.FIND_TASK_ID.method,
};
let response = await requestUtils.common(requestUrl, {});
// let response = {
// "code": 0,
// "message": "",
// "success": true,
// "data": {
// "id": 2175,
// "status": 0,
// "result": null,
// "response_data": {},
// "provider": "meshy",
// "project_id": 57,
// "created_at": "2025-12-10T04:26:40.148194+00:00"
// }
// }
if(response.code==0){
let data = response?.data?.result||{};
let status = response?.data.status;
switch (status) {
case 1:
// let modelurl = data.model_url.replace("https://assets.meshy.ai", "https://api.deotaland.ai/model");
let modelurl = data.s3_glb_url;
resultTask&&MeshyServer.taskQueue.delete(resultTask);
callback&&callback(modelurl);
break;
case 2:
errorCallback&&errorCallback();
resultTask&&MeshyServer.taskQueue.delete(resultTask);
break;
case 3:
errorCallback&&errorCallback();
resultTask&&MeshyServer.taskQueue.delete(resultTask);
break;
default:
if(!MeshyServer.pollingEnabled){//如果禁用轮询,直接返回
return
}
// 等待三秒
await new Promise(resolve => setTimeout(resolve, 3000));
progressCallback&&progressCallback(data.progress||0);
this.getModelTaskStatus({
result:result,
resultTask:resultTask,
},callback,errorCallback,progressCallback);
break;
}
}
}
catch (error) {
resultTask&&MeshyServer.taskQueue.delete(resultTask);
errorCallback&&errorCallback(error);
throw error;
}
}
}