jetway is a messaging gateway for airline and global distribution system (GDS) reservation traffic. It terminates carrier links and decodes the messages that arrive on them. It keeps passenger name records (PNRs) and sends the replies. It is also a distribution system, a seat inventory and a departure control system (DCS). It is a datalink endpoint, an Aeronautical Fixed Telecommunication Network (AFTN) endpoint, a fare engine and a switch. wholesky needs each of those systems. Each system is usable on its own.
This is the function list of a reservations system, a GDS, a DCS and a Type B network. Every row is implemented and tested. A simulation of the world's schedule exercises every row daily.
| domain | messages |
|---|---|
| reservations · Type B | AIRIMP sell, reply, cancel, change · SSR · OSI · OSI/locator exchange · ticket numbers · remarks · received-from |
| reservations · EDIFACT | PAOREQ · PAORES · TKCREQ · TKCRES · CONTRL |
| settlement · file | BSP HOT (DISH 23): BFH01 BCH02 BOH03 · BKT06 BKS24 BKS30 BKS39 BKI63 BAR64 BAR65 BKP84 · BOT93 BOT94 BCT95 BFT99 |
| government · EDIFACT | PAXLST (APIS, WCO/IATA/ICAO guide) · PNRGOV push (PADIS guide, with the check-in group) |
| airport ↔ airport · EDIFACT | DCQCKI · DCRCKA (IATCI through check-in) |
| distribution · HTTP | NDC OrderCreateRQ · OrderRetrieveRQ · OrderCancelRQ · OrderViewRS |
| availability & schedule | AVS · SSM · ASM (CNL, EQT, TIM applied) · SSIM |
| reservations → airport | PNL (multi-part) · ADL |
| airport → world | PFS · PTM · PSM · ETL · LDM · CPM · BSM · BPM · BUM (rush bag) · AHL · OHD · FWD (tracing files) · loadsheet (AHM 560) |
| Network Manager → world | SAM · SRM · SLC · FLS · DES (ATFM slots, ADEXP) · SMM · REA · FCM · SPA · SRJ · RFI · SWM (the operator's replies) |
| aircraft & operations | MVT · MVA · DIV · ACARS OOOI (OUT OFF ON IN) |
| air traffic services | AFTN envelope · FPL · DEP · ARR · DLA · CNL · CHG |
| transports | Type B over framed TCP · MATIP (RFC 2351) · EDIFACT over TCP · HTTPS with mutual TLS · file drop · dialled trunk links between switches (link_dial + via routing) |
| records | POST /api/book · GET /api/pnrs · GET /api/pnr/{locator} · POST /api/pnr/{locator}/ticket · /emd · /split · /cancel |
|---|---|
| messages | GET /api/messages · GET /api/message/{id} · POST /api/message/{id}/replay · GET /api/stream |
| selling | GET /api/availability · GET /api/flights · GET /api/journeys · POST /ndc |
| work | GET /api/queues · GET /api/queue/{name} · POST /api/queue/item/{id}/work |
| carriers | GET /api/carrier/{designator}/pnrs · GET /api/carrier/{designator}/inventory · GET /api/insights |
| operating | GET /healthz · GET /readyz · GET /metrics · GET /api/status · POST /api/admin/retire · GET /api/admin/export |
The wire syntax is exact, and the message grammar is a profile. The envelope layers validate strictly, because ISO 9735 and the Type B envelope are universal. The layers above them vary by carrier and by bilateral agreement. Those layers are ordered recognisers, and you replace them per link without a fork. An unknown message still decodes at the syntax layer. The switch can capture, route and replay it even when no higher layer recognises it.
Type B is the teletype format that the SITA and ARINC store-and-forward networks carry.
jetway handles ISO 9735 interchanges that carry IATA Passenger and Airport Data Interchange Standards (PADIS) messages such as PAOREQ and PAORES. It sends and consumes CONTRL.
MATIP is the airline transport for teletype over IP. jetway implements the packet format and the Type B session handshake for the partners that connect this way.
NDC carries IATA order messages over HTTP. jetway supports create, retrieve, cancel and the order view. It maps them onto the same record store as the teletype and EDIFACT traffic. It refuses payloads that carry card numbers before capture. There is no encryption at rest.
Availability status (AVS) messages are a per-link profile. They feed a cache in which every entry carries its age and its source. An entry older than the trust window no longer counts, and the booking sends a request instead. The gateway free-sells where the cache offers a seat. It sends a request to the carrier where the cache does not.
SSM and ASM schedule messages are an extensible profile, and jetway reads and writes the SSIM chapter 7 schedule file. The file has header, carrier, flight leg and segment data records in the 200-column layout, with codeshares tied by DEI 010/050. A cancellation sent as ASM reaches distribution and the airport, and bookings under a marketing carrier's code receive the advice under that code. An equipment change (EQT) queues the holdings for reprotection. A time change (TIM) moves the held segments to the new times at TK and queues the advice. When the message gives the times in UTC, jetway converts them to the station's clock.
The passenger name record is an event-sourced projection with optimistic concurrency. Every change is an event that names the message that caused it. A write carries the version it read. The store refuses a stale write, and the write cannot overwrite a state it never saw. A gateway and a carrier can modify one record at the same instant, and that case is normal.
capture ▸ classify ▸ decode ▸ dedupe ▸ apply ▸ queue ▸ respond. The gateway makes the raw bytes durable before any stage interprets them. After a parser fix, the operator can replay the traffic that failed, and the partner does not need to retransmit. Unrecognised lines become fragments on the record. Undecodable messages go to the dead-letter queue with their bytes intact. The gateway discards no message.
There are confirmation, waitlist, unable, schedule change, ticketing and divergence queues. The pipeline places items on them. A time-based sweeper catches a request nobody answered and a deadline that passed. Each queue reports a count. An external-publisher seam is available.
The IROPS engine works the schedule-change queue. It looks at the next flights over the same city pair, the carrier's own flights first. It free-sells where the cache offers a seat, sends a request where it does not, and waits for each request until the carrier answers. A confirmed seat replaces the dead leg, with a sell and a cancel on the wire. The engine keeps and names a waitlist. A booking that no flight can carry stays on the queue for a person.
The package has the structure of a fare filing and carries no fares. ATPCO fares are licensed. Callers supply a tariff.
The package is a carrier's operations desk for a node that runs the carrier. It loads the schedule from the carrier's SSIM file. It runs departure control at the carrier's stations as the gateway's Ground, and the carrier's own name lists open its flights. It turns the OOOI reports into the MVT messages the network reads, with the AD and its ETA, the AA and the delay against schedule. It files the towers' and the Network Manager's messages against the callsign. ops: in the configuration turns a gateway into an airline, and lets an operator's own jetwayd fly one of wholesky's carriers.
The package covers air traffic flow management. It handles the Network Manager's slot allocation (SAM) with its calculated take-off time. It handles the revision, the cancellation of a slot requirement, the suspension and de-suspension of a flight, and the operator's replies. The messages are in ADEXP to EUROCONTROL's public manual, and tests check them against the manual's examples verbatim. The regulation cause combines the cause letter, the phase of flight and the IATA delay code, correlated as Annex D of the manual has them. A slot inside an AFTN envelope reaches an operations centre through the gateway's Ground seam.
The package checks flight crew legality against the flight time and flight duty period limits by report time and number of segments. It also holds the 2 hour extension for unforeseen circumstances and the 10 hour rest. The values are transcribed from the public rule and tested value by value. A duty is a report and its legs at their current times. The check returns legal, legal only on the extension, or timed out. It also gives the latest departure time before the crew times out.
Settlement runs on the Airline Accounting/Sales data file (HOT), which a Billing and Settlement Plan hands each airline for its agents' sales. The package writes and reads that file to IATA's public handbook, column by column, and tests check it against the handbook's own worked figures. It covers sales and refunds, over-punch signing, the document-amount, commission and remittance arithmetic of section 6.7, and office, cycle and file totals. Exchanges carry their original issue (BKS46), and agency debit and credit memos name the document they correct (BKS45). The package also writes and reads the agents' side, the RET of chapter 5. Ticket numbers reach teletype carriers as SSR TKNE, which lets their books reconcile.
The package holds the arithmetic of interline billing. It divides a through fare between the coupons of an itinerary by mileage. This method is straight rate proration. It rounds on the last coupon, and the shares add up to the fare. It computes the interline service charge that the carrier that flew keeps back. The Prorate Manual's minima, factors and special agreements are sold, and the package does not reproduce them.
The package is leg-based seat control as the textbooks describe it. The caller supplies the numbers.
The gateway sends the passenger name list at T−180, in as many parts as the list needs. It sends the additions and deletions list at T−60. Per-passenger elements name the passenger they belong to, for example a child or a cabin bag with its own seat. Ticket numbers are hyphenated. Pagination counts rendered lines rather than items.

The output of one departure's closure, as wholesky shows it. Every item comes from jetway's departure-control, movement and AFTN packages.
pkg/node is one assembly that both jetwayd and the scenario suite build. The tests drive the same assembly that the binary runs. Everything under pkg/ is importable. This lets wholesky host 518 gateways in one process.
jetwayctl retire --before drops the day. jetwayctl export --out streams every record as newline-delimited JSON for the archive a regulator asks about years later.docs/production-gcp.md.jetwayd is the gateway. By default it runs 3 simulated carriers and the console at :8080. Relay mode makes it a switch.jetwayctl decode captured.tty decodes any captured message. jetwayctl retire handles retention.jetwayload runs the scenario suite concurrently and reports latency.Paid IATA publications define most of these formats, and the project did not buy them. The table below states which layers are specified and which are inferred.
| layer | standing | source |
|---|---|---|
| edifact · CONTRL · matip | specified | ISO 9735, RFC 2351 |
| typeb limits · PDM | specified | IATA's public Type B whitepaper |
| padis | partly | the free PNRGOV implementation guide |
| ndc | specified | public schemas and carrier examples |
| aftn | specified | ICAO Annex 10 Vol II |
| ats | specified | FAA reproductions of Doc 4444 forms |
| inventory | method specified | leg-based nested authorisations, with the caller's numbers |
| dcs load control | method specified | AHM 560/565 arithmetic and representative fleet data |
| mvt · acars · PSM PTM LDM CPM | inferred, closely | OAG tables, verbatim examples and airports' reproductions of the practices |
| airimp · avs · ssim · PFS · ETL | inferred | profiles without conformance, because AIRIMP and SSIM are paywalled |
| fare | structure only | the structure of ATPCO filings and tickets. The filings are licensed and the package carries none |
The roadmap names each paid document and the cost of its absence. The documents therefore form one procurement decision. The AIRIMP divide message is the most expensive single absence. Without it, the gateway cannot advise a split booking to its carriers.