sabre-client 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Q as QueueRef } from './queue-ref-BDGh8FrV.js';
1
+ import { Q as QueueRef, X as QueueActivityCounters, a0 as ReservationHistoryTransaction, _ as ReservationHistoryFlightSegment, $ as ReservationHistoryText, Z as ReservationHistoryAccounting } from './reservation-history-bKDqkf8T.js';
2
2
 
3
3
  /** Un PNR del fake, con los campos que Sabre manda en `Line`. */
4
4
  interface QueueFakePnr {
@@ -20,32 +20,70 @@ interface QueueFakePnr {
20
20
  /** `Line/PassengerName`. Solo llega en `list` con `primaryPassenger: true`. */
21
21
  primaryPassenger?: string;
22
22
  }
23
+ /**
24
+ * Los contadores de `queue.activity` que se siembran para una cola. `numMessages` no va: sale
25
+ * siempre de lo que hay en la cola del fake.
26
+ */
27
+ type QueueFakeActivity = Partial<Omit<QueueActivityCounters, 'numMessages'>>;
28
+ /**
29
+ * Una transacción del historial de un PNR, como la devuelve `reservation.history`. Las listas que
30
+ * falten van vacías.
31
+ */
32
+ type QueueFakeHistoryTransaction = Omit<ReservationHistoryTransaction, 'flightSegments' | 'generalInfo' | 'remarks' | 'accounting'> & {
33
+ flightSegments?: readonly ReservationHistoryFlightSegment[];
34
+ generalInfo?: readonly ReservationHistoryText[];
35
+ remarks?: readonly ReservationHistoryText[];
36
+ accounting?: readonly ReservationHistoryAccounting[];
37
+ };
23
38
  /** Un PNR: sus campos, o solo el párrafo. Con solo el párrafo, el localizador sale de la línea de firma. */
24
39
  type QueueFakeItem = QueueFakePnr | readonly string[];
25
40
  interface QueueFakeOptions {
26
41
  /**
27
- * El contenido de cada cola, en orden. La clave es el número de cola (`'12'`, de 0 a 511) o el
28
- * nombre de una cola alfabética (`'S'`). El fake no distingue PCC: las colas son las mismas para
29
- * cualquier `pcc`.
42
+ * El contenido de cada cola, en orden. La clave es el número de cola (`'12'`, de 0 a 511), una
43
+ * cola alfabética (`'S'`, una o dos letras mayúsculas) o una cola con nombre (`'name:HOTELS'`, o
44
+ * `'HOTELS'` sin el prefijo). La alfabética y la con nombre viajan por atributos distintos
45
+ * (`Number` y `Name`, ADR-028). El fake no distingue PCC: las colas son las mismas para cualquier
46
+ * `pcc`.
47
+ *
48
+ * La `'S'` es la cola de mensajes: cada elemento es el texto de un mensaje (`string[]`), no un
49
+ * PNR. `access` lo muestra sin `Line`, como Sabre en CERT, e `ignore` lo deja en la cola. Que
50
+ * `remove` lo saque es un supuesto del fake: no se probó con Sabre.
30
51
  */
31
52
  queues?: Readonly<Record<string, readonly QueueFakeItem[]>>;
32
53
  /** PNR que no están en ninguna cola, para colocarlos con `place({ locators })`. */
33
54
  pnrs?: readonly QueueFakeItem[];
55
+ /**
56
+ * Los contadores de `queue.activity` por cola, con las mismas claves que `queues`. `numMessages`
57
+ * sale del estado del fake, como en `count`: sin el PNR en pantalla (CERT, #167). Los demás valen
58
+ * lo que se siembre aquí, o 0. Las acciones del fake (`ignore`, `remove`, `place`, `exit`) **no**
59
+ * los cambian: no se probó qué contador sube Sabre con cada una (Q-097).
60
+ */
61
+ activity?: Readonly<Record<string, QueueFakeActivity>>;
62
+ /**
63
+ * El historial de cada PNR para `reservation.history`, por localizador. Un PNR que el fake
64
+ * conoce y no está aquí devuelve una transacción sintética (la creación). Un localizador que
65
+ * el fake no conoce da un error de host marcado como no simulado.
66
+ */
67
+ histories?: Readonly<Record<string, readonly QueueFakeHistoryTransaction[]>>;
34
68
  /** Reloj de las fechas de `count` y de `place`. Por defecto, `new Date()`. Las fechas van en UTC. */
35
69
  now?: () => Date;
36
70
  }
37
71
  /** Qué le pidió el SDK al fake. */
38
- type QueueFakeCommand = 'open' | 'close' | 'ping' | 'count' | 'access' | 'list' | 'ignore' | 'remove' | 'exit' | 'place';
72
+ type QueueFakeCommand = 'open' | 'close' | 'ping' | 'count' | 'access' | 'list' | 'ignore' | 'remove' | 'exit' | 'place' | 'activity' | 'history';
39
73
  interface QueueFakeCall {
40
74
  command: QueueFakeCommand;
41
75
  /** La cola de `access` y `list`. */
42
76
  queue?: QueueRef;
77
+ /** El localizador de `history`. */
78
+ locator?: string;
43
79
  }
44
80
  interface QueueFake {
45
81
  /** Se pasa como `config.fetch` de `SabreLegacy`. */
46
82
  readonly fetch: typeof fetch;
47
83
  /** Los localizadores de una cola, en orden, con lo que el recorrido haya sacado o colocado. */
48
84
  locators(queue: QueueRef): string[];
85
+ /** El texto de los mensajes que siguen en la cola `S`, en orden. */
86
+ messages(): string[][];
49
87
  /** Las llamadas recibidas, en orden. */
50
88
  readonly calls: readonly QueueFakeCall[];
51
89
  /** Cuántas sesiones siguen abiertas: sirve para comprobar que el consumidor las cierra. */
@@ -59,6 +97,59 @@ interface QueueFake {
59
97
  }
60
98
  declare function createQueueFake(options?: QueueFakeOptions): QueueFake;
61
99
 
100
+ /** Qué dato real quedó en un texto: lo que devuelve `Anonymizer.leaks`. */
101
+ type AnonymizerLeak = 'secreto' | 'localizador' | 'nombre' | 'línea del PNR' | 'token';
102
+ interface AnonymizerOptions {
103
+ /**
104
+ * Valores que nunca deben quedar: credenciales, usuario, PCC. Cada uno pasa a `XXXX` donde
105
+ * aparezca. Se ignoran los que no son string o tienen menos de 3 caracteres.
106
+ */
107
+ secrets?: ReadonlyArray<string | undefined>;
108
+ }
109
+ /**
110
+ * Una anonimización con memoria: el mismo localizador da siempre el mismo alias y el mismo
111
+ * pasajero el mismo nombre falso, en todos los textos que pasen por ella. Una por grabación.
112
+ */
113
+ interface Anonymizer {
114
+ /**
115
+ * Un sobre SOAP o cualquier texto con su XML (también un JSON con XML adentro):
116
+ * - cada `UniqueID@ID` pasa a un alias (`AAAAAA`, `AAAAAB`…), y el localizador real se reemplaza
117
+ * por su alias en todo el texto;
118
+ * - `PassengerName` a `PASAJERO/UNO`, `PASAJERO/DOS`…, y `Group` a `GRUPO`;
119
+ * - `AgentSine` a `AAA` (salvo `SABRE`), `PseudoCityCode` a `XXXX` y `LNIATA` a `XXXXXX`;
120
+ * - cada `<Text>` pasa por `maskLine`;
121
+ * - los `secrets`, a `XXXX`.
122
+ */
123
+ anonymize(text: string): string;
124
+ /**
125
+ * Una línea del PNR en formato de host. Las de la lista blanca (`isSafeHostLine`) quedan tal
126
+ * cual; en las demás, letras a `X` y dígitos a `9`. La cabecera `QUEUE LIST FOR <PCC>` solo
127
+ * tapa el PCC, y `RECEIVED FROM - ` conserva el prefijo. La línea de firma
128
+ * (`… HHMM/DDMMMYY <localizador> H`) conserva su forma, y el localizador solo si ya es un alias:
129
+ * de ella sale el localizador del PNR siguiente en `place` dentro de una cola. Llamarla después
130
+ * de dar alias a los localizadores.
131
+ */
132
+ maskLine(line: string): string;
133
+ /** `maskLine` sobre cada línea de un párrafo, p. ej. `QueueItem.paragraph`. */
134
+ maskParagraph(lines: readonly string[]): string[];
135
+ /** El alias de un localizador: lo asigna la primera vez, en orden (`AAAAAA`, `AAAAAB`…). */
136
+ aliasOf(locator: string): string;
137
+ /**
138
+ * Qué datos reales siguen en `text`, sin repetir: un `secret`, un localizador o un nombre que ya
139
+ * tienen alias, una línea del PNR que se enmascaró, o un token de sesión. Vacío si no queda
140
+ * ninguno. Sirve para no escribir una fixture que todavía trae datos reales.
141
+ */
142
+ leaks(text: string): AnonymizerLeak[];
143
+ }
144
+ /**
145
+ * Si una línea del PNR en formato de host queda tal cual al anonimizar: está en la lista blanca de
146
+ * #96 (líneas vacías, avisos PIC como `011 SEE REMARKS`, títulos de sección como `REMARKS`, el fin
147
+ * de cola).
148
+ */
149
+ declare function isSafeHostLine(line: string): boolean;
150
+ /** Ver `Anonymizer`. */
151
+ declare function createAnonymizer(options?: AnonymizerOptions): Anonymizer;
152
+
62
153
  /** Una respuesta grabada: la operación del SDK, el HTTP status y el sobre SOAP tal cual llegó. */
63
154
  interface RecordedResponse {
64
155
  /** `operation` de `onRawResponse` (`'openSession'`, `'queue.access'`…) o `probe.*` si el script la mandó crudo. */
@@ -73,7 +164,12 @@ interface RecordedFixture {
73
164
  responses: readonly RecordedResponse[];
74
165
  }
75
166
  /**
76
- * Las corridas de producción del Tier 3:
167
+ * Las corridas de producción del Tier 3. Cada una usa sus propios alias de localizador, así que
168
+ * se pueden juntar en un fake con `queueFakePnrs` sin que choquen:
169
+ * - `walk`: `AAAAAA`–`AAAAAD`; `place`: `AAAAAE`–`AAAAAF`;
170
+ * `placeWithoutInstructionCodeInside`: `AAAAAG`–`AAAAAH`.
171
+ *
172
+ * Qué trae cada una:
77
173
  * - `walk`: `count`, `list`, `access` y `ignore` sobre una cola de 4 PNR hasta el fin de cola,
78
174
  * más `I` y `QXI` fuera de una cola;
79
175
  * - `emptyQueue`: `access` y `list` sobre una cola vacía (`QUEUE SELECTED WAS EMPTY`);
@@ -89,4 +185,30 @@ declare const queueFixtures: Readonly<{
89
185
  placeWithoutInstructionCodeInside: RecordedFixture;
90
186
  }>;
91
187
 
92
- export { type QueueFake, type QueueFakeCall, type QueueFakeCommand, type QueueFakeItem, type QueueFakeOptions, type QueueFakePnr, type RecordedFixture, type RecordedResponse, createQueueFake, queueFixtures };
188
+ /**
189
+ * Los PNR de una corrida grabada, listos para `createQueueFake`: primero los de `queue.list`, en
190
+ * su orden, y después los que aparecen en las demás respuestas de cola (`access`, `ignore`,
191
+ * `remove`, `place`), en el orden en que aparecen. Cada localizador sale una sola vez.
192
+ *
193
+ * - `placedAt`, `placedBy` y `primaryPassenger` salen del `Line` de `list`. Si el PNR no está en la
194
+ * lista, salen del `Line` del primer `access`, `ignore` o `remove` que lo trae (ahí `placedAt` es
195
+ * la última modificación del PNR, no su colocación en la cola).
196
+ * - `paragraph` es el del primer `access`, `ignore`, `remove` o `place` que muestra el PNR, tal
197
+ * cual. El localizador del párrafo sale del `Line`, o de la línea de firma si no hay `Line`
198
+ * (`place` dentro de una cola).
199
+ * - Un PNR que solo aparece como colocado (`place` fuera de una cola) va sin párrafo, y el fake le
200
+ * agrega una línea de firma.
201
+ *
202
+ * La cola en la que van los decide quien lo usa:
203
+ *
204
+ * ```ts
205
+ * createQueueFake({ queues: { '9': queueFakePnrs(queueFixtures.walk) } })
206
+ * ```
207
+ *
208
+ * Las fixtures de `queueFixtures` usan alias distintos (`walk`: `AAAAAA`–`AAAAAD`, `place`:
209
+ * `AAAAAE`–`AAAAAF`, `placeWithoutInstructionCodeInside`: `AAAAAG`–`AAAAAH`), así que los PNR de
210
+ * varias se pueden juntar en un mismo fake.
211
+ */
212
+ declare function queueFakePnrs(fixture: RecordedFixture): QueueFakePnr[];
213
+
214
+ export { type Anonymizer, type AnonymizerLeak, type AnonymizerOptions, type QueueFake, type QueueFakeActivity, type QueueFakeCall, type QueueFakeCommand, type QueueFakeHistoryTransaction, type QueueFakeItem, type QueueFakeOptions, type QueueFakePnr, type RecordedFixture, type RecordedResponse, createAnonymizer, createQueueFake, isSafeHostLine, queueFakePnrs, queueFixtures };