-
Notifications
You must be signed in to change notification settings - Fork 247
Expand file tree
/
Copy pathconsole-indexeddb-vrm-helper.js
More file actions
120 lines (115 loc) · 4.44 KB
/
console-indexeddb-vrm-helper.js
File metadata and controls
120 lines (115 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* Вставка в консоль браузера (на странице приложения).
* База: AmicaVrmDatabase, store: vrms.
* Запись: { hash, saveType, vrmData, vrmUrl, thumbData }.
*/
// --------------- 1) Проверить, что в базе есть ---------------
function listVrms() {
return new Promise((resolve, reject) => {
const r = indexedDB.open('AmicaVrmDatabase');
r.onsuccess = () => {
const db = r.result;
if (!db.objectStoreNames.contains('vrms')) {
db.close();
return resolve([]);
}
const t = db.transaction('vrms', 'readonly');
const s = t.objectStore('vrms');
const req = s.getAll();
req.onsuccess = () => { db.close(); resolve(req.result || []); };
req.onerror = () => { db.close(); reject(req.error); };
};
r.onerror = () => reject(r.error);
});
}
// В консоли: listVrms().then(console.log)
// --------------- 2) Добавить одну тестовую запись (минимальная, без реального VRM) ---------------
function addTestRecord() {
const record = {
hash: 'test-' + Date.now(),
saveType: 'local',
vrmData: 'data:application/octet-stream;base64,', // пустой base64
vrmUrl: '',
thumbData: ''
};
return new Promise((resolve, reject) => {
const r = indexedDB.open('AmicaVrmDatabase');
r.onsuccess = () => {
const db = r.result;
const t = db.transaction('vrms', 'readwrite');
const s = t.objectStore('vrms');
const req = s.put(record);
req.onsuccess = () => { db.close(); resolve(record.hash); };
req.onerror = () => { db.close(); reject(req.error); };
};
r.onerror = () => reject(r.error);
});
}
// В консоли: addTestRecord().then(h => console.log('Добавлен hash:', h))
// Затем обнови страницу (F5) — в списке моделей может появиться карточка (по клику будет ошибка загрузки — это нормально для теста).
// --------------- 3) Добавить реальный VRM из выбранного файла ---------------
function addVrmFromFile(file) {
if (!file || !file.name.toLowerCase().endsWith('.vrm')) {
return Promise.reject(new Error('Нужен файл .vrm'));
}
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const vrmData = reader.result;
if (typeof vrmData !== 'string') {
reject(new Error('Ожидалась строка data URL'));
return;
}
const len = vrmData.length;
const S = 100000;
let h = 0;
for (let i = 0; i < Math.min(S, len); i++) h = ((h << 5) - h + vrmData.charCodeAt(i)) << 0;
for (let i = Math.max(0, len - S); i < len; i++) h = ((h << 5) - h + vrmData.charCodeAt(i)) << 0;
h = ((h << 5) - h + len) << 0;
const hash = String(h);
const record = {
hash,
saveType: 'local',
vrmData,
vrmUrl: '',
thumbData: ''
};
const r = indexedDB.open('AmicaVrmDatabase');
r.onsuccess = () => {
const db = r.result;
const t = db.transaction('vrms', 'readwrite');
const s = t.objectStore('vrms');
const req = s.put(record);
req.onsuccess = () => { db.close(); resolve({ hash, size: vrmData.length }); };
req.onerror = () => { db.close(); reject(req.error); };
};
r.onerror = () => reject(r.error);
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
// Создать input и по выбору файла добавить в IndexedDB
function addVrmViaFilePicker() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.vrm,.VRM';
input.onchange = () => {
const file = input.files && input.files[0];
if (!file) return;
addVrmFromFile(file)
.then((r) => console.log('[VRM] Запись в IndexedDB:', r))
.catch((e) => console.error('[VRM] Ошибка:', e));
};
input.click();
}
// Экспорт в глобал, чтобы в консоли вызывать по имени
if (typeof window !== 'undefined') {
window.__vrmIndexedDB = {
list: listVrms,
addTest: addTestRecord,
addFromFile: addVrmFromFile,
pickAndAdd: addVrmViaFilePicker
};
console.log('VRM IndexedDB helper: __vrmIndexedDB.list() | .addTest() | .pickAndAdd()');
}