@arca/rgss123 1.0.0 npm
Published
Installation
@arca:registry=npm config set @arca:registry=npm install @arca/rgss123@1.0.0"@arca/rgss123": "1.0.0"About this package
@arca/rgss123
ARCA 프로젝트의 하위 프로젝트인 rgss123-web이 게시한 정확한 release 하나를 설치하는 배포 패키지다. RPG Maker 게임을 브라우저에서 실행하려는 host가 player SDK, runtime, contracts와 Builder를 같은 release로 고정해 받는다.
- 들어 있는 것: Player SDK, public contracts와 타입, native JS/WASM, license/provenance, release pin과 Builder OCI archive, Node 배포 helper와 RTP 관리 API.
- 들어 있지 않은 것: 게임과 RTP 원본.
- 런타임과 Builder를 다운로드하거나 실행하는 install hook은 없다.
- Builder는 Docker에서 실행하는 독립 컨테이너다.
1.0.0 이름 변경
1.0.0은 0.1.x의 @rgss23/arca에서 이름을 바꾼 첫 rgss123 release다. deprecation 기간 없이 사용자 승인으로 바꿨고(2026-10-29·31 사용자 결정) 이전 이름은 export·CLI 어디에서도 받지 않는다.
- package:
@rgss23/arca→@arca/rgss123, tarballrgss23-arca-<version>.tgz→rgss123-arca-<version>.tgz. registry scope 줄은@arca:registry=다. - API·타입:
Rgss23*와Arca*→Rgss123*(예:launchRgss23Player→launchRgss123Player,getArcaRelease→getRgss123Release,prepareArcaRtp→prepareRgss123Rtp,ArcaRtpOptions→Rgss123RtpOptions).ArcaBuilderError·ArcaBuilderErrorCode는 packager의Rgss123BuilderError와 구분해Rgss123BuilderImageError·Rgss123BuilderImageErrorCode다. - 오류 code:
ARCA_*→RGSS123_*. message 안의ARCA는rgss123이다. - CLI:
arca-release→rgss123-release. - contracts: schema·contract·interface ID
rgss23-*→rgss123-*,links-rgss23-web-launch-v1→links-rgss123-web-launch-v1. - player SDK: 기본 저장소의 save 경로 prefix
arca-path-v1/→rgss123-path-v1/, runtime 가상 경로/arca/→/rgss123/, OPFS·Web Lock·storage namespacergss123-*. 이전 prefix로 저장한 snapshot 키는 원래 파일로 복원되지 않는다.
설치와 검증
@arca:registry=https://git.2ex.dev/api/packages/hanyul/npm/
pnpm add --save-exact @arca/rgss123@VERSION
pnpm exec rgss123-release verify
- 신뢰 기준: 호스트의 lockfile integrity가 설치한 package의 신뢰 기준이다.
verify는 추가로 package 내부 파일·원본 release manifest·artifact hash·Builder digest를 대조한다.- browser import는 파일 검증이나 Node/Docker 실행을 수행하지 않는다.
처음 사용
import { launchRgss123Player } from "@arca/rgss123";
import type { Rgss123SaveAdapter } from "@arca/rgss123/contracts";
// Node deployment code only; never import this subpath in the browser.
import { getRgss123Release, stageRgss123Release } from "@arca/rgss123/deploy";
const release = await getRgss123Release();
// release.releaseDirectory: unchanged canonical release set for existing hosts.
// release.runtimeDirectory: verified static runtime assets and licenses.
// release.builder: exact digest and offline-loadable OCI archive path.
const installed = await stageRgss123Release("/runtime-releases");
// installed.releaseDirectory = /runtime-releases/<manifestSha256>
export
| export | 실행 환경 | 내용과 사용법 |
|---|---|---|
@arca/rgss123 |
browser | player SDK. 사용법은 rgss123-web 저장소의 packages/player-sdk/README.md |
@arca/rgss123/contracts, @arca/rgss123/contracts/* |
browser·Node | public contracts와 타입. 사용법은 이 package의 contracts/README.md, 동일성은 contracts export 동일성 |
@arca/rgss123/deploy |
Node 전용 | release 검증·배포와 Builder helper. 배포부터 배포 오류 code까지 |
@arca/rgss123/rtp |
Node 전용 | RTP 준비·조회. RTP 관리 |
@arca/rgss123/runtime/* |
asset | native JS/WASM과 license. bundler의 asset URL 처리 또는 Node의 import.meta.resolve()에 사용할 수 있다 |
@arca/rgss123/release-pin.json |
JSON | 이 package의 release pin |
@arca/rgss123/package.json |
JSON | package metadata |
JS와 WASM은 같은 release 경로로 배포하고 기존 configuration의 MIME·isolation 요구를 유지한다.
engine 선언과 지원 판정
engines는 지원 판정이 아니다: runtime ZIPconfiguration.json의engines는 이 runtime이 해당 engine(rpg-maker-vx·rpg-maker-vx-ace·rpg-maker-xp)의 game을 받아 실행한다는 선언이다. 사용자 acceptance나 그 engine 전체의 일반 지원을 뜻하지 않는다.- release manifest에는 engine 목록이 없다.
- engine·기능별 판정은 rgss123-web 저장소의
docs/compatibility-matrix.md가 소유한다. rpg-maker-xp의 근거는 제공 XP 샘플 하나의 자동 smoke뿐이고 사용자 acceptance는 실행하지 않았다.
배포
stageRgss123Release(DIR) 또는 rgss123-release stage DIR을 실행하면 hash별 새 디렉터리가 완성된 뒤에만 노출된다.
- 기존 경로의 손상이나 다른 내용은 덮어쓰지 않고 실패한다.
- 같은 package 재배포는 검증 후 재사용한다.
- 실패 시 이전 release와 실행 중인 generation을 그대로 보존한다.
- 새 hash에 결속: 배포가 끝나면 호스트가 새 실행을 새 manifest hash에 결속해야 한다.
- 이미 만들어진 game/RTP package의 재사용 판정, generation 교체, session과 save 보존은 호스트 책임이다.
- dependency 설치만으로 기존 DB의 active build를 바꾸지 않는다.
@arca/rgss123/deploy의 API는 아래와 같다. 도입이 0.1.14인 API는 0.1.13 이하 package에 없다.
| API | 하는 일 | 도입 |
|---|---|---|
getRgss123Release() |
설치된 package를 검증하고 release·runtime 디렉터리, pin과 Builder digest·archive 경로를 돌려준다 | 0.1.14 이전 |
stageRgss123Release(DIR) |
hash별 immutable 디렉터리로 배포(배포) | 0.1.14 이전 |
verifyRgss123RuntimeDirectory() |
runtime 해제본 결속 검증 | 0.1.14 |
verifyRgss123Contracts() |
contracts export 동일성 검증 | 0.1.14 |
getRgss123BuilderIsolation(), rgss123BuilderRunArguments(), loadRgss123Builder() |
Builder 실행 helper | 0.1.14 |
실패의 code |
배포 오류 code | 0.1.14 |
runtime 해제본 결속 검증
verifyRgss123RuntimeDirectory()(0.1.14부터)는 해제된 runtime 디렉터리를 release manifest의 runtime ZIP에 결속한다. 호스트는 ZIP을 직접 풀거나 별도 해제기를 둘 필요가 없다.
import { stageRgss123Release, verifyRgss123RuntimeDirectory } from "@arca/rgss123/deploy";
const installed = await stageRgss123Release("/runtime-releases");
const runtime = await verifyRgss123RuntimeDirectory({
releaseDirectory: installed.releaseDirectory, // 기본값: package의 release/
runtimeDirectory: "/srv/rgss123-runtime", // 기본값: package의 runtime/, 호스트 복사본도 가능
});
// runtime.manifestSha256 === installed.pin.manifestSha256
// runtime.runtimeArtifact.sha256 === installed.pin.artifacts.runtime
검증 순서는 다음과 같으며 파일을 쓰거나 고치지 않는다.
getRgss123Release()로 설치된 package를 검증한다.- release 디렉터리의 runtime ZIP을 manifest·pin의 bytes·SHA-256과 대조한다.
- ZIP의 모든 entry를 CRC를 확인하며 읽어 runtime 디렉터리의 파일과 path·bytes·SHA-256을 1:1로 비교한다.
| 결과 필드 | 내용 |
|---|---|
manifestSha256 |
설치된 pin과 같은 release manifest hash |
runtimeArtifact |
실제로 읽은 ZIP의 { fileName, bytes, sha256 } |
inventory |
ZIP의 모든 파일 entry(디렉터리 제외)의 { path, bytes, sha256 }. ASCII path의 ordinal 오름차순 |
configuration |
configuration.json이 가리키는 module(entrypoint와 exportName), javascript, wasm, checksums(SHA256SUMS), license(manifest의 license file·SHA-256) 각각의 inventory 항목과 interface: "rgss123-runtime-v1", saveInterface |
결속 조건:
- module path는 manifest의 entrypoint와 같아야 한다.
- save interface는 같은 package의 contracts
rgss123SaveContract.interface와 같아야 한다. - ZIP 안의
SHA256SUMS도 자신을 뺀 inventory와 정확히 일치해야 한다. - ZIP이 목록화한 빈 디렉터리는 runtime 디렉터리에 없어도 된다.
- 그 밖의 추가 파일·디렉터리, symlink·junction 같은 link, 일반 파일이 아닌 항목은 거부한다.
- immutable 경로로 게시: 검증은 호출 시점의 내용을 대조하므로 호스트는 검증한 디렉터리를 이후 바꾸지 않는 immutable 경로로 게시한다.
실패하면 code와 해당하는 경우 상대 path를 가진 Error를 던진다. message는 CODE: 설명 형식이다.
| code | 의미 |
|---|---|
RGSS123_RUNTIME_PACKAGE_INVALID |
설치된 package의 integrity·pin 검증(getRgss123Release()) 실패 |
RGSS123_RUNTIME_RELEASE_MISMATCH |
release 디렉터리의 manifest를 읽을 수 없거나 hash가 설치된 pin과 다름 |
RGSS123_RUNTIME_ARTIFACT_MISMATCH |
runtime ZIP이 없거나 bytes·SHA-256이 manifest와 다름(검증 중 변경 포함) |
RGSS123_RUNTIME_ARTIFACT_INVALID |
ZIP 구조·CRC 오류 또는 ZIP 안의 SHA256SUMS 불일치 |
RGSS123_RUNTIME_CONFIGURATION_MISMATCH |
configuration.json이 canonical이 아니거나 entrypoint·core·WASM·license·save interface 결속 불일치 |
RGSS123_RUNTIME_ENTRY_MISSING |
ZIP의 파일 또는 runtime 디렉터리 자체가 없음 |
RGSS123_RUNTIME_ENTRY_UNEXPECTED |
runtime 디렉터리에 ZIP에 없는 파일·디렉터리가 있음 |
RGSS123_RUNTIME_ENTRY_MISMATCH |
같은 path의 bytes 또는 SHA-256이 ZIP entry와 다름 |
RGSS123_RUNTIME_PATH_UNSAFE |
link·일반 파일이 아닌 항목, ZIP entry의 경로 탈출·대소문자 중복, link인 release·runtime 디렉터리 |
contracts export 동일성
@arca/rgss123/contracts와@arca/rgss123/contracts/*가 가리키는 package의contracts/디렉터리는 release manifest·pin에 고정된 contracts tarball(rgss123-contracts-<version>.tgz)의package/아래 파일과 path·bytes·내용이 1:1로 같다.- 이는 공개 계약이며 npm 생성 단계도 포장 전에 이 검증을 통과해야 한다.
- 호스트는 tarball을 직접 풀거나 해제한 코드를 동적 import하지 않고
@arca/rgss123/contracts를 정적으로 import하면 된다.
import { verifyRgss123ReleaseSetPin } from "@arca/rgss123/contracts";
import { verifyRgss123Contracts } from "@arca/rgss123/deploy";
const contracts = await verifyRgss123Contracts(); // 선택: { releaseDirectory, contractsDirectory }
// contracts.contractsArtifact.sha256 === release.pin.artifacts.contracts
verifyRgss123Contracts()(0.1.14부터)는 동일성을 직접 확인한다.
- 순서: 먼저
getRgss123Release()로 package를 검증하고, release 디렉터리의 contracts tarball을 manifest·pin과 대조한 뒤 checksum이 맞는 일반 파일 entry만 읽어 디렉터리와 비교한다. - 결과:
manifestSha256,contractsArtifact(fileName·bytes·sha256), manifest의package(name·version)와 ordinal path 순inventory다. - 선택 인자:
releaseDirectory로stageRgss123Release()디렉터리를,contractsDirectory로 호스트 복사본을 검증할 수 있다. - 실패 형식은 runtime 검증과 같다(
code, 해당하면path, messageCODE: 설명).
| code | 의미 |
|---|---|
RGSS123_CONTRACTS_PACKAGE_INVALID |
설치된 package의 integrity·pin 검증 실패(원인은 cause.code) |
RGSS123_CONTRACTS_RELEASE_MISMATCH |
release 디렉터리의 manifest를 읽을 수 없거나 hash가 설치된 pin과 다름 |
RGSS123_CONTRACTS_ARTIFACT_MISMATCH |
contracts tarball이 없거나 bytes·SHA-256이 manifest와 다름 |
RGSS123_CONTRACTS_ARTIFACT_INVALID |
gzip·ustar header 오류, 일반 파일이 아닌 entry 또는 package/ 밖 entry |
RGSS123_CONTRACTS_ENTRY_MISSING |
tarball의 파일 또는 contracts 디렉터리 자체가 없음 |
RGSS123_CONTRACTS_ENTRY_UNEXPECTED |
contracts 디렉터리에 tarball에 없는 파일·디렉터리가 있음 |
RGSS123_CONTRACTS_ENTRY_MISMATCH |
같은 path의 내용이 tarball entry와 다름 |
RGSS123_CONTRACTS_PATH_UNSAFE |
link·일반 파일이 아닌 항목, entry 경로 탈출·대소문자 중복, link인 release·contracts 디렉터리 |
Builder 실행 helper
0.1.14부터 @arca/rgss123/deploy는 Builder OCI를 실행할 때 필요한 load·인자·격리만 제공한다. Docker socket 위치, Compose 사용, job·lease·heartbeat·재시도·출력 게시와 CAS는 호스트 정책이며 rgss123-web helper에 넣지 않는다.
import { rgss123BuilderRunArguments, getRgss123BuilderIsolation, loadRgss123Builder } from "@arca/rgss123/deploy";
const { imageId } = await loadRgss123Builder(); // 선택: { builder: staged.builder, dockerCommand, signal }
const args = rgss123BuilderRunArguments({
image: imageId, command: "package",
input: "/sealed/payload", output: "/attempt/output", configFile: "/attempt/build.json",
});
// execFile("docker", args): 실행·종료 감시는 호스트가 맡는다.
격리: getRgss123BuilderIsolation()
release gate가 실제로 검증한 격리를 data로 반환한다. Compose를 쓰는 호스트는 service 정의를 이 값과 대조한다.
| 항목 | 값 |
|---|---|
| user | 10001:10001 |
| init | init 사용 |
| root filesystem | read-only |
| network | none |
| capability | cap_drop: [ALL] |
| security option | no-new-privileges:true |
| tmpfs | /tmp:rw,noexec,nosuid,nodev,size=16m,uid=10001,gid=10001 |
| memory | 1g |
| mount | /input·/config read-only, /output만 writable |
실행 인자: rgss123BuilderRunArguments()
inspect(/output/inspection.json)와package의docker인자를 만든다.package는 다음 중 하나를 받는다: build.json 하나를/config/build.json에 mount하는configFile, 또는 RTP·overlay 입력까지 담은 디렉터리를/config에 mount하는configDirectory.- path는 절대 host path여야 하고
--mount를 깨는 쉼표·따옴표·줄바꿈을 거부한다. memory로 큰 게임의 상한을 올리거나null로 생략하고,name으로 호스트가 종료할 container 이름을 지정할 수 있다.- 다른 격리 flag는 바꿀 수 없다.
image load: loadRgss123Builder()
- release의 Builder archive에서 OCI manifest digest(pin)와 config digest를 직접 읽는다. archive가 pin된 digest를 담지 않으면 거부한다.
- 둘 중 하나가 이미 daemon에서 resolve되면 그대로 둔다.
- 아니면
docker load한 뒤 출력이 두 digest 또는 archive의rgss123-builder:<version>tag를 알리고docker image inspect가 두 digest 중 하나로 성공하는지 확인한다. - pull·run은 하지 않는다.
반환값은 { digest, configDigest, imageId, imageName, loaded }다.
| 필드 | 내용 |
|---|---|
digest |
pin된 manifest digest |
configDigest |
archive의 OCI image config descriptor digest(0.1.21부터) |
imageId |
(0.1.18부터) daemon이 resolve한 image ID. containerd image store는 manifest digest, Docker Engine 24·graphdriver store는 config digest |
imageName |
load가 붙이는 tag(0.1.18부터) |
loaded |
이번 호출이 docker load를 실행했으면 true, 이미 resolve되어 그대로 두었으면 false |
imageId로 실행: Docker 24는 load한 image에 RepoDigests를 기록하지 않아 manifest digest로 실행할 수 없으므로 Builder는imageId로 실행한다.- tag는 다른 load가 옮길 수 있어 identity로 쓰지 않는다.
Docker 없이 identity 대조
getRgss123Release().builder(stageRgss123Release()도 같음)의digest·configDigest를 쓴다. daemon socket이 필요 없다.- 0.1.21부터 release pin
builderConfigDigest가 config digest를 담는다. 0.1.20 이하 pin에는 이 필드가 없다. getRgss123Release()는 integrity로 결속된 archive의 OCI manifest·config blob을 읽어 두 digest가 pin과 같을 때만 값을 돌려준다. 다르면RGSS123_RELEASE_BUILDER_MISMATCH, archive bytes가 바뀌면 그 전에RGSS123_RELEASE_INTEGRITY_MISMATCH다.- host는
docker load뒤 daemon이 resolve한 image ID가 둘 중 하나와 같을 때만 그 ID로 실행한다. rgss123-release verify·stage출력 JSON에도 같은builder.configDigest가 들어간다.
archive 형식
Builder archive(rgss123-builder-<version>.oci.tar)는 0.1.18부터 OCI image layout에 Docker Engine 24가 읽는 docker-save manifest.json을 더한 형식이다. 파일 이름과 MIME application/vnd.oci.image.layout.v1.tar는 그대로다.
Builder 오류 code
| code | 의미 |
|---|---|
RGSS123_BUILDER_ARGUMENT_INVALID |
image·command·path·memory·name 또는 config 조합이 계약 밖 |
RGSS123_BUILDER_DOCKER_UNAVAILABLE |
docker 실행 파일을 찾지 못함 |
RGSS123_BUILDER_LOAD_FAILED |
docker load가 archive를 거부하거나, archive를 읽을 수 없거나 OCI layout·manifest.json 구조가 계약 밖 |
RGSS123_BUILDER_DIGEST_MISMATCH |
archive가 pin된 digest를 담지 않거나, load 뒤 manifest·config digest가 출력·daemon에서 확인되지 않음 |
배포 오류 code
- 0.1.14부터
getRgss123Release()와stageRgss123Release()의 실패에는code가 붙는다. - message 문장은 0.1.13과 같지만 1.0.0에서 문장 안의
ARCA가rgss123으로 바뀌었으므로 message 대신code로 분류한다. - 설치 package 파일이 없을 때의
ENOENT같은 Node system error는 자신의code를 유지한다.
| code | 의미 |
|---|---|
RGSS123_RELEASE_PATH_UNSAFE |
package·release 경로의 link, 일반 파일이 아닌 항목 또는 안전하지 않은 path |
RGSS123_RELEASE_PACKAGE_INVALID |
package 이름·integrity.json 형식 오류, 그 밖에 읽을 수 없는 package metadata |
RGSS123_RELEASE_INTEGRITY_MISMATCH |
integrity.json과 package 파일 hash 불일치 |
RGSS123_RELEASE_PIN_MISMATCH |
package version·manifest·pin·.sha256 결속 불일치 |
RGSS123_RELEASE_MANIFEST_INVALID |
artifact role·file name·license 승인 정책 위반 |
RGSS123_RELEASE_ARTIFACT_MISMATCH |
release artifact의 bytes·SHA-256이 manifest·pin과 다름 |
RGSS123_RELEASE_BUILDER_MISMATCH |
Builder digest가 manifest·pin과 다름 |
RGSS123_RELEASE_STORE_UNSAFE |
stageRgss123Release() 저장 경로가 link |
RGSS123_RELEASE_STAGE_CONFLICT |
같은 hash 경로에 다른 내용 또는 디렉터리가 아닌 항목이 있음(덮어쓰지 않음) |
RGSS123_RELEASE_STAGE_INCOMPLETE |
같은 hash 경로가 불완전함(덮어쓰지 않음) |
rgss123-release CLI
rgss123-release --help는 명령 목록을 출력한다. 0.1.14에서 verify-contracts, builder-isolation, builder-load 명령을 추가했다.
| 명령 | API |
|---|---|
rgss123-release verify |
getRgss123Release() |
rgss123-release stage DIR |
stageRgss123Release(DIR) |
rgss123-release verify-contracts |
verifyRgss123Contracts() |
rgss123-release builder-isolation |
getRgss123BuilderIsolation() |
rgss123-release builder-load |
loadRgss123Builder() |
rgss123-release rtp-catalog, rtp-prepare CONFIG.json, rtp-get CONFIG.json |
RTP CLI |
- 성공 시 JSON 한 줄을 stdout에 쓴다.
- 실패하면 stack trace 대신 stderr에
CODE: message한 줄을 쓰고 exit 1로 끝난다(message가 이미 code로 시작하면 그대로). - 사용법 오류는
RGSS123_CLI_USAGE, code가 없는 오류는RGSS123_CLI_FAILED다. RTP code는 RTP 관리를 따른다.
RTP 관리
Node 전용 API(0.1.7부터)가 공식 VX/VX Ace RTP와 XP RTP(RPGXP, 1.0.0 @arca/rgss123부터)의 다운로드·추출·패키징·검증·캐시를 처리한다.
- 호스트는 RTP ID와 영구 저장 경로만 제공한다.
- npm에는 원본 데이터 대신 고정된 공식 source catalog와 Windows x64·Linux x64/glibc용 innoextract 1.9가 들어 있다.
- Node 22 이상을 사용하며 별도 추출 도구 설치나 Docker socket은 필요 없다.
import { getRgss123RtpCatalog, prepareRgss123Rtp, getRgss123Rtp } from "@arca/rgss123/rtp";
const catalog = await getRgss123RtpCatalog();
const rtp = await prepareRgss123Rtp({ id: "RPGVXAce", storeRoot: "/state/rgss123-rtp" });
// rtp.archivePath + rtp.manifestPath → existing Builder/host portable RTP inputs.
const cached = await getRgss123Rtp({ id: "RPGVXAce", storeRoot: "/state/rgss123-rtp" });
다운로드와 재시도
- 캐시가 없을 때만 prepare가 공식 원본을 다운로드한다.
- 시간 제한(0.1.15부터): 60초 동안 데이터를 받지 못하면 그 시도를 중단하고 전체 1시간을 넘기지 않는다. 0.1.14는 재시도 없이 전체 300초에서 끝냈다.
- 재시도 대상: 연결 거부·재설정·끊김·시간 초과 같은 네트워크 전송 오류(Node·undici 오류 code로 판정), HTTP 5xx·429, 무수신. 같은 호출 안에서 최대 3회 다시 시도한다.
- 대기: 2·8·30초 backoff 각각의 절반~전체 사이 jitter다. 5xx·429의
Retry-After보다 짧게 기다리지 않으며Retry-After가 5분을 넘으면 더 시도하지 않고 실패한다. - 무수신이 계속되면 약 4~5분 뒤 실패로 보고한다.
- 이어 받기: 재시도에서는 서버가
206과 받은 위치·전체 크기가 맞는Content-Range로 응답할 때만 받은 부분 뒤부터 이어 받고, 그 밖에는 처음부터 받는다. 그런206이 전체 크기 전에 끝나면(서버 range 상한) 받은 부분을 두고 다음 시도에서 이어 받는다. - 정상 종료된
200이 lock보다 짧으면 다른 파일로 보고RGSS123_RTP_INPUT_MISMATCH로 끝낸다. - 재시도하지 않는 실패: HTTP 4xx, redirect·TLS·호스트 없음·URL 오류, 크기 초과, hash 불일치와 호출자 취소.
- 최종 크기·SHA-256 검증은 항상 수행한다.
오프라인, 취소와 네트워크 경계
- 오프라인은
sourceZipPath로 공식 원본(VX·VX Ace는 ZIP, XP는 설치 파일xp_rtp104e.exe)을 제공하고download: false를 지정한다. signal로 다운로드·추출을 취소할 수 있다.- 설치 hook, catalog 조회, get은 네트워크를 사용하지 않는다. OS RTP 설치 프로그램도 실행하지 않는다.
- Linux musl/Alpine·ARM64·macOS의 공식 ZIP 준비는 지원 대상으로 검증하지 않았다.
진행 알림: onProgress
prepareRgss123Rtp()의 선택 onProgress(event)(1.0.0부터)는 진행을 알린다.
| event 필드 | 내용 |
|---|---|
phase |
downloading, verifying, extracting, packaging, storing, ready 중 하나. verifying은 공식 원본의 pin 검사와 공식 ZIP에서 고정된 설치 파일 member를 꺼내는 단계를 포함한다 |
storedBytes |
이번 호출이 staging에 저장한 공식 원본 bytes. 재시도가 처음부터 다시 받으면 0으로 돌아간다 |
totalBytes |
고정된 공식 원본 크기. 캐시 적중과 legacy 입력에서는 null |
retries |
지금까지 예약한 다운로드 재시도 수 |
- 다운로드 중에는 저장한 chunk마다 event를 보내므로 화면 갱신 빈도는 host가 조절한다.
- 캐시 적중은
ready하나만 보낸다. - listener가 던진 오류는 준비 결과에 영향을 주지 않는다. 함수가 아닌 값은
RGSS123_RTP_OPTIONS_INVALID다.
legacy 입력과 반환 manifest
- legacy 입력
sourceArchivePath(operator-provided.mkxpz)와 strictlock도 유지한다. - 기본 조회는 공식 캐시를 우선하고, 없으면 legacy 캐시를 재사용한다.
sourceZipPath를 명시하면 공식 경로를 선택한다. - 공식 Ace는
1.0.0+official, legacy Ace는0.0.0+locked.f66bd7f3이므로 반환된 manifest의 버전·hash를 사용한다. - XP는
1.4.0+english이고 archive 이름은Game.iniRTP1=Standard에 맞춘Standard.mkxpz다. RTP IDRPGXP와 다르므로 browser artifactfileName은 반환된archivePath의 이름을 쓴다. - XP의 legacy lock은 공식 결과와 같은 bytes다.
- 원본을 보고 lock을 추정하거나 손상된 기존 캐시를 덮어쓰지 않는다.
- cache identity는 runtime 버전과 분리되며 host의 release binding·CAS·승인·generation·save 정책은 유지한다.
RTP CLI
CLI는 rgss123-release rtp-catalog, rgss123-release rtp-prepare CONFIG.json, rgss123-release rtp-get CONFIG.json이다. CONFIG는 API와 같은 JSON이며 signal과 onProgress를 제외한다. 최소 설정은 { "id": "RPGVXAce", "storeRoot": "/state/rgss123-rtp" }이다.
RTP 오류 code
- 0.1.14부터
getRgss123Rtp()·prepareRgss123Rtp()실패에code가 붙는다. message 문장은 0.1.13과 같지만 접두어가 1.0.0에서ARCA_RTP_*에서RGSS123_RTP_*로 바뀌었다. - message 대신
error.code: 접두어가 없던 실패도 code로 분류되므로 호스트는 message 대신error.code를 사용한다. - code는 실패한 단계가 직접 붙이므로 rgss123-web RTP 코드가 던지는 실패는 모두 아래의 구체 code를 갖는다.
- package 검증 실패는
RGSS123_RELEASE_*다. 불완전한 캐시의ENOENT같은 Node system error는 자신의 code를 유지한다. - 호출자
signal의 취소·timeout은error.name(AbortError·TimeoutError)으로 구분한다. - 다운로드의 rgss123-web 내부 제한(무수신·전체 시간)은 0.1.14까지
TimeoutError로 나왔지만 0.1.15부터는RGSS123_RTP_DOWNLOAD_FAILED이고error.cause.name이TimeoutError다. - 단 동봉 innoextract 실행 중 취소·시간 초과는 0.1.13과 같은
RGSS123_RTP_EXTRACT_FAILEDmessage·code이고error.cause가 취소 오류다. - 원래 오류는
error.cause에 남을 수 있다.
| code | 의미 |
|---|---|
RGSS123_RTP_CACHE_MISS |
준비된 캐시가 없음(getRgss123Rtp) |
RGSS123_RTP_CACHE_INVALID |
캐시가 있으나 lock·manifest·archive 내용·파일 형식이 맞지 않음(덮어쓰지 않음) |
RGSS123_RTP_SOURCE_REQUIRED |
오프라인 준비에 입력 ZIP·legacy archive가 필요함 |
RGSS123_RTP_OPTIONS_INVALID |
함께 쓸 수 없는 입력 옵션 조합 |
RGSS123_RTP_ID_UNSUPPORTED |
RPGVX·RPGVXAce·RPGXP가 아닌 ID. message는 1.0.0에서 ARCA supports only RPGVX and RPGVXAce RTP.가 rgss123 supports only RPGVX, RPGVXAce and RPGXP RTP.로 바뀌었다 |
RGSS123_RTP_LOCK_INVALID |
lock 형식 오류, ID·engine 불일치 또는 HTTPS가 아닌 source |
RGSS123_RTP_PLATFORM_UNSUPPORTED |
동봉 innoextract가 없는 platform |
RGSS123_RTP_DOWNLOAD_FAILED |
공식 다운로드의 HTTP·네트워크 실패 또는 무수신·전체 시간 제한 초과(재시도 대상은 재시도 후) |
RGSS123_RTP_INPUT_MISMATCH |
입력·다운로드의 이름·bytes·SHA-256이 lock과 다르거나 준비 중 입력이 바뀜 |
RGSS123_RTP_SOURCE_INVALID |
공식 ZIP·legacy archive의 구조, 고정 member 또는 portable payload 규칙 불일치 |
RGSS123_RTP_EXTRACT_FAILED |
동봉 innoextract 추출 실패 또는 추출본을 RTP archive로 만들 수 없음 |
RGSS123_RTP_PATH_UNSAFE |
RTP 경로에 link·junction이 있음 |
RGSS123_RTP_OUTPUT_FAILED |
store staging의 출력 파일 작성·게시 실패 |
RGSS123_RTP_FAILED |
어떤 RTP 단계도 분류하지 않은 실패(예: 손상된 release catalog) |
license
- 단일 MIT library가 아니다: native bundle에는 개별 재배포 조건이 있다. 패키지 전체를 단일 MIT library로 취급하지 말고
runtime/LICENSES/THIRD_PARTY_NOTICES.json과 동봉된 license/source provenance를 함께 배포한다.
RTP와 추출 도구의 license
- 공식 RTP 약관은 데이터 재배포에 사전 서면 동의를 요구한다.
- API는 실행 환경에서 원본을 취득·처리하며, 호출자는 이용·처리·제공에 필요한 권한을 확보해야 한다.
- 권한은 별도다: 다운로드 자동화와 hash 일치는 사용·재배포 권한을 부여하지 않는다.
- innoextract는 Daniel Scharrer의 Zlib license 도구다. 동봉 바이너리의 Boost, liblzma, libstdc++ runtime exception, Linux libbz2/zlib 등 전체 license는
rtp/tools/win32-x64/license/와rtp/tools/linux-x64/license/에 보존한다. - 원본 archive URL·크기·SHA-256과 포함 파일의 SHA-256은
rtp/innoextract.lock.json에 고정한다. - native runtime의 별도 license는
runtime/LICENSES/THIRD_PARTY_NOTICES.json을 따른다.