@hatiolab/things-scene 3.4.46 → 3.4.48

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.
@@ -0,0 +1,21 @@
1
+ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
2
+ if (message.type === 'GET_TAB_INFO') {
3
+ chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
4
+ if (chrome.runtime.lastError) {
5
+ console.error('Error querying tabs:', chrome.runtime.lastError)
6
+ sendResponse({ tabId: null })
7
+ return
8
+ }
9
+
10
+ if (tabs.length > 0) {
11
+ sendResponse({ tabId: tabs[0].id })
12
+ } else {
13
+ console.log('No active tab found.')
14
+ sendResponse({ tabId: null })
15
+ }
16
+ })
17
+
18
+ // 비동기 응답을 위해 true 반환
19
+ return true
20
+ }
21
+ })
@@ -0,0 +1,71 @@
1
+ // content.js
2
+
3
+ // 백그라운드 스크립트에 탭 정보를 요청
4
+ chrome.runtime.sendMessage({ type: 'GET_TAB_INFO' }, response => {
5
+ if (response && response.tabId) {
6
+ const tabId = response.tabId
7
+
8
+ function updateChart(data = {}) {
9
+ chrome.runtime.sendMessage({ type: 'UPDATE_CHART', tabId, data })
10
+ }
11
+
12
+ window.addEventListener('message', function (event) {
13
+ if (event.source !== window || !event.data.type) return
14
+
15
+ if (event.data.type === 'RESIDENT_COUNT') {
16
+ const { timestamp, componentResidentsCount, sceneResidentsCount, sceneResidents, referenceMapResidentsCount } =
17
+ event.data
18
+
19
+ try {
20
+ chrome.storage.local.get({ residentData: {} }, result => {
21
+ const residentData = result.residentData || {}
22
+ const tabData = (residentData[tabId] = /* temporary condition */ Array.isArray(residentData[tabId])
23
+ ? {}
24
+ : residentData[tabId] || {})
25
+
26
+ tabData.sceneResidents = sceneResidents
27
+ const history = (tabData.history = tabData.history || [])
28
+
29
+ history.push({
30
+ timestamp,
31
+ componentResidentsCount,
32
+ sceneResidentsCount,
33
+ referenceMapResidentsCount
34
+ })
35
+
36
+ // 데이터가 100개 이상일 경우 오래된 데이터 삭제
37
+ if (history.length > 100) {
38
+ history.shift()
39
+ }
40
+
41
+ chrome.storage.local.set({ residentData }, () => {
42
+ try {
43
+ updateChart(tabData)
44
+ } catch (e) {
45
+ console.error('Error updating chart:', e)
46
+ }
47
+ })
48
+ })
49
+ } catch (e) {
50
+ console.error('Error accessing storage:', e)
51
+ }
52
+ }
53
+ })
54
+
55
+ // 스크립트를 인젝션하는 함수
56
+ function injectScript(file) {
57
+ if (!document.getElementById(file)) {
58
+ const th = document.head
59
+ const s = document.createElement('script')
60
+ s.setAttribute('type', 'text/javascript')
61
+ s.setAttribute('src', chrome.runtime.getURL(file))
62
+ s.setAttribute('id', file) // 중복 인젝션 방지
63
+ th.appendChild(s)
64
+ }
65
+ }
66
+
67
+ injectScript('injected.js')
68
+ } else {
69
+ console.error('No active tab found.')
70
+ }
71
+ })
@@ -0,0 +1,68 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Component Residents Monitor</title>
7
+ <script src="libs/chart.min.js"></script>
8
+ <script src="devtools.js"></script>
9
+ <style>
10
+ body {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 10px;
14
+ align-items: center;
15
+ justify-content: center;
16
+ min-width: 400px;
17
+ min-height: 800px;
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ canvas {
22
+ flex: 1;
23
+ border: 1px solid #000;
24
+ border-radius: 4px;
25
+ width: 100%;
26
+ max-width: 100%;
27
+ max-height: 200px;
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ table {
32
+ flex: 1;
33
+ width: 100%;
34
+ border-collapse: collapse;
35
+ margin-top: 20px;
36
+ overflow: auto;
37
+ }
38
+
39
+ th,
40
+ td {
41
+ padding: 8px;
42
+ text-align: left;
43
+ border-bottom: 1px solid #ddd;
44
+ }
45
+
46
+ th {
47
+ background-color: #f2f2f2;
48
+ }
49
+ </style>
50
+ </head>
51
+ <body>
52
+ <h1>Component Residents Monitor</h1>
53
+ <canvas id="residentChart1"></canvas>
54
+ <canvas id="residentChart2"></canvas>
55
+ <canvas id="residentChart3"></canvas>
56
+
57
+ <!-- sceneResidents 데이터를 보여줄 테이블 -->
58
+ <h2>Scene Residents Data</h2>
59
+ <table id="residentsTable">
60
+ <tr>
61
+ <th>Type</th>
62
+ <th>Up</th>
63
+ <th>Down</th>
64
+ <th>Difference (Up - Down)</th>
65
+ </tr>
66
+ </table>
67
+ </body>
68
+ </html>
@@ -0,0 +1,143 @@
1
+ chrome.devtools.panels.create('Scene', 'icons/icon48.png', 'devtools.html', function (panel) {
2
+ var residentChart1, residentChart2, residentChart3, residentsTable
3
+ var listenerRegistered = false
4
+ var chartsInitialized = false
5
+
6
+ // 차트 업데이트 함수
7
+ const updateCharts = ({ sceneResidents, history }) => {
8
+ residentChart1.data.labels = history.map(entry => entry.timestamp)
9
+ residentChart1.data.datasets[0].data = history.map(entry => entry.componentResidentsCount)
10
+ residentChart1.update()
11
+
12
+ residentChart2.data.labels = history.map(entry => entry.timestamp)
13
+ residentChart2.data.datasets[0].data = history.map(entry => entry.sceneResidentsCount)
14
+ residentChart2.update()
15
+
16
+ residentChart3.data.labels = history.map(entry => entry.timestamp)
17
+ residentChart3.data.datasets[0].data = history.map(entry => entry.referenceMapResidentsCount)
18
+ residentChart3.update()
19
+
20
+ updateResidentsTable(sceneResidents)
21
+ }
22
+
23
+ // sceneResidents 테이블 업데이트 함수
24
+ const updateResidentsTable = sceneResidents => {
25
+ if (typeof sceneResidents !== 'object') {
26
+ return
27
+ }
28
+
29
+ const table = residentsTable
30
+ table.innerHTML = '' // 기존 테이블 내용을 지움
31
+
32
+ // 테이블 헤더 생성
33
+ const headerRow = document.createElement('tr')
34
+ headerRow.innerHTML = '<th>Type</th><th>Up</th><th>Down</th><th>Difference (Up - Down)</th>'
35
+ table.appendChild(headerRow)
36
+
37
+ // sceneResidents 데이터로 테이블 행 생성
38
+ for (const [type, residents] of Object.entries(sceneResidents)) {
39
+ const { up, down } = residents
40
+ const row = document.createElement('tr')
41
+ const difference = up - down
42
+ row.innerHTML = `<td>${type}</td><td>${up}</td><td>${down}</td><td>${difference}</td>`
43
+
44
+ table.appendChild(row)
45
+ }
46
+ }
47
+
48
+ // 차트 초기화 함수
49
+ const resetCharts = window => {
50
+ const createChart = (ctx, label) => {
51
+ return new Chart(ctx, {
52
+ type: 'bar', // Bar chart
53
+ data: {
54
+ labels: [], // X축 라벨을 비워둠으로써 시리즈명을 숨김
55
+ datasets: [
56
+ {
57
+ label: label, // 데이터셋의 레이블 (범례로 표시되지 않음)
58
+ data: [], // 실제 데이터
59
+ backgroundColor: 'rgba(75, 192, 192, 0.5)', // 막대의 색상
60
+ borderColor: 'rgba(75, 192, 192, 1)', // 막대의 테두리 색상
61
+ borderWidth: 1 // 막대의 테두리 두께
62
+ }
63
+ ]
64
+ },
65
+ options: {
66
+ responsive: true,
67
+ animation: false, // 애니메이션 비활성화
68
+ scales: {
69
+ x: {
70
+ display: false, // X축 숨기기 (전체)
71
+ grid: {
72
+ display: false // X축의 격자선 숨기기
73
+ },
74
+ ticks: {
75
+ display: false // X축 틱 마크 숨기기
76
+ }
77
+ },
78
+ y: {
79
+ beginAtZero: true, // Y축이 0에서 시작되도록 설정
80
+ title: {
81
+ display: true,
82
+ text: label // Y축의 레이블
83
+ },
84
+ ticks: {
85
+ stepSize: 1
86
+ }
87
+ }
88
+ },
89
+ plugins: {
90
+ legend: {
91
+ display: false // 범례 숨기기
92
+ }
93
+ }
94
+ }
95
+ })
96
+ }
97
+
98
+ const ctx1 = window.document.getElementById('residentChart1').getContext('2d')
99
+ const ctx2 = window.document.getElementById('residentChart2').getContext('2d')
100
+ const ctx3 = window.document.getElementById('residentChart3').getContext('2d')
101
+
102
+ residentChart1 = createChart(ctx1, 'Component Residents Count')
103
+ residentChart2 = createChart(ctx2, 'Scene Residents Count')
104
+ residentChart3 = createChart(ctx3, 'ReferenceMap Residents Count')
105
+
106
+ residentsTable = window.document.getElementById('residentsTable')
107
+
108
+ chartsInitialized = true
109
+ }
110
+
111
+ // 패널이 처음 열리거나 다시 열릴 때마다 호출
112
+ panel.onShown.addListener(function (window) {
113
+ console.log('DevTools panel shown')
114
+ panelWindow = window
115
+ resetCharts(window) // 패널이 열릴 때 차트를 초기화
116
+
117
+ // 초기 로딩 시 저장된 데이터를 가져옴
118
+ chrome.storage.local.get({ residentData: {} }, result => {
119
+ const tabId = chrome.devtools.inspectedWindow.tabId
120
+ if (tabId && result.residentData[tabId] && result.residentData[tabId].length > 0) {
121
+ updateCharts(result.residentData[tabId])
122
+ } else {
123
+ console.log('No resident data found.')
124
+ }
125
+ })
126
+ })
127
+
128
+ // 메시지 리스너는 한 번만 등록 (중복 방지)
129
+ if (!listenerRegistered) {
130
+ chrome.runtime.onMessage.addListener(message => {
131
+ const tabId = chrome.devtools.inspectedWindow.tabId
132
+
133
+ if (tabId && message.type === 'UPDATE_CHART' && message.tabId === tabId) {
134
+ chrome.storage.local.get({ residentData: {} }, result => {
135
+ if (chartsInitialized && result.residentData[tabId]) {
136
+ updateCharts(result.residentData[tabId])
137
+ }
138
+ })
139
+ }
140
+ })
141
+ listenerRegistered = true // 리스너가 중복 등록되지 않도록 설정
142
+ }
143
+ })
@@ -0,0 +1,25 @@
1
+ function logComponentResidents() {
2
+ const componentResidentsCount = window.scene.Component?.residentsCount || 0
3
+ const sceneResidents = window.scene.Component?.residents || {}
4
+ const sceneResidentsCount = window.scene.Scene?.residentsCount || 0
5
+ const referenceMapResidentsCount = window.scene.ReferenceMap?.residentsCount || 0
6
+ const timestamp = new Date().toISOString()
7
+
8
+ window.postMessage(
9
+ {
10
+ type: 'RESIDENT_COUNT',
11
+ timestamp,
12
+ componentResidentsCount,
13
+ sceneResidentsCount,
14
+ sceneResidents,
15
+ referenceMapResidentsCount
16
+ },
17
+ '*'
18
+ )
19
+ }
20
+
21
+ setTimeout(() => {
22
+ if (window.scene) {
23
+ setInterval(logComponentResidents, 5000)
24
+ }
25
+ }, 5000)