본문으로 건너뛰기

실험의 데이터 ​

값은 실행을 따라 이동합니다. 매개변수가 대상을 고르고, 한 응답의 필드가 다음 요청의 헤더가 되며, 생성된 id가 명령으로 나갔다가 검사로 돌아옵니다. 이 페이지에서는 그런 값이 어디에서 오는지, 필드가 그것을 어떻게 사용하는지 다룹니다.

출처쓰는 법설정하는 곳
매개변수{{api}} 또는 {{params.api}}매개변수 패널, 프로필, 값 지정 실행…
변수{{token}} 또는 {{vars.token}}실행 중의 노드: 값 추출, 대기, 회신을 기다리는 전송
시크릿{{secret.API_TOKEN}}컴퓨터의 자격 증명 저장소, 또는 서버의 환경과 파일
내장 값{{run.seed}}, {{now.iso}}, {{counter}}실행 자체
생성기{{uuid}}, {{random_int(1, 100)}}실행의 시드에서 뽑음

매개변수 ​

매개변수는 템플릿 필드라면 어디든 쓸 수 있는 이름 붙은 텍스트 값입니다. 대상을 매개변수에 두면 주소가 바뀔 때 노드마다 고치는 대신 한 번만 고치면 됩니다.

매개변수 추가하기 ​

  1. 편집기 도구 모음에서 매개변수 ({ })를 누릅니다.
  2. 기본값 탭에서 매개변수 추가을 누릅니다.
  3. 이름과 값를 입력합니다. 예를 들어 api와 http://127.0.0.1:8080입니다.
  4. 노드의 필드에 {{api}}/login을 씁니다.

패널에서의 모든 변경은 실험의 편집입니다. 실험과 함께 저장되며, 다른 편집과 마찬가지로 Ctrl+Z로 되돌립니다.

규칙 ​

규칙한도
이름글자나 _로 시작하고, 그다음은 글자, 숫자, _
예약어vars, params, secret, run, node, now, uuid, counter, random_int, random_float, pick
실험당 매개변수64
값 하나의 크기64 KiB
이름고유해야 하며, 변수는 매개변수의 이름을 가질 수 없습니다

값은 순수 텍스트이며 쓴 그대로 삽입됩니다. 값 안의 {{…}}는 해석되지 않습니다. 필드가 매개변수의 일부를 요청하면({{config.ports[0]}}) 값을 JSON으로 읽습니다. JSON이 아닌 값에는 일부가 없습니다.

이름이 잘못되었거나, 예약어이거나, 중복된 매개변수는 실험 저장을 막지 않으므로 계속 입력할 수 있습니다. 이름을 고치기 전까지는 실험이 실행되지 않습니다.

프로필 ​

프로필은 이름 붙은 매개변수 값의 묶음입니다. 노트북, 무대, 공연장처럼 대상을 전환하는 일이 모든 노드를 고치는 대신 하나를 고르는 일이 됩니다. 프로필은 일부 매개변수만 바꾸고, 나머지는 기본값을 유지합니다.

프로필 만들기 ​

  1. 매개변수를 열고 프로필을 누릅니다. 새 탭이 열립니다.
  2. 프로필 이름에서 이름을 바꿉니다.
  3. 프로필이 바꾸는 각 매개변수의 값을 입력합니다. 빈 필드는 기본값을 유지하며, 필드에 회색으로 표시됩니다. 기본값 사용 (↺)는 값을 지웁니다.
  4. 실행에 사용를 누르면 그 프로필로 실행합니다. 활성 프로필의 탭에는 ● 사용 중가 붙습니다. 기본값 탭에서 실행에 사용를 누르면 기본값으로 돌아갑니다.

실험에 프로필이 생기면 도구 모음의 프로필 목록으로 프로필을 전환합니다. 활성 프로필은 실행, 미리보기, 지금 보내기에 사용되며 실험에 저장되므로, 내보낸 파일을 열어도 같은 대상이 유지됩니다. 프로필 삭제은 화면에 있는 프로필을 삭제합니다.

