EN /HU | Belépés

WECP

WECP — WarpEngine Catalog Protocol: a WarpEngine API olvasó oldala, amivel a WarpEngine Client, a warpstore-motorok és az oldal beszél. JSON, camelCase kulcsok, snake_case query-paraméterek. Minden válasz hordozza a WarpEngine-Version fejlécet. Az Authorization: Bearer … mindenhol opcionális. Az /api/software-en kívül bármelyik végpont 404-e régebbi motort jelent, amiben nincs az adott képesség.

TS
type Timestamp = string   // ISO 8601 UTC, "2026-07-31T16:57:28.186Z"; hiányzó = "0001-01-01T00:00:00Z"
type Path = string        // szerver-relatív, "/file/…" vagy "/api/image/7"; a katalógus bázis-URL-je elé

GET /api/service

0.5-től. Mi ez a szerver, és hogyan lehet bejelentkezni. Az auth null, ahol nincs bejelentkezés.

TS
interface Service {
  engine: "warp_engine"
  version: string                 // motorverzió, ugyanaz, mint a WarpEngine-Version fejléc
  api: {
    version: number               // alakverzió, minden boríték `api` mezője (2)
    catalog: {
      pageSize: number            // per_page, ha az olvasó nem mondja
      maxPageSize: number         // a legtöbb, amit egy olvasó kérhet
    }
  }
  catalog: {
    gated: boolean                // kívánhat-e bármelyik itteni cím jogosultságot
  }
  auth: null | {
    schemes: ["bearer"]
    device: {                     // device authorization grant, RFC 8628
      authorizeUrl: string        // ide POST a bejelentkezés indításához
      tokenUrl: string            // ide POST a token pollozásához
      revokeUrl: string | null    // ide DELETE a kijelentkezéshez
      verificationUrl: string     // ahová a személy beírja a user code-ot
      interval: number            // másodperc két poll között
    }
  }
}

GET /api/software

A katalógus. page nélkül a teljes katalógus jön egy borítékban; page-gel egy lapja.

TS
interface SoftwareQuery {
  page?: number                   // 1-től; hiányzik = minden
  per_page?: number               // maxPageSize a plafon
  status?: string                 // vesszővel elválasztott státuszkulcsok
  platform?: string               // egy platformnév
  category?: string               // egy kategóriakulcs
  q?: string                      // címre és névre illesztve
  owner_id?: number               // egy kiadó szoftverei
  sort?: "title" | "updated" | "newest"
}

interface Catalog {
  api: number                     // 2; 0.13 előtti motoron hiányzik (sima lista)
  page: number
  perPage: number
  total: number                   // a szűrőkre illő szoftverek, minden lapon
  totalPages: number
  nextPage: number | null         // null-ig követni
  softwares: Entry[]
}

interface Entry {
  software: Software
  releases: Release[]             // legújabb elöl
  latestRelease: Release | null   // a legújabb, amelynek verziója nem "dev-…"
  webPlayableRelease: Release | null   // a latestRelease, ha van "html" assetje
  totalDownloads: number
  access: Access                  // 0.5-től, nyitott szabályzat alatt is ott van
}

interface Software {
  id: number
  ownerId: number
  name: string                    // a cím kulcsa
  title: string
  author: string
  desc: string                    // rövid leírás
  story: string                   // hosszú leírás
  license: string
  platform: string                // slug: "c64", "tic80", "godot", …; címkék az /api/builds-ben
  status: string                  // kulcs az /api/software/vocabulary-ból
  category: string | null         // 0.12-től; kulcs az /api/software/vocabulary-ból
  highlighted: boolean
  imageUrl: Path | null           // alapértelmezett borító
  images: { url: Path, isDefault: boolean, position: number }[]
  externalLinks: { id: number, softwareId: number, label: string, url: string }[]
  platformLinks: { name: string, url: string }[]
  createdAt: Timestamp
  updatedAt: Timestamp
  deletedAt: Timestamp | null
}

interface Release {
  id: number
  softwareId: number
  version: string                 // "1.0.0", vagy "dev-1.0.0-branch" a fő ágon kívül
  assets: Asset[]                 // ebből telepít egy áruház
  cartridgePath: Path | ""        // örökölt lapos mezők, ugyanazok az útvonalak, mint a megfelelő assetek
  sourcePath: Path | ""
  htmlFolderPath: Path | ""
  docsFolderPath: Path | ""
  downloadCount: number
  createdAt: Timestamp
  updatedAt: Timestamp
  deletedAt: Timestamp | null
}

