@pinecall/room 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -13,11 +13,11 @@ that change it. The package has three entry points, and each one is for a differ
13
13
  |---|---|---|
14
14
  | `@pinecall/room` | the page | `room()`, the store of one conversation, `rowsOf`, `knownBy`, `brief` to draw it, and the karaoke of what is being said |
15
15
  | `@pinecall/room/react` | the page, in React | `useRoom()` and `useStore()` |
16
- | `@pinecall/room/server` | your server | `mint()`, `dial()` and `GatewayRefused`: the only code that touches the key |
16
+ | `@pinecall/room/server` | your server | `mint()`, `dial()`, `expect()` and `GatewayRefused`: the only code that touches the key |
17
17
 
18
18
  A conversation has two parts, and they are not the same thing. **The seat** is a LiveKit room: it
19
- carries the audio and the typed lines. **The log** is the call's record on the gateway, relayed by
20
- your server: every turn, every tool the agent called and what came back, the agent's own state, and
19
+ carries the audio and the typed lines. **The log** is the call's record on the gateway, read
20
+ straight from it with a token minted for that one call: every turn, every tool the agent called and what came back, the agent's own state, and
21
21
  at the end the cost and the score. The store joins the two. What the page draws is the log folded
22
22
  by `@pinecall/protocol`, the same fold the Pinecall console draws from.
23
23
 
@@ -47,7 +47,6 @@ const call = room({
47
47
  if (!answer.ok) throw new Error(body.detail ?? `the server answered ${answer.status}`);
48
48
  return body;
49
49
  },
50
- log: (call) => `/api/log?call=${encodeURIComponent(call)}`,
51
50
  });
52
51
 