규칙한도
실험당 프로필32
이름1–64자, 고유(양끝의 공백은 세지 않음)
값존재하는 매개변수만, 최대 64개

매개변수의 이름을 바꾸거나 제거하면 모든 프로필에서 한꺼번에 바뀝니다.

실행이 사용하는 값 ​

뒤에 오는 값이 이깁니다:

  1. 기본값 탭에 있는 매개변수의 기본값.
  2. 활성 프로필의 값(설정한 경우).
  3. 이 실행에만 값 지정 실행…에 입력한 값 — 다른 값으로 실행하기를 참고하십시오.

값 지정 실행…는 실험에 있는 매개변수만 설정할 수 있습니다. 실행 보고서에는 프로필, 실행을 위해 입력한 값, 그리고 사용한 모든 값이 기록됩니다.

실행되지 않을 프로필 ​

실험이 검사될 때마다 다른 프로필과 기본값도 함께 검사됩니다. 실행에 실패할 프로필, 이를테면 http://나 https://가 아닌 URL이 있는 프로필에는 탭과 도구 모음 목록에 ⚠가 붙고, 툴팁이 이유를 알려 줍니다. 사용 중인 프로필로 실행하는 것은 막지 않습니다.

템플릿 ​

{{ }} 안의 텍스트는 표현식이고, 필드의 나머지는 쓴 그대로 유지됩니다.

