@relaymessenger/sdk 0.3.6-staging.23 → 0.3.6-staging.25
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 +231 -32
- package/dist/{call-room.d.ts → calls/call-room.d.ts} +2 -2
- package/dist/calls/call-room.d.ts.map +1 -0
- package/dist/calls/call-room.js.map +1 -0
- package/dist/calls/engine-werift-video.d.ts +70 -0
- package/dist/calls/engine-werift-video.d.ts.map +1 -0
- package/dist/calls/engine-werift-video.js +594 -0
- package/dist/calls/engine-werift-video.js.map +1 -0
- package/dist/calls/engine-werift.d.ts +48 -0
- package/dist/calls/engine-werift.d.ts.map +1 -0
- package/dist/calls/engine-werift.js +457 -0
- package/dist/calls/engine-werift.js.map +1 -0
- package/dist/calls/index.d.ts +11 -0
- package/dist/calls/index.d.ts.map +1 -0
- package/dist/calls/index.js +11 -0
- package/dist/calls/index.js.map +1 -0
- package/dist/calls/transport.d.ts +466 -0
- package/dist/calls/transport.d.ts.map +1 -0
- package/dist/calls/transport.js +1409 -0
- package/dist/calls/transport.js.map +1 -0
- package/dist/calls/video-frame.d.ts +56 -0
- package/dist/calls/video-frame.d.ts.map +1 -0
- package/dist/calls/video-frame.js +245 -0
- package/dist/calls/video-frame.js.map +1 -0
- package/dist/calls/video-rtp.d.ts +51 -0
- package/dist/calls/video-rtp.d.ts.map +1 -0
- package/dist/calls/video-rtp.js +294 -0
- package/dist/calls/video-rtp.js.map +1 -0
- package/dist/calls/video.d.ts +188 -0
- package/dist/calls/video.d.ts.map +1 -0
- package/dist/calls/video.js +228 -0
- package/dist/calls/video.js.map +1 -0
- package/dist/client.d.ts +15 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +46 -17
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/links.d.ts +12 -5
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +11 -12
- package/dist/links.js.map +1 -1
- package/dist/operations.d.ts +16 -4
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +21 -3
- package/dist/operations.js.map +1 -1
- package/dist/payment.d.ts +67 -0
- package/dist/payment.d.ts.map +1 -0
- package/dist/payment.js +147 -0
- package/dist/payment.js.map +1 -0
- package/dist/types.d.ts +143 -41
- package/dist/types.d.ts.map +1 -1
- package/package.json +36 -2
- package/dist/call-room.d.ts.map +0 -1
- package/dist/call-room.js.map +0 -1
- package/dist/invoice.d.ts +0 -64
- package/dist/invoice.d.ts.map +0 -1
- package/dist/invoice.js +0 -184
- package/dist/invoice.js.map +0 -1
- /package/dist/{call-room.js → calls/call-room.js} +0 -0
package/dist/invoice.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The fence tag a text-only agent uses to ask someone to pay. The block body
|
|
3
|
-
* is one JSON object, the `invoice` part exactly as the API takes it:
|
|
4
|
-
*
|
|
5
|
-
* ```invoice
|
|
6
|
-
* {"title": "House blend, 250 g", "amount": 2400, "currency": "usd", "goods": "physical", "url": "https://buy.stripe.com/test_123"}
|
|
7
|
-
* ```
|
|
8
|
-
*/
|
|
9
|
-
export const INVOICE_FENCE = "invoice";
|
|
10
|
-
/**
|
|
11
|
-
* When an agent should send an invoice. One text, carried verbatim by every
|
|
12
|
-
* runtime's tool description or prompt. References: Linq Agent Pay ("a card
|
|
13
|
-
* is the whole message"); Telegram `sendInvoice` (only the bot sends
|
|
14
|
-
* invoices); Apple 3.1.3(e)/3.1.1(a) (physical goods or services used outside
|
|
15
|
-
* the app may use any non-IAP method; digital goods may only be linked out).
|
|
16
|
-
*/
|
|
17
|
-
export const INVOICE_GUIDANCE = [
|
|
18
|
-
"Send an invoice only when the person asked to buy something or has already agreed to a price; never invoice out of the blue.",
|
|
19
|
-
"url must be a real Stripe checkout link you were given — a Stripe Payment Link (buy.stripe.com), a Stripe Checkout Session (checkout.stripe.com) or a Stripe hosted invoice (invoice.stripe.com). Never invent one, and never paste a checkout link in text or a button; send an invoice instead.",
|
|
20
|
-
"Only a verified agent can send an invoice; if yours is refused as unverified, say so in words instead.",
|
|
21
|
-
"Set goods honestly: physical for goods or services used outside the app, digital for anything delivered in chat or used inside an app.",
|
|
22
|
-
"The invoice card is a message of its own: no buttons or selection beside it, and any words you write arrive in a message before it.",
|
|
23
|
-
"Use recurring for a subscription: interval day, week, month or year, for up to 3 years total.",
|
|
24
|
-
"When your own system learns the payment went through, for example your Stripe webhook, mark it with the status route so the card updates for the person.",
|
|
25
|
-
].join(" ");
|
|
26
|
-
/**
|
|
27
|
-
* How a text-only agent asks someone to pay: the same words for every bridge
|
|
28
|
-
* that sends the agent's final text for it.
|
|
29
|
-
*/
|
|
30
|
-
export const INVOICE_BLOCK_INSTRUCTION = "To ask the person to pay, end your answer with a fenced code block tagged `" + INVOICE_FENCE + "` "
|
|
31
|
-
+ "holding one JSON object: {\"title\": \"...\", \"amount\": 2400, \"currency\": \"usd\", "
|
|
32
|
-
+ "\"goods\": \"physical\" or \"digital\", \"url\": \"https://buy.stripe.com/...\"}, with an optional "
|
|
33
|
-
+ "\"recurring\": {\"interval\": \"month\", \"interval_count\": 1} for a subscription. "
|
|
34
|
-
+ "The block is removed from your words and drawn as its own invoice card, sent after them.";
|
|
35
|
-
/**
|
|
36
|
-
* The Stripe-hosted pages where a person pays, and the only hosts an invoice
|
|
37
|
-
* url may use (the server's own list): a Checkout Session, a Payment Link
|
|
38
|
-
* (pay/subscribe, book, donate), or a hosted invoice. Test-mode links share
|
|
39
|
-
* these hosts.
|
|
40
|
-
*/
|
|
41
|
-
export const INVOICE_CHECKOUT_HOSTS = [
|
|
42
|
-
"checkout.stripe.com",
|
|
43
|
-
"buy.stripe.com",
|
|
44
|
-
"book.stripe.com",
|
|
45
|
-
"donate.stripe.com",
|
|
46
|
-
"invoice.stripe.com",
|
|
47
|
-
];
|
|
48
|
-
const checkoutHosts = new Set(INVOICE_CHECKOUT_HOSTS);
|
|
49
|
-
/** The server's limits (Telegram title, Stripe amount/url/recurring span). */
|
|
50
|
-
export const INVOICE_TITLE_MAX_LENGTH = 32;
|
|
51
|
-
export const INVOICE_MAX_AMOUNT = 99_999_999;
|
|
52
|
-
export const INVOICE_URL_MAX_LENGTH = 2_048;
|
|
53
|
-
/** Total recurring span capped at 3 years: 1095 days / 156 weeks / 36 months / 3 years. */
|
|
54
|
-
export const INVOICE_RECURRING_MAX_COUNT = {
|
|
55
|
-
day: 1_095,
|
|
56
|
-
week: 156,
|
|
57
|
-
month: 36,
|
|
58
|
-
year: 3,
|
|
59
|
-
};
|
|
60
|
-
const record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
61
|
-
// Counted in code points, matching the server's own check, so a 17-32
|
|
62
|
-
// character emoji title (surrogate pairs) is not rejected as too long.
|
|
63
|
-
const invoiceTitleLength = (value) => [...value].length;
|
|
64
|
-
/**
|
|
65
|
-
* A checkout link the card may open: https on a Stripe checkout host, with no
|
|
66
|
-
* username, password or port (`https://buy.stripe.com@evil.com` is evil.com).
|
|
67
|
-
* Matches the server's own check and its normalization, so a link the SDK
|
|
68
|
-
* accepts is never rejected by the API and always reads back the same way.
|
|
69
|
-
*/
|
|
70
|
-
const checkoutUrl = (value) => {
|
|
71
|
-
try {
|
|
72
|
-
const url = new URL(value);
|
|
73
|
-
return url.protocol === "https:" && checkoutHosts.has(url.hostname) && url.port === ""
|
|
74
|
-
&& url.username === "" && url.password === ""
|
|
75
|
-
? url
|
|
76
|
-
: undefined;
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const FENCE = new RegExp("(^|\\n)[ \\t]*```[ \\t]*" + INVOICE_FENCE + "(?:[ \\t][^\\r\\n]*)?\\r?\\n([\\s\\S]*?)\\r?\\n[ \\t]*```[ \\t]*(?=\\r?\\n|$)", "gu");
|
|
83
|
-
const BUTTONS_OR_SELECTION_FENCE = /(^|\n)[ \t]*```[ \t]*(?:buttons|selection)(?:[ \t][^\r\n]*)?\r?\n/u;
|
|
84
|
-
/**
|
|
85
|
-
* Turns a decoded value, the fields object or the whole part, into an
|
|
86
|
-
* `invoice` part, or explains why it cannot. The checks are the server's own,
|
|
87
|
-
* so a bad value fails here with a readable reason instead of a 400 from the
|
|
88
|
-
* API. `currency` is normalized to lowercase.
|
|
89
|
-
*/
|
|
90
|
-
export const invoicePart = (parsed) => {
|
|
91
|
-
if (!record(parsed))
|
|
92
|
-
return "the invoice block must be a JSON object";
|
|
93
|
-
const allowed = new Set(["type", "title", "amount", "currency", "goods", "url", "recurring"]);
|
|
94
|
-
const extra = Object.keys(parsed).find((key) => !allowed.has(key));
|
|
95
|
-
if (extra)
|
|
96
|
-
return `invoice has unknown field ${extra}`;
|
|
97
|
-
if (parsed.type !== undefined && parsed.type !== "invoice")
|
|
98
|
-
return "invoice part needs type invoice";
|
|
99
|
-
const { title, amount, currency, goods, url, recurring } = parsed;
|
|
100
|
-
if (typeof title !== "string" || !title.trim() || invoiceTitleLength(title.trim()) > INVOICE_TITLE_MAX_LENGTH) {
|
|
101
|
-
return `invoice needs a trimmed title of 1 to ${INVOICE_TITLE_MAX_LENGTH} characters`;
|
|
102
|
-
}
|
|
103
|
-
if (!Number.isInteger(amount) || amount < 1 || amount > INVOICE_MAX_AMOUNT) {
|
|
104
|
-
return `invoice amount must be an integer of 1 to ${INVOICE_MAX_AMOUNT}`;
|
|
105
|
-
}
|
|
106
|
-
if (typeof currency !== "string" || !/^[A-Za-z]{3}$/u.test(currency)) {
|
|
107
|
-
return "invoice currency must be a 3-letter code";
|
|
108
|
-
}
|
|
109
|
-
if (goods !== "physical" && goods !== "digital") {
|
|
110
|
-
return 'invoice goods must be "physical" or "digital"';
|
|
111
|
-
}
|
|
112
|
-
if (typeof url !== "string" || url.length > INVOICE_URL_MAX_LENGTH) {
|
|
113
|
-
return `invoice url is not a string of at most ${INVOICE_URL_MAX_LENGTH} characters`;
|
|
114
|
-
}
|
|
115
|
-
const normalizedUrl = checkoutUrl(url);
|
|
116
|
-
if (!normalizedUrl) {
|
|
117
|
-
return `invoice url must be an https Stripe checkout link on ${INVOICE_CHECKOUT_HOSTS.join(", ")}`;
|
|
118
|
-
}
|
|
119
|
-
let normalizedRecurring;
|
|
120
|
-
if (recurring !== undefined) {
|
|
121
|
-
if (!record(recurring))
|
|
122
|
-
return "invoice recurring must be an object";
|
|
123
|
-
const recurringExtra = Object.keys(recurring)
|
|
124
|
-
.find((key) => key !== "interval" && key !== "interval_count");
|
|
125
|
-
if (recurringExtra)
|
|
126
|
-
return `invoice recurring has unknown field ${recurringExtra}`;
|
|
127
|
-
const { interval, interval_count } = recurring;
|
|
128
|
-
if (typeof interval !== "string" || !Object.hasOwn(INVOICE_RECURRING_MAX_COUNT, interval)) {
|
|
129
|
-
return "invoice recurring interval must be day, week, month or year";
|
|
130
|
-
}
|
|
131
|
-
const max = INVOICE_RECURRING_MAX_COUNT[interval];
|
|
132
|
-
const count = interval_count === undefined ? 1 : interval_count;
|
|
133
|
-
if (!Number.isInteger(count) || count < 1 || count > max) {
|
|
134
|
-
return `invoice recurring interval_count for ${interval} must be an integer of 1 to ${max}`;
|
|
135
|
-
}
|
|
136
|
-
normalizedRecurring = { interval: interval, interval_count: count };
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
type: "invoice",
|
|
140
|
-
title: title.trim(),
|
|
141
|
-
amount: amount,
|
|
142
|
-
currency: currency.toLowerCase(),
|
|
143
|
-
goods: goods,
|
|
144
|
-
url: normalizedUrl.href,
|
|
145
|
-
...(normalizedRecurring ? { recurring: normalizedRecurring } : {}),
|
|
146
|
-
};
|
|
147
|
-
};
|
|
148
|
-
/** Parses the body of an invoice block, JSON, into an `invoice` part. */
|
|
149
|
-
export const parseInvoiceBlock = (body) => {
|
|
150
|
-
let parsed;
|
|
151
|
-
try {
|
|
152
|
-
parsed = JSON.parse(body);
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
return "the invoice block is not valid JSON";
|
|
156
|
-
}
|
|
157
|
-
return invoicePart(parsed);
|
|
158
|
-
};
|
|
159
|
-
/**
|
|
160
|
-
* Lifts the one ```invoice block out of an agent's answer. An invoice must be
|
|
161
|
-
* the only part of its message, so unlike buttons it is never attached to
|
|
162
|
-
* surrounding words; the words around it stay in `text` for `answerMessages`
|
|
163
|
-
* to send as their own Message(s) first. More than one invoice block, or an
|
|
164
|
-
* invoice alongside a buttons or selection block, is a conflict: the text is
|
|
165
|
-
* returned untouched with `error` set, the same handling selection uses for
|
|
166
|
-
* selection+buttons.
|
|
167
|
-
*/
|
|
168
|
-
export const splitInvoice = (answer) => {
|
|
169
|
-
const matches = [...answer.matchAll(FENCE)];
|
|
170
|
-
if (!matches.length)
|
|
171
|
-
return { text: answer };
|
|
172
|
-
if (matches.length !== 1 || BUTTONS_OR_SELECTION_FENCE.test(answer)) {
|
|
173
|
-
return { text: answer, error: "send one invoice and nothing else in the same message" };
|
|
174
|
-
}
|
|
175
|
-
const match = matches[0];
|
|
176
|
-
const parsed = parseInvoiceBlock(match[2] ?? "");
|
|
177
|
-
if (typeof parsed === "string")
|
|
178
|
-
return { text: answer, error: parsed };
|
|
179
|
-
const before = answer.slice(0, match.index).trimEnd();
|
|
180
|
-
const after = answer.slice(match.index + match[0].length).trimStart();
|
|
181
|
-
const text = [before, after].filter(Boolean).join("\n\n");
|
|
182
|
-
return { text, invoice: parsed };
|
|
183
|
-
};
|
|
184
|
-
//# sourceMappingURL=invoice.js.map
|
package/dist/invoice.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../src/invoice.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|