scordi-extension 1.14.1
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/README.md +243 -0
- package/dist/.vite/manifest.json +67 -0
- package/dist/assets/DataExtractBlock-B7AuVonx.js +6 -0
- package/dist/assets/index-B9PKMhAi.js +6 -0
- package/dist/assets/index-CMlx_xZE.css +1 -0
- package/dist/assets/index-CZjAbH8z.js +1 -0
- package/dist/assets/index-DkFIvNAm.css +1 -0
- package/dist/assets/index-r5QRyJ4m.js +1 -0
- package/dist/assets/index.html-BIbPySIb.js +74 -0
- package/dist/assets/index.html-cr-_Qdxq.js +49 -0
- package/dist/assets/index.ts-BqxJYCmp.js +160 -0
- package/dist/assets/internal-messages-Drf0Gb9U.js +1 -0
- package/dist/assets/loading-page-1924caaa.js +51 -0
- package/dist/assets/main.tsx-BEyI95mZ.js +2 -0
- package/dist/assets/main.tsx-BKzdlur-.js +2 -0
- package/dist/assets/main.tsx-loader-BYP9L25W.js +13 -0
- package/dist/assets/main.tsx-loader-FYb0LhDu.js +13 -0
- package/dist/assets/schemas-C8r0jYHO.js +21 -0
- package/dist/blocks/AiParseDataBlock.d.ts +183 -0
- package/dist/blocks/AiParseDataBlock.d.ts.map +1 -0
- package/dist/blocks/ClearValueFormBlock.d.ts +49 -0
- package/dist/blocks/ClearValueFormBlock.d.ts.map +1 -0
- package/dist/blocks/DataExtractBlock.d.ts +23 -0
- package/dist/blocks/DataExtractBlock.d.ts.map +1 -0
- package/dist/blocks/ElementExistsBlock.d.ts +45 -0
- package/dist/blocks/ElementExistsBlock.d.ts.map +1 -0
- package/dist/blocks/EventClickBlock.d.ts +67 -0
- package/dist/blocks/EventClickBlock.d.ts.map +1 -0
- package/dist/blocks/FetchApiBlock.d.ts +49 -0
- package/dist/blocks/FetchApiBlock.d.ts.map +1 -0
- package/dist/blocks/GetAttributeValueBlock.d.ts +49 -0
- package/dist/blocks/GetAttributeValueBlock.d.ts.map +1 -0
- package/dist/blocks/GetElementDataBlock.d.ts +88 -0
- package/dist/blocks/GetElementDataBlock.d.ts.map +1 -0
- package/dist/blocks/GetTextBlock.d.ts +85 -0
- package/dist/blocks/GetTextBlock.d.ts.map +1 -0
- package/dist/blocks/GetValueFormBlock.d.ts +49 -0
- package/dist/blocks/GetValueFormBlock.d.ts.map +1 -0
- package/dist/blocks/KeypressBlock.d.ts +31 -0
- package/dist/blocks/KeypressBlock.d.ts.map +1 -0
- package/dist/blocks/SaveAssetsBlock.d.ts +45 -0
- package/dist/blocks/SaveAssetsBlock.d.ts.map +1 -0
- package/dist/blocks/ScrollBlock.d.ts +65 -0
- package/dist/blocks/ScrollBlock.d.ts.map +1 -0
- package/dist/blocks/SetValueFormBlock.d.ts +53 -0
- package/dist/blocks/SetValueFormBlock.d.ts.map +1 -0
- package/dist/blocks/WaitBlock.d.ts +19 -0
- package/dist/blocks/WaitBlock.d.ts.map +1 -0
- package/dist/blocks/index.d.ts +667 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/types.d.ts +53 -0
- package/dist/blocks/types.d.ts.map +1 -0
- package/dist/content/elements/finders/CssSelector.d.ts +8 -0
- package/dist/content/elements/finders/CssSelector.d.ts.map +1 -0
- package/dist/content/elements/finders/ElementSelector.d.ts +6 -0
- package/dist/content/elements/finders/ElementSelector.d.ts.map +1 -0
- package/dist/content/elements/finders/IframeSelector.d.ts +6 -0
- package/dist/content/elements/finders/IframeSelector.d.ts.map +1 -0
- package/dist/content/elements/finders/ShadowDOMSelector.d.ts +20 -0
- package/dist/content/elements/finders/ShadowDOMSelector.d.ts.map +1 -0
- package/dist/content/elements/finders/XPathFinder.d.ts +6 -0
- package/dist/content/elements/finders/XPathFinder.d.ts.map +1 -0
- package/dist/content/elements/index.d.ts +13 -0
- package/dist/content/elements/index.d.ts.map +1 -0
- package/dist/content/elements/utils/CSSSelectorGenerator.d.ts +23 -0
- package/dist/content/elements/utils/CSSSelectorGenerator.d.ts.map +1 -0
- package/dist/content/elements/utils/XPathGenerator.d.ts +25 -0
- package/dist/content/elements/utils/XPathGenerator.d.ts.map +1 -0
- package/dist/logo.png +0 -0
- package/dist/manifest.json +58 -0
- package/dist/public/logo.png +0 -0
- package/dist/sdk/EightGClient.d.ts +18 -0
- package/dist/sdk/EightGClient.d.ts.map +1 -0
- package/dist/sdk/errors.d.ts +10 -0
- package/dist/sdk/errors.d.ts.map +1 -0
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +7904 -0
- package/dist/sdk/logo.png +0 -0
- package/dist/sdk/types.d.ts +109 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/service-worker-loader.js +1 -0
- package/dist/src/blocks/AiParseDataBlock.ts.js +101 -0
- package/dist/src/blocks/ClearValueFormBlock.ts.js +55 -0
- package/dist/src/blocks/DataExtractBlock.ts.js +28 -0
- package/dist/src/blocks/ElementExistsBlock.ts.js +26 -0
- package/dist/src/blocks/EventClickBlock.ts.js +143 -0
- package/dist/src/blocks/FetchApiBlock.ts.js +50 -0
- package/dist/src/blocks/GetAttributeValueBlock.ts.js +33 -0
- package/dist/src/blocks/GetElementDataBlock.ts.js +114 -0
- package/dist/src/blocks/GetTextBlock.ts.js +152 -0
- package/dist/src/blocks/GetValueFormBlock.ts.js +52 -0
- package/dist/src/blocks/KeypressBlock.ts.js +89 -0
- package/dist/src/blocks/SaveAssetsBlock.ts.js +35 -0
- package/dist/src/blocks/ScrollBlock.ts.js +111 -0
- package/dist/src/blocks/SetValueFormBlock.ts.js +56 -0
- package/dist/src/blocks/WaitBlock.ts.js +24 -0
- package/dist/src/blocks/index.ts.js +163 -0
- package/dist/src/blocks/types.ts.js +11 -0
- package/dist/src/content/elements/finders/CssSelector.ts.js +51 -0
- package/dist/src/content/elements/finders/ElementSelector.ts.js +20 -0
- package/dist/src/content/elements/finders/IframeSelector.ts.js +32 -0
- package/dist/src/content/elements/finders/ShadowDOMSelector.ts.js +38 -0
- package/dist/src/content/elements/finders/XPathFinder.ts.js +32 -0
- package/dist/src/content/elements/index.ts.js +26 -0
- package/dist/src/content/elements/utils/CSSSelectorGenerator.ts.js +72 -0
- package/dist/src/content/elements/utils/XPathGenerator.ts.js +62 -0
- package/dist/src/content/handler/ExternalMessageHandler.ts.js +78 -0
- package/dist/src/content/handler/InternalMessageHandler.ts.js +18 -0
- package/dist/src/content/kernel/MessageKernel.ts.js +83 -0
- package/dist/src/content/main.tsx-loader.js +22 -0
- package/dist/src/content/main.tsx.js +13 -0
- package/dist/src/content/utils/index.ts.js +1 -0
- package/dist/src/content/utils/synchronizedLock.ts.js +35 -0
- package/dist/src/popup/index.html +11 -0
- package/dist/src/types/internal-messages.ts.js +15 -0
- package/dist/types/external-messages.d.ts +29 -0
- package/dist/types/external-messages.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/internal-messages.d.ts +58 -0
- package/dist/types/internal-messages.d.ts.map +1 -0
- package/dist/vendor/.vite-deps-chunk-PR4QN5HX.js__v--ba9031c0.js +42 -0
- package/dist/vendor/.vite-deps-jsonata.js__v--ba9031c0.js +5761 -0
- package/dist/vendor/.vite-deps-zod.js__v--ba9031c0.js +12651 -0
- package/dist/vendor/crx-client-port.js +66 -0
- package/dist/vendor/crx-client-preamble.js +4 -0
- package/dist/vendor/react-refresh.js +670 -0
- package/dist/vendor/vite-client.js +1098 -0
- package/dist/vendor/vite-dist-client-env.mjs.js +19 -0
- package/dist/vendor/webcomponents-custom-elements.js +47 -0
- package/package.json +70 -0
package/README.md
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# 8G Extension 에 오신걸 환영합니다!
|
|
2
|
+
|
|
3
|
+
웹에서 데이터를 안정적으로 수집/자동화하기 위한 Chrome 확장 프로그램과 브라우저용 SDK를 제공합니다. 이 README는 실제 프로젝트 구조와 SDK 사용법, 빌드/배포 방법을 한곳에 정리합니다.
|
|
4
|
+
|
|
5
|
+
## How to Run
|
|
6
|
+
|
|
7
|
+
1) 의존성 설치
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install
|
|
11
|
+
# 또는
|
|
12
|
+
pnpm install
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
2) 개발 서버 실행(확장 개발)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run dev
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3) 크롬에서 로컬 확장 로딩
|
|
22
|
+
|
|
23
|
+
- 주소창에 `chrome://extensions/` 접속 → 우상단 "개발자 모드" 활성화
|
|
24
|
+
- "압축 해제된 확장 프로그램을 로드" 클릭 후 `dist` 디렉터리 선택
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
4) SDK 빌드(패키지 용)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run build
|
|
31
|
+
# SDK: vite.sdk.config.ts 기반 번들 + ts 타입 생성(tsconfig.sdk.json)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
5) 확장 번들(Zip) 생성
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run build:extension
|
|
38
|
+
# release/crx-8g-extension-<version>.zip 생성
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 개발 스크립트
|
|
42
|
+
|
|
43
|
+
`package.json`의 주요 스크립트 요약:
|
|
44
|
+
|
|
45
|
+
- `dev`: Vite 개발 서버(확장) 실행
|
|
46
|
+
- `build`: SDK 번들 빌드(es 모듈, 타입 포함)
|
|
47
|
+
- `build:extension`: 확장 프로그램 빌드 및 zip 패키징
|
|
48
|
+
- `test`, `test:run`, `test:ui`: Vitest 테스트 실행
|
|
49
|
+
- `lint`, `lint:fix`: ESLint 검사/수정
|
|
50
|
+
- `format`, `format:check`: Prettier 포맷팅
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## 전체적인 구조 소개
|
|
54
|
+
`8g-extension`은 다음을 포함합니다.
|
|
55
|
+
- **Chrome Extension**: `content script`, `background service worker`, `popup` UI 구성
|
|
56
|
+
- **브라우저/번들러용 SDK**: 웹페이지에서 확장과 메시지로 통신하여 블록/워크플로우를 실행
|
|
57
|
+
|
|
58
|
+