text
{{api}}/users/{{user.id}}?trace={{uuid}}
Bearer {{secret.API_TOKEN}}
  • 중괄호 안의 공백은 상관없습니다: {{ token }}은 {{token}}입니다.
  • \{{는 문자 그대로의 {{를 씁니다.
  • 홀로 있는 }}는 순수 텍스트입니다.
  • 값은 따옴표 없이 그대로 삽입됩니다. JSON 본문에서는 따옴표를 직접 씁니다: "id": "{{uuid}}".

이름 ​

표현식값
{{name}}이 경로에 변수 name이 설정되어 있으면 그 변수, 아니면 매개변수 name
{{vars.name}}변수만
{{params.name}}매개변수만
{{secret.NAME}}저장된 시크릿 NAME — 시크릿을 참고하십시오
{{name.field}}JSON 값의 필드
{{name[0]}}JSON 배열의 원소
{{name["a b"]}}, {{name['a b']}}다른 문자를 포함하는 이름의 필드

. 뒤의 필드 이름에는 글자, 숫자, _, -를 쓸 수 있습니다. 단계는 이어집니다: {{reply.args[0]}}, {{order.items[2].sku}}.

값이 쓰이는 형태 ​

값쓰이는 형태
텍스트텍스트 그대로
숫자가장 짧은 형태: 42, 0.5
true, falsetrue, false
nullnull
객체, 배열압축된 JSON: ["x","y"]

내장 값 ​

표현식값
{{run.id}}실행의 작업 번호. 미리보기와 지금 보내기에서는 0
{{run.seed}}이 실행의 시드
{{node.id}}실행 중인 노드의 id
{{now}}현재 시각, Unix 밀리초
{{now.iso}}현재 시각을 UTC로, 밀리초를 포함한 ISO 8601: 2026-09-30T12:34:56.789Z
{{counter}}이 실행에서 이 노드가 실행된 횟수(이번 포함), 1부터

{{counter}}는 노드별로 셉니다. 루프 본문에서는 반복 번호이고, 반복하는 노드에서는 전송 번호입니다. run, node, now에는 나열된 필드만 있으며, 그 밖의 것은 오류입니다.

생성기 ​

표현식값
{{uuid}} 또는 {{uuid()}}버전 4 UUID
{{random_int(min, max)}}min부터 max까지(양끝 포함)의 정수. 인수는 정수이고 min ≤ max
{{random_float(min, max)}}min 이상 max 미만의 수, 소수점 3자리. min < max
{{random_float(min, max, digits)}}소수점 digits자리(0–9)인 같은 값
{{pick(a, b, c)}}인수 중 하나, 최소 하나

인수는 쉼표로 구분합니다. 따옴표로 묶은 인수("dark blue" 또는 'a, b')에는 자기 따옴표를 제외한 무엇이든 넣을 수 있고, 따옴표가 없는 인수에는 글자, 숫자, _ - . : / +를 쓸 수 있습니다. 빈 인수는 오류입니다.

모든 생성기는 실행의 시드에서 뽑습니다. 노드를 한 번 실행할 때의 값은 시드, 노드의 id, 노드가 실행된 횟수에만 달려 있으므로, 병렬 분기가 서로의 값을 바꾸지 않으며, 같은 시드로 실행하면 같은 값이 다시 생성됩니다. 한 노드 안에서의 추출은 필드 순서를 따릅니다. {{now}}와 {{run.id}}는 반복할 수 없습니다. 시드를 참고하십시오.

제안 ​

템플릿 필드에서 {{를 입력하거나 Ctrl+Space를 누르면 네 그룹으로 이루어진 목록이 열립니다: 값과 함께 매개변수, 이 노드보다 앞에서 설정한 변수를 설정한 노드와 함께 보여 주는 변수 (회신의 reply.args[0] 같은 필드도 포함), 시크릿, 생성기. ↑와 ↓로 고르고, Enter나 Tab으로 삽입하며, Esc는 목록을 닫고 필드는 그대로 둡니다.

알 수 없는 이름은 오류 ​

값이 없는 이름이 빈 문자열이 되는 일은 없습니다. 실행 전에 필드가 사용하는 모든 이름은 매개변수이거나, 유효한 시크릿 이름이거나, 그 노드로 이어지는 모든 경로에서 설정된 변수여야 합니다. 편집기는 노드와 필드를 가리킵니다:

문제실행 전실행 중
아무도 설정하지 않는 이름name.unknown—
일부 경로에서만 설정되는 변수name.not_on_every_path—
매개변수 x 없는 {{params.x}}param.unknown—
값에 없는 필드—template.no_field
닫히지 않은 {{, 빈 {{}}, 잘못된 인수위치와 함께 template.*—

이 코드의 문구는 오류에 있습니다.

템플릿을 쓰는 필드 ​

노드템플릿 필드
HTTP 요청URL, 헤더 이름과 값, 본문, Basic과 Digest의 사용자 이름과 비밀번호, Bearer 토큰
OSC 메시지대상, 주소, 텍스트 인수. 회신이 있으면 그 주소 패턴과 규칙 값
UDP 데이터그램대상, 페이로드. 회신이 있으면 그 패턴
TCP 메시지호스트, 페이로드
MQTT 발행브로커 호스트, 토픽, 페이로드
로그 마커메시지
응답 텍스트기대하는 텍스트
응답 헤더헤더 이름, 기대하는 텍스트
값 검사, 값 분기, 루프의 종료 조건값, 기대하는 값
OSC 대기주소 패턴, 규칙 값
UDP 대기, WebSocket 대기패턴
MQTT 대기브로커와 토픽(매개변수만), 패턴
HTTP 요청 대기경로 패턴, 조건
네트워크 장애수신과 대상(매개변수만)
WebSocket 연결URL, 헤더 이름과 값
WebSocket 보내기페이로드
WebSocket 닫기이유

숫자(포트, 시간 제한, 지연, 상태, 타입이 지정된 OSC 숫자)와 대기의 수신 주소는 리터럴입니다. 에뮬레이터는 도착한 내용({{request.…}})과 매개변수로 자체 회신을 렌더링합니다. 장애 주입을 참고하십시오.

매개변수만. 일부 필드는 아직 변수가 없는 첫 단계 전에 열립니다: MQTT 대기의 브로커와 토픽, 네트워크 장애의 수신과 대상입니다. 이들은 텍스트와 매개변수만 받고 그 밖의 것은 받지 않습니다(node.params_only).

리터럴처럼 검사합니다. 매개변수만 사용하는 필드는 실행 전에 해석되어 실행이 보낼 텍스트로 검사됩니다. URL은 http://나 https://여야 하고, OSC 대상은 IP:port나 host:port, 헤더 이름은 유효해야 합니다. 변수나 생성기가 있는 필드는 실행될 때 검사합니다.

미리보기 ​

선택한 노드에 템플릿이 있으면 속성에 지금 알려진 값으로 무엇을 할지 표시됩니다. 전송에는 보낼 내용, 대기에는 기다릴 대상, 비교에는 비교할 내용입니다. 엔진이 실행과 같은 코드로 해석하므로, 미리보기가 실행과 어긋나는 일은 없습니다.

  • 매개변수는 활성 프로필에서 옵니다.
  • 변수는 편집기가 이 세션에서 본 것, 즉 마지막 실행의 단계와 지금 보내기에서 옵니다.
  • 저장된 시크릿은 ••••로 표시됩니다.
  • 아직 값이 없는 이름은 쓴 그대로 남고, 미리보기가 그 이름을 나열합니다. 저장되지 않은 시크릿은 따로 나열됩니다.
  • 생성기는 실험에 고정된 시드를 사용하고, 고정된 시드가 없으면 0을 노드의 첫 실행으로 사용합니다. 시드가 고정되어 있으면 미리보기는 실행에서 노드의 첫 실행이 보낼 생성 값을 보여 줍니다.

값 추출하기 ​

값 추출는 그 경로의 최신 HTTP 응답에서 값을 하나 읽어 변수에 씁니다.

필드내용
변수쓸 변수. 매개변수의 이름 규칙이 적용됩니다
추출 위치값이 어디서 오는지(아래)
JSON 경로, 헤더 이름 또는 패턴(그룹 1이 있으면 그룹 1)무엇을 읽을지, 출처에 따라 다름
추출 위치읽는 것값
JSON 필드본문을 JSON으로, 경로에 따라JSON 값: 텍스트, 숫자, 객체, 배열
헤더그 이름의 첫 헤더, 대소문자 무관텍스트
상태 코드상태 코드숫자
본문 전체본문 전체텍스트
정규식본문의 첫 일치패턴에 그룹이 있으면 캡처 그룹 1, 없으면 일치한 부분 전체

JSON 경로. $.token, $.items[0].id, $["a b"], $['a b']['c-d']이며, 맨 앞의 $.는 생략할 수 있고(token, items[0].id), $ 하나는 본문 전체입니다.

정규식은 Rust regex 엔진의 문법을 사용하며, 둘러보기와 역참조가 없습니다. 일치는 본문 어디서든 찾으며, 그것이 중요할 때는 ^와 $로 고정하십시오.

다음 경우에 단계가 실패하며, 무엇이 없는지 알려 줍니다:

  • 이 경로에서 그 앞에 HTTP 요청이 실행되지 않았을 때(check.no_response. 편집기는 그럴 수 없는 그래프를 이미 거부합니다, graph.needs_http);
  • 본문이 JSON이 아니거나 그 안에 경로가 없을 때;
  • 헤더가 없거나 패턴이 일치하지 않을 때;
  • JSON 경로나 본문 전체의 경우 응답이 보관하는 256 KiB를 본문이 넘을 때, 그리고 보관된 부분에서 아무것도 일치하지 않은 패턴일 때(extract.truncated).

타임라인에는 쓴 값이 표시됩니다: token = abc123.

클릭으로 추출하기

HTTP 요청에서 지금 보내기를 누르면 JSON 응답이 표시됩니다. 그 안의 값을 클릭하십시오. 요청 뒤에 값 추출 노드가 추가되고 경로가 채워지며 키에서 이름을 따옵니다. 값은 곧바로 미리보기에 알려집니다.

변수 ​

변수는 JSON 값을 담습니다. 다음 노드가 변수를 씁니다:

노드쓰는 것출력에서
값 추출추출한 값그 출력
OSC 대기, UDP 대기, MQTT 대기, HTTP 요청 대기, WebSocket 대기도착한 것, 기본 이름 reply(HTTP는 request)일치에만
OSC 메시지, UDP 데이터그램에 회신 대기회신, 기본 이름 reply그 출력

대기가 쓰는 것은 객체이며, 이후 필드가 그 일부를 읽습니다:

대기필드
OSCaddress, args, from, ms
UDPtext, hex, bytes, from, ms, 그리고 패턴이 있을 때의 match
MQTTtopic, 그리고 UDP의 필드
WebSocketUDP의 필드, 메시지가 JSON이면 json
HTTP 요청method, path, query, headers, body, json, params, from, ms

ms는 분기의 마지막 동작부터 도착까지의 시간입니다. 정확한 내용은 노드 참조에 있습니다.

변수가 알려지는 곳 ​

변수는 그 변수를 쓰는 출력 이후부터, 그 출력을 지나는 경로에서 존재합니다:

  • 대안 경로가 다시 만난 뒤 — 분기의 예와 아니요가 합쳐질 때 — 모든 경로가 설정한 것만 알려집니다.
  • 분기 합류 뒤에는 그 합류로 들어오는 어느 분기가 설정한 것이든 알려집니다: 모두 실행되었기 때문입니다.
  • 루프의 완료이나 한도 뒤와 그 종료 조건에서는 본문의 모든 반복이 설정한 것이 알려집니다.
  • 대기의 변수는 그 시간 초과 출력 뒤에는 알려지지 않습니다.

각 병렬 분기는 변수의 자기 사본으로 동작합니다. 합류는 들어오는 연결 순서대로 사본을 병합하며, 둘 다 설정한 이름은 뒤의 연결이 이기므로, 결과가 어느 분기가 먼저 끝났는지에 달리는 일은 없습니다. 실행의 흐름을 참고하십시오.

값 비교하기 ​

값 검사는 비교가 성립하지 않으면 실행을 실패시킵니다. 값 분기는 예나 아니요로 나갑니다. 루프는 같은 비교를 종료 조건으로 사용합니다. 각각 값, 조건, 기대값 값이 있으며, 두 텍스트 모두 템플릿입니다:

값조건기대값
{{status}}미만300
{{reply.args[0]}}같음{{nonce}}
조건성립 조건
같음, 같지 않음둘이 같음(다름) — 둘 다 숫자이면 숫자로(200은 200.0과 같음), 아니면 대소문자를 포함한 정확한 텍스트로
미만, 이하, 초과, 이상숫자로. 숫자가 아닌 쪽이 있으면 조용히 아니요가 아니라 단계를 실패시킵니다(compare.not_numbers)
포함값에 기대하는 텍스트가 포함됨(대소문자 포함)
정규식 일치기대하는 값의 정규식이 값 어디서든 일치함
비어 있음, 비어 있지 않음공백을 제거한 뒤 값이 비었거나 비지 않음. 기대하는 값은 사용하지 않음

숫자는 공백을 제거한 뒤 숫자로 읽히는 텍스트입니다: 42, -1.5, 1e3. 타임라인에는 이루어진 그대로의 비교가 표시됩니다: 401 = 200. 양쪽은 120자로 자릅니다.

시크릿 ​

토큰이나 비밀번호는 {{secret.NAME}} 형태로 필드에 넣습니다. 실험 파일에는 이름만 남고, 값은 저장된 곳에 머물며 인터페이스에 도달하지 않습니다.

시크릿이 사는 곳 ​

Signal Lab이 실행되는 곳저장소인터페이스에서
Windows 데스크톱 앱Windows 자격 증명 관리자, 서비스 SignalLab 아래 이름마다 항목 하나설정, 교체, 제거
Linux 데스크톱 앱없음: 시크릿이 필요한 실행은 secret.unsupported로 실패합니다—
서버환경 변수 SIGNALLAB_SECRET_<NAME>, 없으면 시크릿 폴더의 파일 <NAME>, 따로 설정하지 않으면 /run/secrets/signallab읽기 전용
명령줄의 signallab서버와 같거나, --secrets system을 쓰면 Windows 자격 증명 관리자—

시크릿 항목의 제목에는 지금 있는 곳에 어느 것이 해당하는지 알려 주는 툴팁이 있습니다. Windows 저장소인지, 서버의 환경과 파일인지, 아니면 — Linux 데스크톱 앱에서는 — 저장소가 없다는 것입니다. 후자의 경우 secret.unsupported는 시크릿이 Windows 자격 증명 관리자에 보관되는데 그 시스템에는 그것이 없다고 말합니다.

시크릿은 실험 하나가 아니라 컴퓨터나 서버에 속합니다. {{secret.API_TOKEN}}을 쓰는 두 실험은 같은 값을 사용합니다.

서버에서는 환경 변수가 파일보다 우선합니다. 파일 끝의 줄 바꿈은 값의 일부가 아니며, 빈 파일은 시크릿이 없는 것으로 봅니다. 서버의 폴더는 --secrets-dir나 SIGNALLAB_SECRETS_DIR로 설정합니다. 서버를 참고하십시오. 명령줄은 signallab run을 참고하십시오.

규칙한도
이름글자나 _로 시작하고, 그다음은 글자, 숫자, _이며 최대 128자
값비어 있지 않고, 최대 16 KiB

시크릿 설정하기 ​

Windows에서는:

  1. 매개변수를 엽니다. 시크릿 항목에는 실험의 필드가 사용하는 모든 시크릿이 나열되며, 각각 저장됨 또는 이 컴퓨터에 설정되지 않음입니다.
  2. 이름 옆의 설정…을 누르거나, 아직 어떤 필드도 쓰지 않는 이름에는 시크릿을 누릅니다.
  3. 값을 입력하고(필드에는 점이 표시됨) 저장나 Enter를 누릅니다. 필드가 비워지며, 아무것도 값을 다시 읽을 수 없습니다.

교체…는 새 값을 저장하고, 제거는 자격 증명 저장소에서 삭제합니다. 이 세션에서 저장한 이름은 제안에도 나타납니다.

서버에 연결된 브라우저에서는 이 항목이 서버에 설정됨 또는 서버에 설정되지 않음만 알려 줍니다. 서버가 실행되는 곳에서 두 가지 방법 중 하나로 값을 설정하십시오:

bash
# in the server's environment
SIGNALLAB_SECRET_API_TOKEN='…'
# or as a file in its secrets folder
printf '%s' '…' > /run/secrets/signallab/API_TOKEN

파일은 실행이 시작될 때마다 읽으므로, 바뀐 파일은 다음 실행부터 반영됩니다. 바뀐 환경 변수는 서버를 다시 시작해야 합니다.

실행 전에 ​

실행의 필드가 사용하는 모든 시크릿이 저장되어 있어야 합니다. 없는 시크릿은 트래픽이 생기기 전에, 그 시크릿을 사용하는 첫 노드와 필드에서 실행을 멈춥니다(secret.missing). 지금 보내기도 자기 노드에 대해 같은 검사를 합니다.

마스킹 ​

실행이나 지금 보내기가 시크릿을 사용하는 동안에는 엔진을 벗어나는 모든 것에서 그 값의 모든 출현이 ••••로 바뀝니다:

  • 단계 텍스트, 오류, 단계가 쓴 변수;
  • 실행 보고서;
  • 지금 보내기의 결과(표시하는 HTTP 응답 포함);
  • 실행이 지속되는 동안 캡처한 인스펙터의 프레임 — hex 덤프에서는 값의 각 바이트가 *가 되어 오프셋이 그대로 유지됩니다.

Basic 인증은 name:password를 base64로 보냅니다. 어느 쪽이든 시크릿을 담고 있으면 그 base64 텍스트도 마스킹됩니다. 트래픽 자체는 실제 값을 나릅니다. 미리보기는 저장된 시크릿을 ••••로 표시합니다. 에뮬레이터의 회신은 시크릿을 사용할 수 없습니다.

명령 ​

미리보기는 experiment_resolve입니다. 시크릿은 secret_status, secret_set, secret_delete로 나열, 설정, 제거합니다. 어떤 명령도 시크릿의 값을 반환하지 않습니다.