interface Asset {
  kind: "html" | "win_x86" | "win_x64" | "linux_x64" | "linux_arm64"
      | "mac_universal" | "mac_x64" | "mac_arm64" | "cartridge" | "source" | "docs"
  path: Path                      // ezt add a GET /api/download?path= -nak
}

interface Access {
  gated: boolean                  // ez a cím kívánhat jogosultságot
  entitled: boolean | null        // true: letöltheti; false: nem; null: anonim hívó
  price: { amountCents: number, currency: string } | null
  purchaseUrl: string | null
  webUrl: string | null
}

GET /api/software/facets

0.13-tól. Ugyanazok a szűrők, mint az /api/software-en. Minden szám az, amit az érték a többi szűrő mellett mutatna.

TS
interface Facets {
  api: number
  total: number                   // minden szűrőre illő
  statuses: Record<string, number>     // státuszkulcs → darab
  platforms: Record<string, number>    // platform → darab
  categories: Record<string, number>   // kategóriakulcs → darab; "" a kategória nélkülieknek
}

GET /api/software/vocabulary

0.13-tól. A katalógus státuszai és kategóriái, megjelenítési sorrendben.

TS
interface Vocabulary {
  api: number
  statuses: {
    key: string                   // az érték, amit egy szoftver status-a hordoz
    label: string
    position: number
    defaultVisible: boolean       // saját preferencia nélküli áruház ezt listázza
    badge: string | null          // stílusjavaslat
  }[]
  categories: {
    key: string                   // az érték, amit egy szoftver category-ja hordoz
    label: string
    position: number
    count: number                 // hány látható szoftver viseli
  }[]
}

GET /api/software/highlighted

A kiemelt cím, vagy null.

TS
type Highlighted = Entry | null

GET /api/builds

Platformcímkék, és hogy melyik platform milyen assetfajtákat vár.

TS
interface Builds {
  platforms: Record<string, {     // platform slug →
    label: string                 // "TIC-80", "Plus/4", "LÖVE"
    kinds: Asset["kind"][]        // mit hordozhat egy kiadás ezen a platformon
  }>
  allKinds: Asset["kind"][]
}

GET /api/softwares/:name/builds

Egy cím asset-lefedettsége kiadásonként.

TS
interface SoftwareBuilds {
  platform: string
  expected: Asset["kind"][]
  releases: Record<string, {      // verzió →
    actual: Asset["kind"][]
    missing: Asset["kind"][]
  }>
}

GET /api/download?path=

A path (egy Asset.path) alatti fájl csatolmányként, naplózott letöltéssel. 302 a tárhely-URL-re, ha a tároló nem lokális — arra a hosztra ne küldd a bearer tokent. 400 üres path, 403 a hozzáférési szabályzat megtagadta, 404 nincs.

GET /file/*path

Ugyanazok a fájlok inline, letöltési napló nélkül: böngészőben játszható buildek, dokumentáció, borítók. 301, ha a tároló nem lokális, 403 megtagadásnál.

POST /api/auth/device

0.5-től, az auth.device.authorizeUrl címen. Bejelentkezést indít. 404, ahol az /api/service auth: null-t mond.

TS
interface DeviceRequest {
  client_name?: string            // hogyan hívják ezt az eszközt a személy fiókjában
}

interface DeviceCode {
  deviceCode: string              // ezzel pollozz
  userCode: string                // ezt mutasd meg, "WXYZ-1234"
  verificationUrl: string         // ide küldd a személyt
  interval: number                // másodperc két poll között; a leíróé fölött nyer
  expiresIn: number               // másodperc
}

POST /api/auth/device/token

Az auth.device.tokenUrl címen. Pollozz, amíg a state el nem dől. 404 vagy 410: az engedély eltűnt, kezdd újra.

TS
interface TokenRequest {
  device_code: string
}

interface TokenPoll {
  state: "pending" | "approved" | "denied" | "expired"
  token?: string                  // pontosan egyszer, azon a pollon, amely jóváhagyva találja
}

DELETE /api/auth/token

Az auth.device.revokeUrl címen. Visszavonja a kérésen utazó bearer tokent. 204 visszavonva, 401 nincs token.