세션 고급 설정
YaksokSession은 기본적인 stdout, stderr 외에도 다양한 고급 옵션을 제공합니다. 이 문서에서는 SessionConfig의 모든 설정 옵션을 설명합니다.
SessionConfig 전체 구조
import { YaksokSession } from '@dalbit-yaksok/core'
const session = new YaksokSession({
stdout: console.log,
stdin: async () => '',
stderr: console.error,
flags: {},
events: {},
signal: null,
threadYieldInterval: 300,
stepUnit: null,
canRunNode: null,
})stdin: 입력받기 처리
입력받기 명령어가 호출되었을 때 실행되는 함수입니다. 사용자에게 질문을 표시하고, 입력받은 문자열을 반환합니다.
const session = new YaksokSession({
stdin: async (question?: string) => {
// 브라우저 환경
return prompt(question ?? '입력해주세요') ?? ''
},
})
session.addModule(
'main',
`
이름 = 입력받기
"안녕, " + 이름 보여주기
`,
)
await session.runModule('main')기본값은 async () => ''으로, 아무 설정 없이 입력받기를 사용하면 빈 문자열이 반환됩니다.
signal: 실행 중단 (AbortSignal)
AbortSignal을 사용하여 실행 중인 코드를 외부에서 중단할 수 있습니다. 중단된 경우 runModule의 결과는 reason: 'aborted'를 반환합니다.
const controller = new AbortController()
const session = new YaksokSession({
signal: controller.signal,
})
session.addModule(
'main',
`
숫자 = 0
반복
숫자 = 숫자 + 1
숫자 보여주기
만약 숫자 > 1000000 이면
반복 그만
`,
)
// 3초 후 실행 중단
setTimeout(() => {
controller.abort()
}, 3000)
const results = await session.runModule('main')
const result = results.get('main')!
if (result.reason === 'aborted') {
console.log('실행이 중단되었습니다.')
}RunModuleResult 타입
runModule은 실행 결과에 따라 다른 reason 값을 반환합니다:
| reason | 설명 | 추가 속성 |
|---|---|---|
'finish' | 성공적으로 실행 완료 | codeFile |
'aborted' | AbortSignal에 의해 중단됨 | codeFile |
'error' | 약속 오류 발생 | error |
'validation' | 유효성 검사 실패 | errors |
threadYieldInterval: 브라우저 제어권 양보 주기
명령어 실행을 잠깐 멈추고 브라우저에게 제어권을 넘기는 주기입니다. 기본값은 300입니다.
브라우저 환경에서 약속 코드가 실행되는 동안 UI가 멈추지 않도록, 일정 간격마다 setTimeout(0)을 통해 이벤트 루프에 제어권을 돌려줍니다. 값이 작을수록 UI 응답성이 좋아지지만, 실행 속도는 느려집니다.
const session = new YaksokSession({
threadYieldInterval: 100, // 100번의 tick마다 제어권 양보
})stepUnit: 디버거 단계 실행 단위
디버거의 단계별 실행에서 어떤 종류의 노드를 기준으로 멈출지 설정합니다. 기본값은 null입니다.
session.stepByStep = true와 함께 사용하면, 지정된 노드 타입이 실행될 때마다 일시 정지됩니다.
import { Executable, YaksokSession } from '@dalbit-yaksok/core'
const session = new YaksokSession({
stepUnit: Executable, // Executable 노드마다 멈춤
})
session.stepByStep = truecanRunNode: 노드 실행 전 확인 콜백
다음 노드를 실행해도 될지 사용자에게 확인을 요구하는 콜백 함수입니다. false를 반환하면 해당 노드의 실행을 건너뜁니다. 기본값은 null입니다.
import { YaksokSession } from '@dalbit-yaksok/core'
const session = new YaksokSession({
canRunNode: async (scope, node) => {
// 특정 조건에서 실행을 중단
console.log(`실행 예정: ${node.constructor.name}`)
return true // true를 반환하면 실행 계속
},
})이 콜백은 반복문의 각 반복 등에서도 호출되므로, 세밀한 실행 제어가 가능합니다.
validate(): 유효성 검사
session.validate() 메서드를 사용하면 코드를 실행하지 않고 유효성 검사만 수행할 수 있습니다. 문법 오류, 누락된 멈춤 코드 등의 문제를 미리 확인할 수 있습니다.
const session = new YaksokSession()
session.addModule('main', `변수 = 1 +`)
const errors = session.validate('main')
for (const [fileName, errorList] of errors.entries()) {
for (const error of errorList) {
console.log(`[${fileName}] ${error.message}`)
}
}validate()는 선택적으로 파일 이름을 받아 특정 모듈만 검사할 수 있으며, 인자 없이 호출하면 등록된 모든 모듈을 검사합니다.
// 특정 모듈만 검사
const errors = session.validate('main')
// 모든 모듈 검사
const allErrors = session.validate()runModule은 실행 전에 자동으로 validate()를 호출합니다. 유효성 검사
오류가 있으면 코드를 실행하지 않고 reason: 'validation' 결과를 반환합니다. :::
flags: 기능 플래그
기능 플래그에 대한 자세한 내용은 8. 기능 플래그 문서를 참조하세요.
events: 이벤트 구독
이벤트 구독에 대한 자세한 내용은 7. 실행 제어: 일시 정지하고 다시 시작하기 문서를 참조하세요.