@operato/board 1.22.1 → 1.23.0
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 +17 -0
- package/dist/src/data-storage/board-model-cache.d.ts +30 -0
- package/dist/src/data-storage/board-model-cache.js +93 -0
- package/dist/src/data-storage/board-model-cache.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ox-board-viewer.d.ts +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/data-storage/board-model-cache.ts +112 -0
- package/src/index.ts +2 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operato/board",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "Webcomponent for board following open-wc recommendations",
|
|
5
5
|
"author": "heartyoh",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"dependencies": {
|
|
94
94
|
"@open-wc/scoped-elements": "^2.0.0-next.6",
|
|
95
|
-
"@operato/app": "^1.22.
|
|
95
|
+
"@operato/app": "^1.22.2",
|
|
96
96
|
"@operato/data-grist": "^1.22.0",
|
|
97
97
|
"@operato/font": "^1.22.0",
|
|
98
98
|
"@operato/graphql": "^1.21.0",
|
|
@@ -152,5 +152,5 @@
|
|
|
152
152
|
"prettier --write"
|
|
153
153
|
]
|
|
154
154
|
},
|
|
155
|
-
"gitHead": "
|
|
155
|
+
"gitHead": "7691955920f6d9f952b8faa4ab90ce4036fe2f98"
|
|
156
156
|
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* BoardModelCache — 보드 모델 JSON을 IndexedDB에 캐싱.
|
|
5
|
+
*
|
|
6
|
+
* 캐시 히트 시 네트워크 대기 없이 즉시 scene 생성 가능.
|
|
7
|
+
* updatedAt 비교로 캐시 무효화.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import Dexie from 'dexie'
|
|
11
|
+
|
|
12
|
+
interface IBoardModelRecord {
|
|
13
|
+
id: string // board ID (primary key)
|
|
14
|
+
name: string
|
|
15
|
+
model: string // JSON string (파싱 전)
|
|
16
|
+
updatedAt: string // 서버의 updatedAt
|
|
17
|
+
cachedAt: number // 로컬 캐시 시점
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class BoardModelDatabase extends Dexie {
|
|
21
|
+
board_models!: Dexie.Table<IBoardModelRecord, string>
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
super('board-model-cache')
|
|
25
|
+
this.version(1).stores({
|
|
26
|
+
board_models: 'id'
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const db = new BoardModelDatabase()
|
|
32
|
+
|
|
33
|
+
export interface CachedBoard {
|
|
34
|
+
id: string
|
|
35
|
+
name: string
|
|
36
|
+
model: any // 파싱된 모델 객체
|
|
37
|
+
updatedAt: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class BoardModelCache {
|
|
41
|
+
/**
|
|
42
|
+
* 캐시에서 보드 모델 조회
|
|
43
|
+
* @returns 캐시된 보드 또는 null
|
|
44
|
+
*/
|
|
45
|
+
static async get(boardId: string): Promise<CachedBoard | null> {
|
|
46
|
+
try {
|
|
47
|
+
const record = await db.board_models.get(boardId)
|
|
48
|
+
if (!record) return null
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
id: record.id,
|
|
52
|
+
name: record.name,
|
|
53
|
+
model: JSON.parse(record.model),
|
|
54
|
+
updatedAt: record.updatedAt
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
return null
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 보드 모델을 캐시에 저장
|
|
63
|
+
*/
|
|
64
|
+
static async put(boardId: string, name: string, model: string, updatedAt: string): Promise<void> {
|
|
65
|
+
try {
|
|
66
|
+
await db.board_models.put({
|
|
67
|
+
id: boardId,
|
|
68
|
+
name,
|
|
69
|
+
model,
|
|
70
|
+
updatedAt,
|
|
71
|
+
cachedAt: Date.now()
|
|
72
|
+
})
|
|
73
|
+
} catch {
|
|
74
|
+
// 캐시 저장 실패는 무시 — 기능에 영향 없음
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 캐시가 최신인지 확인
|
|
80
|
+
* @returns true면 캐시 유효, false면 갱신 필요
|
|
81
|
+
*/
|
|
82
|
+
static async isValid(boardId: string, serverUpdatedAt: string): Promise<boolean> {
|
|
83
|
+
try {
|
|
84
|
+
const record = await db.board_models.get(boardId)
|
|
85
|
+
return record?.updatedAt === serverUpdatedAt
|
|
86
|
+
} catch {
|
|
87
|
+
return false
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 특정 보드 캐시 삭제
|
|
93
|
+
*/
|
|
94
|
+
static async remove(boardId: string): Promise<void> {
|
|
95
|
+
try {
|
|
96
|
+
await db.board_models.delete(boardId)
|
|
97
|
+
} catch {
|
|
98
|
+
// ignore
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 전체 캐시 클리어
|
|
104
|
+
*/
|
|
105
|
+
static async clear(): Promise<void> {
|
|
106
|
+
try {
|
|
107
|
+
await db.board_models.clear()
|
|
108
|
+
} catch {
|
|
109
|
+
// ignore
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from './types.js'
|
|
|
2
2
|
|
|
3
3
|
export { registerDefaultGroups } from './component/register-default-groups.js'
|
|
4
4
|
export { BoardDataStorage, PlaylistStorage } from './data-storage/data-storage.js'
|
|
5
|
+
export { BoardModelCache } from './data-storage/board-model-cache.js'
|
|
6
|
+
export type { CachedBoard } from './data-storage/board-model-cache.js'
|
|
5
7
|
|
|
6
8
|
export * from './ox-board-viewer.js'
|
|
7
9
|
export * from './ox-board-player.js'
|