|
|
59
|
+
|
|
60
|
+
## 크롬 확장 개발/로딩
|
|
61
|
+
|
|
62
|
+
- 매니페스트는 `manifest.config.ts`에서 CRXJS `defineManifest`로 선언합니다.
|
|
63
|
+
- `background` 엔트리는 `src/background/index.ts`이며, 내부에서 `BackgroundManager`가 메시지를 처리합니다.
|
|
64
|
+
- `content_scripts` 엔트리는 `src/content/main.tsx`로, 내부/외부 메시지 커널을 초기화합니다.
|
|
65
|
+
- 개발 시 `npm run dev`로 빌드·감시 후 `chrome://extensions/`에서 `dist`를 다시 로드하세요.
|
|
66
|
+
|
|
67
|
+
## SDK 사용 가이드(요약)
|
|
68
|
+
|
|
69
|
+
**중요**: v2.x부터 **모든 블록 실행은 워크플로우를 통해서만** 가능합니다.
|
|
70
|
+
|
|
71
|
+
패키지 설치 후 SDK를 초기화하고 워크플로우를 실행할 수 있습니다.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { EightGClient } from '8g-extension';
|
|
75
|
+
|
|
76
|
+
const client = new EightGClient();
|
|
77
|
+
await client.checkExtension();
|
|
78
|
+
|
|
79
|
+
// 단일 블록도 워크플로우로 실행
|
|
80
|
+
const simpleWorkflow = {
|
|
81
|
+
version: '1.0',
|
|
82
|
+
start: 'getTitle',
|
|
83
|
+
steps: [
|
|
84
|
+
{
|
|
85
|
+
id: 'getTitle',
|
|
86
|
+
block: {
|
|
87
|
+
name: 'get-text',
|
|
88
|
+
selector: '#title',
|
|
89
|
+
findBy: 'cssSelector',
|
|
90
|
+
option: {},
|
|
91
|
+
useTextContent: true
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const result1 = await client.collectWorkflow({
|
|
98
|
+
targetUrl: location.href,
|
|
99
|
+
workflow: simpleWorkflow
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// 복잡한 워크플로우: 분기, 조건, 순차 실행
|
|
103
|
+
const complexWorkflow = {
|
|
104
|
+
version: '1.0',
|
|
105
|
+
start: 'readStatus',
|
|
106
|
+
steps: [
|
|
107
|
+
{
|
|
108
|
+
id: 'readStatus',
|
|
109
|
+
block: { name: 'get-text', selector: '.status', findBy: 'cssSelector', useTextContent: true, option: {} },
|
|
110
|
+
switch: [
|
|
111
|
+
{ when: { equals: { left: "$.steps.readStatus.result.data", right: 'OK' } }, next: 'go' }
|
|
112
|
+
],
|
|
113
|
+
next: 'retry'
|
|
114
|
+
},
|
|
115
|
+
{ id: 'go', block: { name: 'event-click', selector: '.go', findBy: 'cssSelector', option: {} }, delayAfterMs: 300, next: 'done' },
|
|
116
|
+
{ id: 'retry', block: { name: 'event-click', selector: '.retry', findBy: 'cssSelector', option: {} }, delayAfterMs: 300, next: 'done' },
|
|
117
|
+
{ id: 'done', block: { name: 'get-text', selector: '.result', findBy: 'cssSelector', option: { waitForSelector: true } } },
|
|
118
|
+
],
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const result2 = await client.collectWorkflow({
|
|
122
|
+
targetUrl: location.href,
|
|
123
|
+
workflow: complexWorkflow,
|
|
124
|
+
closeTabAfterCollection: true,
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
자세한 사용법, JSON 스키마/조건식/바인딩, 실행 규칙은 아래 문서를 참고하세요.
|
|
129
|
+
|
|
130
|
+
- 워크플로우 가이드: `WORKFLOW_EXECUTION_ARCHITECTURE.md`
|
|
131
|
+
- 블록 아키텍처: `BLOCK_EXECUTION_ARCHITECTURE.md`
|
|
132
|
+
|
|
133
|
+
## 프로젝트 구조
|
|
134
|
+
|
|
135
|
+
- `manifest.config.ts`: MV3 매니페스트(permissions/host_permissions, content/background 설정)
|
|
136
|
+
- `src/background/`:
|
|
137
|
+
- `index.ts`: 백그라운드 초기화
|
|
138
|
+
- `BackgroundManager.ts`: 탭 생성/정리, 블록/워크플로우 실행 요청 처리
|
|
139
|
+
- `WorkflowRunner.ts`: 워크플로우 실행 로직
|
|
140
|
+
- `src/content/main.tsx`: 메시지 커널 및 내부/외부 핸들러 초기화
|
|
141
|
+
- `src/blocks/*`: 블록 정의/테스트
|
|
142
|
+
- `src/sdk/*`: `EightGClient`, 에러/타입, `index.ts`(엔트리)
|
|
143
|
+
- `vite.config.ts`: 확장 빌드용 Vite 설정(CRXJS/zip)
|
|
144
|
+
- `vite.sdk.config.ts`: SDK 빌드용 Vite 설정(ESM, 외부 의존 지정)
|
|
145
|
+
- `vitest.config.ts`: 테스트 설정
|
|
146
|
+
|
|
147
|
+
## 전체 아키텍처와 실행 흐름
|
|
148
|
+
|
|
149
|
+
### 구성 요소 개요
|
|
150
|
+
- **SDK (`src/sdk/*`)**: 웹페이지(JavaScript)에서 사용하는 클라이언트. 확장과 `window.postMessage` → Content Script → Background 메시지로 통신합니다. 대표 엔트리: `EightGClient`.
|
|
151
|
+
- **Content Script (`src/content/*`)**: 웹페이지와 확장 내부를 잇는 브리지. 외부/내부 메시지를 라우팅하는 `MessageKernel`, `ExternalMessageHandler`, `InternalMessageHandler`가 핵심입니다.
|
|
152
|
+
- **Background (`src/background/*`)**: 탭 생성/제어, 블록 실행 지휘, 워크플로우 런 실행 등의 오케스트레이션을 담당합니다. `BackgroundManager`, `TabManager`, `WorkflowRunner`가 핵심입니다.
|
|
153
|
+
- **Blocks (`src/blocks/*`)**: 실제 DOM 상호작용/데이터 수집을 수행하는 도메인 유닛. 블록별 `validate*` + `handler*` 조합으로 동작하며, `BlockHandler.executeBlock`이 진입점입니다.
|
|
154
|
+
- **Popup (`src/popup/*`)**: 데모/수동 실행 UI.
|
|
155
|
+
|
|
156
|
+
### 연결 관계(요약 다이어그램)
|
|
157
|
+
```
|
|
158
|
+
Webpage(JS) ─ SDK(EightGClient)
|
|
159
|
+
│ │ window.postMessage('8G_*')
|
|
160
|
+
└────────────▼─────────────────────────────
|
|
161
|
+
Content Script
|
|
162
|
+
ExternalMessageHandler ↔ MessageKernel ↔ InternalMessageHandler
|
|
163
|
+
│ │
|
|
164
|
+
│ chrome.runtime.sendMessage
|
|
165
|
+
▼ │
|
|
166
|
+
Background ──────────┘
|
|
167
|
+
BackgroundManager ↔ TabManager ↔ WorkflowRunner
|
|
168
|
+
│
|
|
169
|
+
executeBlock(→ Content Script → BlockHandler → 블록 핸들러)
|
|
170
|
+
│
|
|
171
|
+
└── 결과 집계 후 응답(역방향 경로로 반환)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 요청 흐름: 워크플로우 실행 (`collectWorkflow`)
|
|
175
|
+
1. 웹페이지에서 SDK `EightGClient.collectWorkflow` 호출 → `window.postMessage({ type: '8G_COLLECT_WORKFLOW', ... })` 전송
|
|
176
|
+
2. Content Script의 `ExternalMessageHandler`가 수신 → Background로 `COLLECT_WORKFLOW_NEW_TAB` 메시지 전달
|
|
177
|
+
3. Background `WorkflowService`가 탭 생성 후, 워크플로우 실행 시작
|
|
178
|
+
- `WorkflowRunner`가 `start` 스텝부터 시작하여 `steps`를 따라 진행
|
|
179
|
+
- 각 스텝에서 `when` 조건 평가, `retry` 재시도, `timeoutMs` 타임아웃 처리
|
|
180
|
+
- 블록 실행은 `TabManager.executeBlock` → 대상 탭의 Content Script로 `ExecuteBlockMessage` 송신
|
|
181
|
+
- Content Script `MessageKernel.executeBlock` → `BlockHandler` 호출 → 블록별 `validate*` 후 `handler*` 실행
|
|
182
|
+
4. 각 스텝의 결과(성공/실패/시각/메시지)를 기록하며 다음 스텝으로 진행 (`next`, `switch`, `onSuccess/onFailure`)
|
|
183
|
+
5. 워크플로우 완료 시 모든 스텝 로그를 Content Script로 전달
|
|
184
|
+
6. Content Script가 웹페이지로 `8G_COLLECT_RESPONSE`를 `window.postMessage`하여 SDK가 Promise resolve
|
|
185
|
+
|
|
186
|
+
참고: `delayAfterMs`로 스텝 간 대기 시간을 조정할 수 있습니다.
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
### 블록 시스템 구조
|
|
190
|
+
- 공통 형태(`src/blocks/types.ts`)
|
|
191
|
+
- `Block`: `name`, `selector`, `findBy('cssSelector'|'xpath')`, `option { waitForSelector?, waitSelectorTimeout?, multiple? }`
|
|
192
|
+
- `BlockResult<T>`: `data`, `hasError?`, `message?`
|
|
193
|
+
- 실행 파이프라인
|
|
194
|
+
- `BlockHandler.executeBlock(block)` → 블록 이름으로 분기 → `validate*`로 스키마 검증 → `handler*`에서 DOM 상호작용/추출 실행
|
|
195
|
+
- 셀렉터 해석과 탐색은 `src/content/elements/*`의 `findElement`와 `XPathSelector/CssSelector`가 담당
|
|
196
|
+
- 지원 블록(요약)
|
|
197
|
+
- `get-text`: 텍스트 추출(정규식/`textContent`/태그 포함 옵션)
|
|
198
|
+
- `attribute-value`: 속성 값 추출(단일/다중)
|
|
199
|
+
- `get-value-form` / `set-value-form` / `clear-value-form`: 폼 값 읽기/설정/초기화
|
|
200
|
+
- `element-exists`: 존재 여부 확인(Boolean)
|
|
201
|
+
- `event-click`: 요소 클릭(다중 요소 + 텍스트 필터 선택 가능)
|
|
202
|
+
- `save-assets`: 이미지/리소스 수집 및 저장
|
|
203
|
+
- `get-element-data`: 텍스트/속성/선택자/XPath 등 복합 데이터 추출
|
|
204
|
+
- `scroll`: 페이지 스크롤(toElement, toBottom, byDistance, untilLoaded)
|
|
205
|
+
- `keypress`: 키보드 입력 시뮬레이션(Escape, Enter 등, modifier 키 지원)
|
|
206
|
+
- `wait`: 지정 시간 대기(ms)
|
|
207
|
+
- `fetch-api`: 외부 API 호출(GET, POST 등, CORS 제약 없음)
|
|
208
|
+
- `ai-parse-data`: AI 기반 데이터 파싱(OpenAI, 스키마 정의 필요)
|
|
209
|
+
|
|
210
|
+
### SDK 상세(브라우저에서 사용)
|
|
211
|
+
- `EightGClient.checkExtension()`
|
|
212
|
+
- 확장 주입 여부 확인. 내부적으로 `8G_EXTENSION_CHECK` 메시지를 사용
|
|
213
|
+
- 타임아웃: 5초
|
|
214
|
+
- `EightGClient.collectWorkflow({ targetUrl, workflow, closeTabAfterCollection?, activateTab? })`
|
|
215
|
+
- **유일한 블록 실행 방법** - 모든 블록은 워크플로우를 통해서만 실행
|
|
216
|
+
- `workflow`: `{ version, start, steps[] }` 형식
|
|
217
|
+
- 각 스텝: `{ id, block?, when?, switch?, next?, onSuccess?, onFailure?, retry?, timeoutMs?, delayAfterMs?, setVars? }`
|
|
218
|
+
- 반환: `{ success, steps, error?, timestamp, targetUrl }` (스텝별 성공/실패/메시지/시각/재시도 횟수 포함)
|
|
219
|
+
- 타임아웃: 기본 60초
|
|
220
|
+
|
|
221
|
+
### 주요 내부 모듈과 연결 관계
|
|
222
|
+
- `src/content/kernel/MessageKernel.ts`: Background 통신, 블록 실행(락 관리 포함), 런타임 메시지 처리
|
|
223
|
+
- `src/content/handler/ExternalMessageHandler.ts`: 웹페이지(Window) ↔ Content Script 브리지
|
|
224
|
+
- `src/content/handler/InternalMessageHandler.ts`: Background ↔ Content Script 브리지
|
|
225
|
+
- `src/background/BackgroundManager.ts`: 메시지 라우팅 담당 (워크플로우, CDP, AI 파싱)
|
|
226
|
+
- `src/background/WorkflowService.ts`: 워크플로우 실행 전담
|
|
227
|
+
- `src/background/WorkflowRunner.ts`: 워크플로우 루프, 분기/바인딩/재시도/타임아웃 처리
|
|
228
|
+
- `src/background/CdpService.ts`: Chrome DevTools Protocol 처리 (클릭, 키보드 입력)
|
|
229
|
+
- `src/background/ApiService.ts`: 외부 API 요청 처리 (fetch, CORS 우회)
|
|
230
|
+
- `src/background/AiParsingService.ts`: AI 파싱 처리 (OpenAI 연동)
|
|
231
|
+
- `src/background/TabManager.ts`: 탭 생성/활성화, 특정 탭에 블록 실행 위임
|
|
232
|
+
- `src/blocks/index.ts`: `BlockHandler.executeBlock` 진입점 (블록별 validate/handler 매핑)
|
|
233
|
+
- `src/content/elements/*`: CSS/XPath 셀렉터 빌드/탐색, 대기 옵션 처리
|
|
234
|
+
|
|
235
|
+
### 응답과 에러 처리
|
|
236
|
+
- 모든 경로는 에러 시 `$isError`(내부), 또는 SDK 측 `{ success: false, error }` 형태로 표준화
|
|
237
|
+
- SDK는 응답 메시지(`8G_COLLECT_RESPONSE`)를 `requestId`로 매칭하여 Promise를 해제
|
|
238
|
+
- 공통 타임아웃/통신 오류는 `EightGError`로 래핑됨
|
|
239
|
+
|
|
240
|
+
### 추가 참고 문서
|
|
241
|
+
- **워크플로우 가이드** (필수): `WORKFLOW_EXECUTION_ARCHITECTURE.md` - 워크플로우 실행 방법, JSON 스키마, 조건식, 바인딩
|
|
242
|
+
- **블록 카탈로그**: `BLOCKS.md` - 모든 블록의 상세 사용법과 예시
|
|
243
|
+
- **아키텍처 문서**: `BLOCK_EXECUTION_ARCHITECTURE.md` - 내부 구조와 아키텍처 변경사항
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"../../../../../@crx/manifest": {
|
|
3
|
+
"file": "assets/crx-manifest.js-DZY6Y38P.js",
|
|
4
|
+
"name": "crx-manifest.js",
|
|
5
|
+
"src": "../../../../../@crx/manifest",
|
|
6
|
+
"isEntry": true
|
|
7
|
+
},
|
|
8
|
+
"_internal-messages-Drf0Gb9U.js": {
|
|
9
|
+
"file": "assets/internal-messages-Drf0Gb9U.js",
|
|
10
|
+
"name": "internal-messages"
|
|
11
|
+
},
|
|
12
|
+
"_main.tsx-loader-FYb0LhDu.js": {
|
|
13
|
+
"file": "assets/main.tsx-loader-FYb0LhDu.js",
|
|
14
|
+
"src": "_main.tsx-loader-FYb0LhDu.js"
|
|
15
|
+
},
|
|
16
|
+
"_schemas-C8r0jYHO.js": {
|
|
17
|
+
"file": "assets/schemas-C8r0jYHO.js",
|
|
18
|
+
"name": "schemas"
|
|
19
|
+
},
|
|
20
|
+
"src/background/index.ts": {
|
|
21
|
+
"file": "assets/index.ts-BqxJYCmp.js",
|
|
22
|
+
"name": "index.ts",
|
|
23
|
+
"src": "src/background/index.ts",
|
|
24
|
+
"isEntry": true,
|
|
25
|
+
"imports": [
|
|
26
|
+
"_internal-messages-Drf0Gb9U.js",
|
|
27
|
+
"_schemas-C8r0jYHO.js"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"src/blocks/index.ts": {
|
|
31
|
+
"file": "assets/index-B9PKMhAi.js",
|
|
32
|
+
"name": "index",
|
|
33
|
+
"src": "src/blocks/index.ts",
|
|
34
|
+
"isDynamicEntry": true,
|
|
35
|
+
"imports": [
|
|
36
|
+
"_schemas-C8r0jYHO.js"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"src/content/main.tsx": {
|
|
40
|
+
"file": "assets/main.tsx-BEyI95mZ.js",
|
|
41
|
+
"name": "main.tsx",
|
|
42
|
+
"src": "src/content/main.tsx",
|
|
43
|
+
"isEntry": true,
|
|
44
|
+
"imports": [
|
|
45
|
+
"_internal-messages-Drf0Gb9U.js"
|
|
46
|
+
],
|
|
47
|
+
"dynamicImports": [
|
|
48
|
+
"src/blocks/index.ts",
|
|
49
|
+
"src/content/utils/index.ts"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"src/content/utils/index.ts": {
|
|
53
|
+
"file": "assets/index-r5QRyJ4m.js",
|
|
54
|
+
"name": "index",
|
|
55
|
+
"src": "src/content/utils/index.ts",
|
|
56
|
+
"isDynamicEntry": true
|
|
57
|
+
},
|
|
58
|
+
"src/popup/index.html": {
|
|
59
|
+
"file": "assets/index.html-cr-_Qdxq.js",
|
|
60
|
+
"name": "index.html",
|
|
61
|
+
"src": "src/popup/index.html",
|
|
62
|
+
"isEntry": true,
|
|
63
|
+
"css": [
|
|
64
|
+
"assets/index-DkFIvNAm.css"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|