53
52
  call.subscribe((state) => {
@@ -83,7 +82,7 @@ import { rowsOf } from "@pinecall/room";
83
82
 
84
83
  // `tokens` is the function from the page above.
85
84
  export function Visitor() {
86
- const call = useRoom({ tokens, log: (id) => `/api/log?call=${encodeURIComponent(id)}` });
85
+ const call = useRoom({ tokens });
87
86
 
88
87
  if (call.phase === "idle") return <button onClick={() => call.start("talk")}>Talk</button>;
89
88
  if (call.phase === "failed") return <p>{call.error}</p>;
@@ -102,22 +101,21 @@ export function Visitor() {
102
101
  `useRoom` makes one room per mounted component and closes it when the component unmounts. The
103
102
  options are read when they are used, not when the room is made, so a `tokens` written inline — a
104
103
  new function every render — is fine: the one from the last render is the one that runs. It hands
105
- back the state with the five verbs beside it.
104
+ back the state with the six verbs beside it.
106
105
 
107
106
  `useStore(store)` is the plain version: any store of this package, read with React's
108
107
  `useSyncExternalStore`. `useRoom` is `useStore` over a room it owns.
109
108
 
110
- ## Your server: the three routes
109
+ ## Your server: two routes
111
110
 
112
- The page never holds a key. Every question it asks goes to your own server, which asks the
113
- gateway with the org's key and hands back only what that one visitor needs. The key needs two
114
- scopes: `talk` (a ticket, a dial) and `calls` (reading a call's log). It never reaches the page.
111
+ The page never holds a key. It asks your server for a seat and, if you offer it, for a call to its
112
+ phone; your server asks the gateway with the org's key. The key needs the `talk` scope and never
113
+ reaches the page.
115
114
 
116
115
  | route | the page sends | your server does | it answers |
117
116
  |---|---|---|---|
118
- | `POST /api/token` | `{scope}`, `talk` or `chat` | `mint(key, {url, agent, scope})` | `{server_url, participant_token, call}` |
119
- | `GET /api/log?call=` | the call id, and `last-event-id` on a resume | streams `GET /v1/calls/{call}/events` with the key | the gateway's stream, its status passed through: `204` when the call is sealed |
120
- | `POST /api/call-me` | `{to}`, a number in E.164 | `dial(key, {url, agent, to})` | `{call}` |
117
+ | `POST /api/token` | `{scope}`, `talk` or `chat` | `mint(key, {url, agent, scope, log})` | the gateway's answer whole: `{server_url, participant_token, call, log_token}` |
118
+ | `POST /api/call-me` | `{to}`, a number in E.164 | `dial(key, {url, agent, to, log})` | `{call, log_token}` |
121
119
 
122
120
  The names of the routes are yours; the page only knows the functions you give `room()`. With
123
121
  Hono:
@@ -139,34 +137,25 @@ const refused = (error: unknown) => {
139
137
 
140
138
  app.post("/api/token", async (c) => {
141
139
  const { scope } = await c.req.json();
142
- return mint(KEY, { url, agent, scope }).then((minted) => c.json(minted), refused);
140
+ return mint(KEY, { url, agent, scope, log: "tenant" }).then((minted) => c.json(minted), refused);
143
141
  });
144
142
 
145
143
  app.post("/api/call-me", async (c) => {
146
144
  const { to } = await c.req.json();
147
- return dial(KEY, { url, agent, to }).then(({ call }) => c.json({ call }), refused);
148
- });
149
-
150
- app.get("/api/log", async (c) => {
151
- const call = c.req.query("call") ?? "";
152
- if (!mine(c, call)) return c.body(null, 404);
153
- const resume = c.req.header("last-event-id");
154
- const answer = await fetch(`${url}/v1/calls/${encodeURIComponent(call)}/events`, {
155
- headers: { authorization: `Bearer ${KEY}`, accept: "text/event-stream", ...(resume ? { "last-event-id": resume } : {}) },
156
- signal: c.req.raw.signal,
157
- });
158
- return new Response(answer.body, { status: answer.status, headers: { "content-type": "text/event-stream" } });
145
+ return dial(KEY, { url, agent, to, log: "tenant" }).then(({ call, log_token }) => c.json({ call, log_token }), refused);
159
146
  });
160
147
  ```
161
148
 
162
- The relay is four lines that matter: the call, the resume cursor, the key on the header, and the
163
- gateway's status and body passed through as they came. It forwards `last-event-id`, so a page
164
- whose stream dropped picks up where it was; and it passes a `204` through, so a sealed call is
165
- known to be over rather than retried.
149
+ **The log is read from the gateway, not relayed.** Beside the seat, the gateway mints a
150
+ `log_token`: it reads that one call's log, its state and its recording, for four hours, before
151
+ the call ends and after, and opens nothing else — no room, no other call, no verb. The page
152
+ follows `GET /v1/calls/{call}/events` with it, and those doors answer a page on any origin. Your
153
+ server keeps no list of the calls it opened, so restarting it touches no call a page is showing.
166
154
 
167
- `mine(c, call)` is yours to write, and it is not optional: a relay that streams any call id it is
168
- handed is a window onto every call of the org. Keep the call ids a visitor's session minted or
169
- dialled, and relay only those.
155
+ `log` is what the token reads the call through: `public` (the default) is the turns and the
156
+ state the agent declared public; `tenant` is everything — the tools, the latency, the cost — with a
157
+ `pii` field masked. Ask for `tenant` when the page draws those, as a demo does. `gateway` in
158
+ `room()` names your own box; `https://box.pinecall.io` otherwise.
170
159
 
171
160
  ## Have the agent call me
172
161
 
@@ -175,7 +164,6 @@ Give `room()` a `callMe`, and the page can ask for a phone call instead of a sea
175
164
  ```ts
176
165
  const call = room({
177
166
  tokens,
178
- log: (id) => `/api/log?call=${encodeURIComponent(id)}`,
179
167
  callMe: async (to) => {
180
168
  const answer = await fetch("/api/call-me", {
181
169
  method: "POST",
@@ -200,6 +188,48 @@ The gateway refuses a dial to a number that has never called or written to the o
200
188
  dials per minute and per day. Those refusals reach the page as a failed call with the gateway's
201
189
  sentence.
202
190
 
191
+ ## Let the visitor call you
192
+
193
+ Give `room()` an `expect`, and the page can show the agent's phone number and a four-digit code
194
+ instead: the visitor calls the number, keys the code on the phone (or says it, and the agent
195
+ claims it), and from that moment the page follows that call. Your server asks for the code:
196
+
197
+ ```ts
198
+ import { expect } from "@pinecall/room/server";
199
+
200
+ app.post("/api/expect", async (c) => expect(KEY, { url, agent, log: "tenant" }).then((code) => c.json(code), refused));
201
+ ```
202
+
203
+ The page hands the answer to the room as it came, and calls `byPhone()`:
204
+
205
+ ```ts
206
+ const call = room({ tokens, expect: async () => (await fetch("/api/expect", { method: "POST" })).json() });
207
+
208
+ await call.byPhone();
209
+ ```
210
+
211
+ The phase is `expecting` while the page waits, and `state.code` is `{code, number, expiresAt}`:
212
+ show "call `number` and key `code`", and `expiresAt` (seconds since the epoch) as a countdown if
213
+ you like. The page asks the gateway about the code with the code's own token, which reads that
214
+ code and nothing else; the gateway holds each ask up to 25 seconds, and a network that fails or a
215
+ `5xx` is asked again the way the log is. When a call claims the code the phase goes straight to
216
+ `live` — the caller is on the phone already — and the call is followed like any other: `call`,
217
+ the log, `speaking`, `ended`. A code lives ten minutes unless `ttl_s` says otherwise (60 to 1800
218
+ seconds); an expired one fails with "the code expired: ask for another". `leave()` while
219
+ `expecting` stops the asking at once.
220
+
221
+ The agent must answer at a phone number in the key's world, or `expect()` throws the gateway's
222
+ 409 naming the fix.
223
+
224
+ ## Relaying the log yourself
225
+
226
+ A page that must not reach the gateway — a network that only lets it talk to your own domain —
227
+ gives `room()` a `log` — `(call) => "/api/log?call=" + call` — and the log token is not used.
228
+ Your relay streams `GET /v1/calls/{call}/events` with the key, forwards `last-event-id`, and passes
229
+ the gateway's status and body through as they came. It must relay only the calls that visitor's
230
+ session opened: a relay that streams any call id it is handed is a window onto every call of the
231
+ org. `recording` is then `""`, and the recording is yours to relay too.
232
+
203
233
  ## What `state` says
204
234
 
205
235
  Every field is the truth at the moment it was published. A new state is a new object; one you were
@@ -207,15 +237,17 @@ handed is never changed afterwards, so it can be compared by reference and kept.
207
237
 
208
238
  | field | what it is |
209
239
  |---|---|
210
- | `phase` | `idle` · `opening` (minting, joining) · `ringing` (a phone call not yet answered) · `live` · `ended` · `failed` |
240
+ | `phase` | `idle` · `opening` (minting, joining) · `expecting` (a code shown, no call has claimed it yet) · `ringing` (a phone call not yet answered) · `live` · `ended` · `failed` |
211
241
  | `mode` | `talk`, `chat`, `phone`, or `null` before anything started |
212
242
  | `call` | the call id, once the tokens or the dial answered it; `""` before |
213
243
  | `error` | the sentence to show when `phase` is `failed`; `""` otherwise |
244
+ | `recording` | where the call's recording plays from, with its token: an `<audio src>` once the call has ended; `""` when the log is relayed |
214
245
  | `log` | the call as `@pinecall/protocol` folds it: `turns`, `tools`, `app_state`, `status`, `live` (the words being said right now), `cost` |
215
246
  | `entries` | every entry of the log read so far, in order |
216
247
  | `connection` | the log's stream: `connecting` · `live` · `reconnecting` · `ended` (also before anything opened) |
217
248
  | `wantsSound` | `true` when the browser has not let the page play sound yet: show a button that calls `playSound()` |
218
249
  | `speaking` | `{agent, user, level}`: who is making a sound right now, and how loud the agent is, 0 to 1 |
250
+ | `code` | `{code, number, expiresAt}` once `byPhone()` has a code to show; `null` otherwise |
219
251
 
220
252
  The phase and everything around it — `error`, `connection`, `wantsSound`, `speaking` — are
221
253
  published the moment they change. The log is painted at most ten times a second: a burst of
@@ -226,8 +258,9 @@ score are entries that arrive after the visitor has gone, so `cost` is `null` un
226
258
  which comes after `call.ended`. The stream is followed until `call.score`, the last thing a log ever
227
259
  says, or for `linger` milliseconds after the call ended (60 000 by default: the worker notices a caller has gone some twenty seconds after the fact, and the score comes after that), whichever is first.
228
260
 
229
- A stream that drops is opened again from the last entry read, after half a second, doubling to
230
- eight seconds while the relay does not answer.
261
+ A stream that drops, a network that fails, or a gateway answering `5xx` — a proxy while the gateway
262
+ behind it restarts, a deploy — is asked again from the last entry read, after half a second,
263
+ doubling to eight seconds, for as long as it takes. A `4xx` is the gateway saying no, and ends it.
231
264
 
232
265
  ## Drawing the conversation
233
266
 
@@ -310,12 +343,18 @@ Nothing fails silently. Every refusal is a phase and a sentence, or a rejected p
310
343
  | `livekit-client` could not be loaded | `failed`, `error` is the loader's message |
311
344
  | `callMe` threw | `failed`, `error` is its message |
312
345
  | `callMe()` on a room given no `callMe` | `failed`, `error` says so |
313
- | the log relay answered something other than 2xx or 204 | on the phone: `failed`, "the log answered 401". In a room: `connection` is `ended` and the phase is left to the seat, which is the call |
346
+ | `expect` threw | `failed`, `error` is its message |
347
+ | `byPhone()` on a room given no `expect` | `failed`, `error` says so |
348
+ | the code expired before a call claimed it | `failed`, "the code expired: ask for another" |
349
+ | the gateway answered a `4xx` about the code | `failed`, "the code answered 403" |
350
+ | the log answered a `4xx` | on the phone: `failed`, "the log answered 401". In a room: `connection` is `ended` and the phase is left to the seat, which is the call |
351
+ | the log answered a `5xx`, or its stream dropped | `connection` is `reconnecting`, and it resumes where it was; nothing ends |
352
+ | `tokens` or `callMe` answered no `log_token`, and there is no `log` to relay it | `failed`, `error` says so |
314
353
  | the room closed from the other side | `ended`; the log is read on until the score |
315
354
  | an entry of the log this version cannot read | skipped; `onSkipped(why)` is called, and the rest of the call still draws |
316
355
  | `send()` outside a live seat | the promise rejects with "not in a call"; an empty line is nothing |
317
356
 
318
- On the server, `mint` and `dial` throw `GatewayRefused` for a refusal: `status` is the gateway's,
357
+ On the server, `mint`, `dial` and `expect` throw `GatewayRefused` for a refusal: `status` is the gateway's,
319
358
  and `detail` its sentence when it sent one (`null` when the body was not the gateway's JSON). The
320
359
  sentence names the fix — a quota, a scope the key does not hold, a number the org cannot call —
321
360
  so pass it on rather than rewording it.
package/dist/code.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /** A code the page shows a caller, waited on: the gateway asked with the code's token until a call claims it or it expires. */
2
+ import type { Code } from "./server/index.js";
3
+ /** How the wait came out: the call that claimed the code, or the sentence to show instead. */
4
+ export type Claim = {
5
+ kind: "claimed";
6
+ call: string;
7
+ log_token: string | null;
8
+ } | {
9
+ kind: "failed";
10
+ error: string;
11
+ };
12
+ /** Ask `gateway` about `code` until a call claims it or it expires. Null when `signal` stopped it first. */
13
+ export declare function claimOf(gateway: string, code: Code, fetcher: typeof fetch, signal: AbortSignal): Promise<Claim | null>;
14
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAAA,+HAA+H;AAS/H,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,8FAA8F;AAC9F,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAKpH,4GAA4G;AAC5G,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CA4B5H"}
package/dist/code.js ADDED
@@ -0,0 +1,46 @@
1
+ /** A code the page shows a caller, waited on: the gateway asked with the code's token until a call claims it or it expires. */
2
+ //
3
+ // The gateway holds each ask up to 25 s and answers `waiting` when nothing happened, so the page
4
+ // asks again at once. A network that fails or a `5xx` — a gateway restarting under a deploy — is
5
+ // asked again the way the log's stream is, backing off; a `4xx` is the gateway saying no.
6
+ import { CodeStandingSchema } from "@pinecall/protocol";
7
+ import { AWAY, Backoff } from "./log/backoff.js";
8
+ const EXPIRED = "the code expired: ask for another";
9
+ const UNKNOWN = "the gateway answered the code with a shape this package does not know";
10
+ /** Ask `gateway` about `code` until a call claims it or it expires. Null when `signal` stopped it first. */
11
+ export async function claimOf(gateway, code, fetcher, signal) {
12
+ const url = `${gateway}/v1/codes/${encodeURIComponent(code.code)}?wait=1&token=${encodeURIComponent(code.code_token)}`;
13
+ const backoff = new Backoff();
14
+ while (!signal.aborted) {
15
+ let body;
16
+ try {
17
+ const answer = await fetcher(url, { signal });
18
+ if (answer.status >= AWAY) {
19
+ await answer.body?.cancel().catch(() => undefined);
20
+ await backoff.wait(signal);
21
+ continue;
22
+ }
23
+ if (!answer.ok)
24
+ return { kind: "failed", error: `the code answered ${answer.status}` };
25
+ body = await answer.json();
26
+ }
27
+ catch {
28
+ // The network failed, or the answer broke before it was whole: the same as a 5xx.
29
+ if (signal.aborted)
30
+ return null;
31
+ await backoff.wait(signal);
32
+ continue;
33
+ }
34
+ const standing = CodeStandingSchema.safeParse(body);
35
+ if (!standing.success)
36
+ return { kind: "failed", error: UNKNOWN };
37
+ backoff.reset();
38
+ const { status, call, log_token } = standing.data;
39
+ if (status === "expired")
40
+ return { kind: "failed", error: EXPIRED };
41
+ if (status === "claimed")
42
+ return call === null ? { kind: "failed", error: UNKNOWN } : { kind: "claimed", call, log_token };
43
+ }
44
+ return null;
45
+ }
46
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAAA,+HAA+H;AAC/H,EAAE;AACF,iGAAiG;AACjG,iGAAiG;AACjG,0FAA0F;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,OAAO,GAAG,mCAAmC,CAAC;AACpD,MAAM,OAAO,GAAG,uEAAuE,CAAC;AAExF,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,IAAU,EAAE,OAAqB,EAAE,MAAmB;IACnG,MAAM,GAAG,GAAG,GAAG,OAAO,aAAa,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IACvH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvF,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,kFAAkF;YAClF,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACpE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7H,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /** @pinecall/room: the caller's side of a Pinecall call in a browser — one store, no framework. */
2
2
  export { room } from "./room.js";
3
- export type { Minted, Mode, Phase, RoomOptions, RoomState, RoomStore } from "./room.js";
3
+ export type { Code, Minted, Mode, Phase, RoomOptions, RoomState, RoomStore } from "./room.js";
4
4
  export type { Store } from "./store.js";
5
5
  export type { Connection } from "./log/follow.js";
6
6
  export type { Speaking } from "./seat/join.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxF,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC9F,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** How a gateway that is away is asked again: half a second, doubling to eight, for as long as it takes. */
2
+ /** From here up the gateway, or the proxy in front of it, is away rather than saying no. */
3
+ export declare const AWAY = 500;
4
+ /** One asker's pause between tries. `reset` once the gateway has answered. */
5
+ export declare class Backoff {
6
+ #private;
7
+ /** Sleeps the current pause, cut short by `signal`, and doubles the next one. */
8
+ wait(signal: AbortSignal): Promise<void>;
9
+ reset(): void;
10
+ }
11
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/log/backoff.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAQ5G,4FAA4F;AAC5F,eAAO,MAAM,IAAI,MAAM,CAAC;AAExB,8EAA8E;AAC9E,qBAAa,OAAO;;IAGlB,iFAAiF;IAC3E,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7C;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,30 @@
1
+ /** How a gateway that is away is asked again: half a second, doubling to eight, for as long as it takes. */
2
+ // A dropped stream is opened again after this, doubling to the ceiling: a gateway restarting is
3
+ // seconds, and a page hammering it every 100 ms would only make those seconds longer. A 5xx is the
4
+ // same thing seen from a proxy — the gateway behind it is restarting — and is asked again too.
5
+ const FIRST_MS = 500;
6
+ const CEILING_MS = 8_000;
7
+ /** From here up the gateway, or the proxy in front of it, is away rather than saying no. */
8
+ export const AWAY = 500;
9
+ /** One asker's pause between tries. `reset` once the gateway has answered. */
10
+ export class Backoff {
11
+ #ms = FIRST_MS;
12
+ /** Sleeps the current pause, cut short by `signal`, and doubles the next one. */
13
+ async wait(signal) {
14
+ await slept(this.#ms, signal);
15
+ this.#ms = Math.min(this.#ms * 2, CEILING_MS);
16
+ }
17
+ reset() {
18
+ this.#ms = FIRST_MS;
19
+ }
20
+ }
21
+ function slept(ms, signal) {
22
+ return new Promise((wake) => {
23
+ const timer = setTimeout(wake, ms);
24
+ signal.addEventListener("abort", () => {
25
+ clearTimeout(timer);
26
+ wake();
27
+ }, { once: true });
28
+ });
29
+ }
30
+ //# sourceMappingURL=backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/log/backoff.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAE5G,gGAAgG;AAChG,mGAAmG;AACnG,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,4FAA4F;AAC5F,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AAExB,8EAA8E;AAC9E,MAAM,OAAO,OAAO;IAClB,GAAG,GAAG,QAAQ,CAAC;IAEf,iFAAiF;IACjF,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACtB,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAmB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC;QACT,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -2,7 +2,7 @@
2
2
  import { type SseMessage } from "./sse.js";
3
3
  /** What the page can honestly say about its stream. Nothing here is a guess. */
4
4
  export type Connection = "connecting" | "live" | "reconnecting" | "ended";
5
- /** Why a follow stopped by itself: the score arrived, the call was sealed, or the relay said no. */
5
+ /** Why a follow stopped by itself: the score arrived, the call was sealed, or the gateway said no. */
6
6
  export type Ending = {
7
7
  kind: "scored";
8
8
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAIjG,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtD,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC;AAE1E,oGAAoG;AACpG,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,gGAAgG;IAChG,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAUD,8FAA8F;AAC9F,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,GAAG,MAAM,IAAI,CAsE3F"}
1
+ {"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAKjG,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtD,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC;AAE1E,sGAAsG;AACtG,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,gGAAgG;IAChG,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAKD,8FAA8F;AAC9F,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,GAAG,MAAM,IAAI,CA0E3F"}
@@ -1,17 +1,14 @@
1
1
  /** Follow a call's log over fetch: from where it was, through a dropped stream, to the score. */
2
2
  import { TERMINAL_EVENT } from "@pinecall/protocol";
3
+ import { AWAY, Backoff } from "./backoff.js";
3
4
  import { SseParser } from "./sse.js";
4
- // A dropped stream is opened again after this, doubling to the ceiling: a gateway restarting is
5
- // seconds, and a page hammering it every 100 ms would only make those seconds longer.
6
- const RECONNECT_MS = 500;
7
- const RECONNECT_CEILING_MS = 8_000;
8
5
  // The relay answers 204 to a sealed call whose cursor is at the end: nothing more will be said.
9
6
  const NOTHING_MORE = 204;
10
7
  /** Open the log at `url`. Returns the call that stops it; stopping twice is stopping once. */
11
8
  export function followLog(url, reader, fetcher) {
12
9
  const controller = new AbortController();
13
10
  let lastId = null;
14
- let backoff = RECONNECT_MS;
11
+ const backoff = new Backoff();
15
12
  let ours = true;
16
13
  const stop = () => {
17
14
  ours = false;
@@ -23,8 +20,7 @@ export function followLog(url, reader, fetcher) {
23
20
  };
24
21
  const again = async () => {
25
22
  reader.onConnection("reconnecting");
26
- await slept(backoff, controller.signal);
27
- backoff = Math.min(backoff * 2, RECONNECT_CEILING_MS);
23
+ await backoff.wait(controller.signal);
28
24
  };
29
25
  const read = async (body) => {
30
26
  const parser = new SseParser();
@@ -64,10 +60,15 @@ export function followLog(url, reader, fetcher) {
64
60
  return;
65
61
  if (answer.status === NOTHING_MORE)
66
62
  return end({ kind: "sealed" });
63
+ if (answer.status >= AWAY) {
64
+ await answer.body?.cancel().catch(() => undefined);
65
+ await again();
66
+ continue;
67
+ }
67
68
  if (!answer.ok || answer.body === null)
68
69
  return end({ kind: "refused", status: answer.status });
69
70
  reader.onConnection("live");
70
- backoff = RECONNECT_MS;
71
+ backoff.reset();
71
72
  try {
72
73
  await read(answer.body);
73
74
  }
@@ -84,13 +85,4 @@ export function followLog(url, reader, fetcher) {
84
85
  void connect();
85
86
  return stop;
86
87
  }
87
- function slept(ms, signal) {
88
- return new Promise((wake) => {
89
- const timer = setTimeout(wake, ms);
90
- signal.addEventListener("abort", () => {
91
- clearTimeout(timer);
92
- wake();
93
- }, { once: true });
94
- });
95
- }
96
88
  //# sourceMappingURL=follow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"follow.js","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"follow.js","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { type Lit, type RoomOptions, type RoomState, type RoomStore, type Store
3
3
  /** The store's state, re-rendering when it changes. Any store of this package. */
4
4
  export declare function useStore<T>(store: Store<T>): T;
5
5
  /** What `useRoom` hands a component: the state, and the verbs to change it. */
6
- export type RoomHandle = RoomState & Pick<RoomStore, "start" | "send" | "callMe" | "leave" | "playSound">;
6
+ export type RoomHandle = RoomState & Pick<RoomStore, "start" | "send" | "callMe" | "byPhone" | "leave" | "playSound">;
7
7
  /**
8
8
  * One room for as long as the component is mounted, closed when it unmounts. The options are read
9
9
  * when they are used, never when the room was made: a `tokens` written inline, new every render,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAItG,OAAO,EAAyB,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAE5H,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAI9C;AAED,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AAE1G;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAuBxD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAqBpE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAItG,OAAO,EAAyB,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAE5H,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAI9C;AAED,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AAEtH;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAuBxD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAqBpE"}
@@ -33,8 +33,8 @@ export function useRoom(options) {
33
33
  };
34
34
  }, [store]);
35
35
  const state = useStore(store);
36
- const { start, send, callMe, leave, playSound } = store;
37
- return { ...state, start, send, callMe, leave, playSound };
36
+ const { start, send, callMe, byPhone, leave, playSound } = store;
37
+ return { ...state, start, send, callMe, byPhone, leave, playSound };
38
38
  }
39
39
  /**
40
40
  * The agent's reply as the voice says it: `lit` has sounded, `coming` has not, or null when nobody
@@ -68,12 +68,18 @@ function readingLatest(latest) {
68
68
  get tokens() {
69
69
  return latest.current.tokens;
70
70
  },
71
+ get gateway() {
72
+ return latest.current.gateway;
73
+ },
71
74
  get log() {
72
75
  return latest.current.log;
73
76
  },
74
77
  get callMe() {
75
78
  return latest.current.callMe;
76
79
  },
80
+ get expect() {
81
+ return latest.current.expect;
82
+ },
77
83
  get linger() {
78
84
  return latest.current.linger;
79
85
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Where a call is read: the tenant's relay when it gave one, the gateway with the call's own token otherwise. */
2
+ import type { Minted } from "./server/index.js";
3
+ import type { RoomOptions } from "./room.js";
4
+ /** The gateway the page asks, with no slash at the end. */
5
+ export declare function gatewayOf(options: Pick<RoomOptions, "gateway">): string;
6
+ /** The call's log and its recording. None when neither a relay nor a token is there to read it with. */
7
+ export declare function readingOf(options: Pick<RoomOptions, "gateway" | "log">, call: string, token: string | undefined, minted?: Minted): {
8
+ log: string;
9
+ recording: string;
10
+ } | null;
11
+ //# sourceMappingURL=reading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reading.d.ts","sourceRoot":"","sources":["../src/reading.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAElH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,CAEvE;AAED,wGAAwG;AACxG,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,KAAK,CAAC,EAC7C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,CAAC,EAAE,MAAM,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ3C"}
@@ -0,0 +1,18 @@
1
+ /** Where a call is read: the tenant's relay when it gave one, the gateway with the call's own token otherwise. */
2
+ const GATEWAY = "https://box.pinecall.io";
3
+ /** The gateway the page asks, with no slash at the end. */
4
+ export function gatewayOf(options) {
5
+ return (options.gateway ?? GATEWAY).replace(/\/+$/, "");
6
+ }
7
+ /** The call's log and its recording. None when neither a relay nor a token is there to read it with. */
8
+ export function readingOf(options, call, token, minted) {
9
+ if (options.log !== undefined) {
10
+ return { log: minted === undefined ? options.log(call) : options.log(call, minted), recording: "" };
11
+ }
12
+ if (typeof token !== "string" || token === "")
13
+ return null;
14
+ const at = `${gatewayOf(options)}/v1/calls/${encodeURIComponent(call)}`;
15
+ const ticket = `?token=${encodeURIComponent(token)}`;
16
+ return { log: `${at}/events${ticket}`, recording: `${at}/recording${ticket}` };
17
+ }
18
+ //# sourceMappingURL=reading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reading.js","sourceRoot":"","sources":["../src/reading.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAKlH,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAE1C,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CAAC,OAAqC;IAC7D,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,SAAS,CACvB,OAA6C,EAC7C,IAAY,EACZ,KAAyB,EACzB,MAAe;IAEf,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACtG,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,MAAM,MAAM,GAAG,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,MAAM,EAAE,EAAE,CAAC;AACjF,CAAC"}
package/dist/room.d.ts CHANGED
@@ -3,11 +3,11 @@ import { type Entry, type State } from "@pinecall/protocol";
3
3
  import { type Connection } from "./log/follow.js";
4
4
  import { type Speaking } from "./seat/join.js";
5
5
  import { type LivekitModule } from "./seat/livekit.js";
6
- import type { Minted } from "./server/index.js";
6
+ import type { Code, Minted } from "./server/index.js";
7
7
  import { type Store } from "./store.js";
8
- export type { Minted };
9
- /** Where the conversation is. `ringing` is a phone call nobody has answered yet. */
10
- export type Phase = "idle" | "opening" | "ringing" | "live" | "ended" | "failed";
8
+ export type { Code, Minted };
9
+ /** Where the conversation is. `ringing`: a phone call nobody answered yet; `expecting`: a code no call claimed yet. */
10
+ export type Phase = "idle" | "opening" | "expecting" | "ringing" | "live" | "ended" | "failed";
11
11
  /** Spoken, written, or on the visitor's own phone. The same agent every way. */
12
12
  export type Mode = "talk" | "chat" | "phone";
13
13
  /** Everything the page draws from. Every field is the truth at the moment it was published. */
@@ -17,6 +17,8 @@ export interface RoomState {
17
17
  call: string;
18
18
  /** The sentence to show when phase is "failed". */
19
19
  error: string;
20
+ /** Where the call's recording plays from once it has ended, or "" when the log is relayed. */
21
+ recording: string;
20
22
  /** The call as the protocol folds it: turns, tools, the agent's state, the cost once it is known. */
21
23
  log: State;
22
24
  entries: Entry[];
@@ -24,16 +26,28 @@ export interface RoomState {
24
26
  /** True when the browser has not been told it may make a sound: ask for a click. */
25
27
  wantsSound: boolean;
26
28
  speaking: Speaking;
29
+ /** The code to show beside the number to call, from `expecting` on; `expiresAt` in seconds since the epoch. */
30
+ code: {
31
+ code: string;
32
+ number: string;
33
+ expiresAt: number;
34
+ } | null;
27
35
  }
28
36
  export interface RoomOptions {
29
37
  /** A ticket for a seat, from the tenant's own server. The page never holds a key. */
30
38
  tokens: (scope: "talk" | "chat") => Promise<Minted>;
31
- /** The URL the call's log is relayed at by the tenant's server. */
32
- log: (call: string, minted?: Minted) => string;
33
- /** Ask the tenant's server to have the agent call `to`. */
39
+ /** The gateway the log is read from with the call's own token. Default `https://box.pinecall.io`. */
40
+ gateway?: string | undefined;
41
+ /** The URL the call's log is relayed at by the tenant's server, for a page that must not reach
42
+ * the gateway itself. Given, the log token is not used. */
43
+ log?: ((call: string, minted?: Minted) => string) | undefined;
44
+ /** Ask the tenant's server to have the agent call `to`: the call, and its log token. */
34
45
  callMe?: ((to: string) => Promise<{
35
46
  call: string;
47
+ log_token?: string | undefined;
36
48
  }>) | undefined;
49
+ /** Ask the tenant's server for a code the visitor keys when they call the agent's number. */
50
+ expect?: (() => Promise<Code>) | undefined;
37
51
  /** How long the log is read after the seat closes, waiting for the score. Default 60 000 ms: a worker
38
52
  * notices a caller has gone some twenty seconds after the fact, and the score comes after that. */
39
53
  linger?: number | undefined;
@@ -46,6 +60,7 @@ export interface RoomStore extends Store<RoomState> {
46
60
  start(mode: "talk" | "chat"): Promise<void>;
47
61
  send(text: string): Promise<void>;
48
62
  callMe(to: string): Promise<void>;
63
+ byPhone(): Promise<void>;
49
64
  leave(): Promise<void>;
50
65
  playSound(): void;
51
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA,kHAAkH;AASlH,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAa,KAAK,UAAU,EAAe,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAQ,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,oFAAoF;AACpF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjF,gFAAgF;AAChF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,oFAAoF;IACpF,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,qFAAqF;IACrF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,mEAAmE;IACnE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACjE;uGACmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IACrD,kGAAkG;IAClG,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IACjD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,IAAI,CAAC;CACnB;AAkBD,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAuOpD"}
1
+ {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
package/dist/room.js CHANGED
@@ -2,14 +2,17 @@
2
2
  //
3
3
  // Two things happen at once and they are not the same thing. LiveKit carries the audio and the
4
4
  // typed lines — the room the visitor joins with a ticket the tenant's own server minted, so the
5
- // org's key never reaches a browser. The call's LOG, relayed by that same server, carries what the
6
- // agent is actually doing: the turns, every tool it called and what came back, its declared state.
5
+ // org's key never reaches a browser. The call's LOG, read straight from the gateway with the token
6
+ // minted beside that ticket for that one call, carries what the agent is actually doing: the turns, every tool it called and what came back, its declared state.
7
7
  // The log is folded by the protocol's own reducer, so what the page draws is what the console
8
- // draws, from the same bytes. A phone call has no seat at all: the log is the whole of it.
8
+ // draws, from the same bytes. A phone call has no seat at all: the log is the whole of it — and
9
+ // when the visitor calls the agent, a code they key on the phone names the call the page follows.
9
10
  import { initialState } from "@pinecall/protocol";
11
+ import { claimOf } from "./code.js";
10
12
  import { LogFold } from "./log/fold.js";
11
13
  import { followLog } from "./log/follow.js";
12
14
  import { joinSeat } from "./seat/join.js";
15
+ import { gatewayOf, readingOf } from "./reading.js";
13
16
  import { loadLivekit } from "./seat/livekit.js";
14
17
  import { hiddenSink } from "./seat/sink.js";
15
18
  import { cell } from "./store.js";
@@ -19,6 +22,8 @@ const PARTING_MS = 3_000;
19
22
  const QUIET = { agent: false, user: false, level: 0 };
20
23
  const NO_MICROPHONE = "I could not get to your microphone. Check the browser's permission, or write instead.";
21
24
  const NO_CALL_ME = "room() was given no callMe: the call is placed by your server";
25
+ const NO_EXPECT = "room() was given no expect: the code is asked for by your server";
26
+ const NO_LOG_TOKEN = "the server answered no log_token, and room() was given no log to relay it through";
22
27
  /** A room for one visitor. Nothing opens until a verb is called. */
23
28
  export function room(options) {
24
29
  const store = cell(idle());
@@ -26,12 +31,13 @@ export function room(options) {
26
31
  const parting = new Set();
27
32
  let now = null;
28
33
  let closed = false;
29
- const busy = () => ["opening", "ringing", "live"].includes(store.state.phase);
34
+ const busy = () => ["opening", "expecting", "ringing", "live"].includes(store.state.phase);
30
35
  const current = (c) => now === c;
31
36
  // The follow and the seat down, now. Returns the seat's leaving, for a caller that waits on it.
32
37
  const shut = (c) => {
33
38
  c.stopFollow?.();
34
39
  c.stopFollow = null;
40
+ c.waiting?.abort();
35
41
  if (c.linger !== null)
36
42
  clearTimeout(c.linger);
37
43
  c.linger = null;
@@ -47,7 +53,7 @@ export function room(options) {
47
53
  if (now !== null)
48
54
  void shut(now);
49
55
  const fold = new LogFold((why) => options.onSkipped?.(why));
50
- const c = { mode, fold, seat: null, stopFollow: null, linger: null };
56
+ const c = { mode, fold, seat: null, stopFollow: null, waiting: null, linger: null };
51
57
  now = c;
52
58
  publish({ ...idle(), phase: "opening", mode, connection: "connecting" });
53
59
  return c;
@@ -62,6 +68,7 @@ export function room(options) {
62
68
  // the agent's last words, the cost and the score are entries that arrive after the room closed.
63
69
  const end = (c) => {
64
70
  publish({ phase: "ended", wantsSound: false, speaking: QUIET });
71
+ c.waiting?.abort();
65
72
  const seat = c.seat;
66
73
  c.seat = null;
67
74
  if (c.stopFollow !== null && c.linger === null) {
@@ -195,10 +202,13 @@ export function room(options) {
195
202
  }
196
203
  if (!current(c) || store.state.phase !== "opening")
197
204
  return;
198
- publish({ call: minted.call });
205
+ const reading = readingOf(options, minted.call, minted.log_token, minted);
206
+ if (reading === null)
207
+ return fail(c, NO_LOG_TOKEN);
208
+ publish({ call: minted.call, recording: reading.recording });
199
209
  // The call id exists before the room is joined, so the log is followed from its first entry
200
210
  // rather than from wherever the room happened to open.
201
- follow(c, options.log(minted.call, minted));
211
+ follow(c, reading.log);
202
212
  await seated(c, mode, minted);
203
213
  },
204
214
  async callMe(to) {
@@ -217,8 +227,41 @@ export function room(options) {
217
227
  }
218
228
  if (!current(c) || store.state.phase !== "opening")
219
229
  return;
220
- publish({ call: placed.call, phase: "ringing" });
221
- follow(c, options.log(placed.call));
230
+ const reading = readingOf(options, placed.call, placed.log_token);
231
+ if (reading === null)
232
+ return fail(c, NO_LOG_TOKEN);
233
+ publish({ call: placed.call, phase: "ringing", recording: reading.recording });
234
+ follow(c, reading.log);
235
+ },
236
+ async byPhone() {
237
+ const c = begin("phone");
238
+ if (c === null)
239
+ return;
240
+ const ask = options.expect;
241
+ if (ask === undefined)
242
+ return fail(c, NO_EXPECT);
243
+ let code;
244
+ try {
245
+ code = await ask();
246
+ }
247
+ catch (refused) {
248
+ return fail(c, messageOf(refused));
249
+ }
250
+ if (!current(c) || store.state.phase !== "opening")
251
+ return;
252
+ publish({ phase: "expecting", code: { code: code.code, number: code.number, expiresAt: code.expires_at } });
253
+ c.waiting = new AbortController();
254
+ const claim = await claimOf(gatewayOf(options), code, options.fetch ?? fetch, c.waiting.signal);
255
+ // Leaving, closing or failing aborted the asking. A claim is a call already answered: it is live.
256
+ if (claim === null || c.waiting.signal.aborted)
257
+ return;
258
+ if (claim.kind === "failed")
259
+ return fail(c, claim.error);
260
+ const reading = readingOf(options, claim.call, claim.log_token ?? undefined);
261
+ if (reading === null)
262
+ return fail(c, NO_LOG_TOKEN);
263
+ publish({ call: claim.call, phase: "live", recording: reading.recording });
264
+ follow(c, reading.log);
222
265
  },
223
266
  async send(text) {
224
267
  if (text.trim() === "")
@@ -270,11 +313,13 @@ function idle() {
270
313
  mode: null,
271
314
  call: "",
272
315
  error: "",
316
+ recording: "",
273
317
  log: initialState(),
274
318
  entries: [],
275
319
  connection: "ended",
276
320
  wantsSound: false,
277
321
  speaking: QUIET,
322
+ code: null,
278
323
  };
279
324
  }
280
325
  function messageOf(refused) {
package/dist/room.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,20 @@
1
- /** @pinecall/room/server: what a tenant's server does with its key — a ticket for a seat, a call placed. */
2
- /** What `POST /v1/tokens` answers: where the room is, the ticket into it, and the call's id. */
1
+ /** @pinecall/room/server: what a tenant's server does with its key — a ticket for a seat, a call placed, a code to call with. */
2
+ /** What `POST /v1/tokens` answers: where the room is, the ticket into it, the call's id, and the
3
+ * token the page reads that call's log and recording with. The protocol's `Minted`, in rest.json. */
3
4
  export interface Minted {
4
5
  server_url: string;
5
6
  participant_token: string;
6
7
  call: string;
8
+ log_token: string;
9
+ }
10
+ /** What `POST /v1/codes` answers: the four digits a page shows beside the agent's number, when
11
+ * they stop being a code (seconds since the epoch), and the token the page asks about them with.
12
+ * The protocol's `Code`, in rest.json. */
13
+ export interface Code {
14
+ code: string;
15
+ number: string;
16
+ expires_at: number;
17
+ code_token: string;
7
18
  }
8
19
  /** What `POST /v1/agents/{agent}/dial` answers: the call's id, before anything has rung. */
9
20
  export interface Dialed {
@@ -12,7 +23,11 @@ export interface Dialed {
12
23
  to: string;
13
24
  from: string;
14
25
  env: string;
26
+ log_token: string;
15
27
  }
28
+ /** What the page's log token reads the call through: the public projection, or the tenant's own —
29
+ * the tools, the latency, the cost — when the page draws them. */
30
+ export type LogProjection = "public" | "tenant";
16
31
  export interface MintOptions {
17
32
  /** The gateway, `https://box.pinecall.io` or your own. */
18
33
  url: string;
@@ -23,6 +38,7 @@ export interface MintOptions {
23
38
  /** Who is calling: memory files the call under it. */
24
39
  contact?: string | undefined;
25
40
  metadata?: Record<string, unknown> | undefined;
41
+ log?: LogProjection | undefined;
26
42
  fetch?: typeof fetch | undefined;
27
43
  }
28
44
  export interface DialOptions {
@@ -32,6 +48,16 @@ export interface DialOptions {
32
48
  to: string;
33
49
  /** Which of the agent's own numbers the far end sees. Unsaid, the first one it answers at. */
34
50
  from?: string | undefined;
51
+ log?: LogProjection | undefined;
52
+ fetch?: typeof fetch | undefined;
53
+ }
54
+ export interface ExpectOptions {
55
+ url: string;
56
+ agent: string;
57
+ /** How long the code lives. The gateway's default is 600 s: 60 s the least, 1800 s the most. */
58
+ ttl_s?: number | undefined;
59
+ /** What the log token the page is handed once a call claims the code reads it through. */
60
+ log?: LogProjection | undefined;
35
61
  fetch?: typeof fetch | undefined;
36
62
  }
37
63
  /** The gateway said no. `detail` is its own sentence when it sent one; it names the fix. */
@@ -45,4 +71,7 @@ export declare class GatewayRefused extends Error {
45
71
  export declare function mint(key: string, options: MintOptions): Promise<Minted>;
46
72
  /** Have the agent call `to`. The key needs the `talk` scope; the number must have reached the org before. */
47
73
  export declare function dial(key: string, options: DialOptions): Promise<Dialed>;
74
+ /** A code for a page to show beside the agent's number, for the visitor to key when they call it.
75
+ * The key needs the `talk` scope; the agent must answer at a phone number in the key's world. */
76
+ export declare function expect(key: string, options: ExpectOptions): Promise<Code>;
48
77
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAM5G,gGAAgG;AAChG,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4FAA4F;AAC5F,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,4FAA4F;AAC5F,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,oBAAoB;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAIhD;CACF;AAKD,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED,6GAA6G;AAC7G,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,iIAAiI;AAMjI;qGACqG;AACrG,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;0CAE0C;AAC1C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,4FAA4F;AAC5F,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;kEACkE;AAClE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0FAA0F;IAC1F,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,4FAA4F;AAC5F,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,oBAAoB;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAIhD;CACF;AAKD,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E;AAED,6GAA6G;AAC7G,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E;AAED;iGACiG;AACjG,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/E"}
@@ -1,4 +1,4 @@
1
- /** @pinecall/room/server: what a tenant's server does with its key — a ticket for a seat, a call placed. */
1
+ /** @pinecall/room/server: what a tenant's server does with its key — a ticket for a seat, a call placed, a code to call with. */
2
2
  //
3
3
  // The key never reaches a page. The page asks the tenant's own server, the server asks the gateway
4
4
  // with the key, and what comes back to the page is a ticket for one call. Nothing here is imported
@@ -18,21 +18,31 @@ export class GatewayRefused extends Error {
18
18
  const TIMEOUT_MS = 10_000;
19
19
  /** A ticket for one seat in one new call. The key needs the `talk` scope. */
20
20
  export async function mint(key, options) {
21
- const { url, agent, scope, ttl_s, contact, metadata } = options;
22
- const body = await post(key, `${bare(url)}/v1/tokens`, { agent, scope, ttl_s, contact, metadata }, options.fetch);
21
+ const { url, agent, scope, ttl_s, contact, metadata, log } = options;
22
+ const said = { agent, scope, ttl_s, contact, metadata, log };
23
+ const body = await post(key, `${bare(url)}/v1/tokens`, said, options.fetch);
23
24
  if (!isMinted(body))
24
25
  throw new Error("the gateway answered /v1/tokens with a shape this package does not know");
25
26
  return body;
26
27
  }
27
28
  /** Have the agent call `to`. The key needs the `talk` scope; the number must have reached the org before. */
28
29
  export async function dial(key, options) {
29
- const { url, agent, to, from } = options;
30
+ const { url, agent, to, from, log } = options;
30
31
  const path = `${bare(url)}/v1/agents/${encodeURIComponent(agent)}/dial`;
31
- const body = await post(key, path, { to, from }, options.fetch);
32
+ const body = await post(key, path, { to, from, log }, options.fetch);
32
33
  if (!isDialed(body))
33
34
  throw new Error("the gateway answered the dial with a shape this package does not know");
34
35
  return body;
35
36
  }
37
+ /** A code for a page to show beside the agent's number, for the visitor to key when they call it.
38
+ * The key needs the `talk` scope; the agent must answer at a phone number in the key's world. */
39
+ export async function expect(key, options) {
40
+ const { url, agent, ttl_s, log } = options;
41
+ const body = await post(key, `${bare(url)}/v1/codes`, { agent, ttl_s, log }, options.fetch);
42
+ if (!isCode(body))
43
+ throw new Error("the gateway answered /v1/codes with a shape this package does not know");
44
+ return body;
45
+ }
36
46
  async function post(key, url, body, fetcher = fetch) {
37
47
  const answer = await fetcher(url, {
38
48
  method: "POST",
@@ -62,10 +72,15 @@ function bare(url) {
62
72
  return url.replace(/\/+$/, "");
63
73
  }
64
74
  function isMinted(body) {
65
- return hasStrings(body, ["server_url", "participant_token", "call"]);
75
+ return hasStrings(body, ["server_url", "participant_token", "call", "log_token"]);
66
76
  }
67
77
  function isDialed(body) {
68
- return hasStrings(body, ["call", "agent", "to", "from", "env"]);
78
+ return hasStrings(body, ["call", "agent", "to", "from", "env", "log_token"]);
79
+ }
80
+ function isCode(body) {
81
+ if (!hasStrings(body, ["code", "number", "code_token"]) || typeof body !== "object" || body === null)
82
+ return false;
83
+ return typeof Reflect.get(body, "expires_at") === "number";
69
84
  }
70
85
  function hasStrings(body, fields) {
71
86
  return typeof body === "object" && body !== null && fields.every((field) => typeof Reflect.get(body, field) === "string");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@pinecall/room",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "The caller's side of a Pinecall call in a browser: one store, the seat and the log joined, no framework",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Pinecall <hello@pinecall.io>",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/pinecall/client.git"
9
+ "url": "git+https://github.com/pinecall/rooms.git"
10
10
  },
11
11
  "type": "module",
12
12
  "sideEffects": false,
@@ -30,7 +30,7 @@
30
30
  "dist"
31
31
  ],
32
32
  "dependencies": {
33
- "@pinecall/protocol": "^0.6.5"
33
+ "@pinecall/protocol": "^0.6.9"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "livekit-client": "^2.0.0",