@paramms/chat-widget 1.0.17 → 1.0.18
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/chatlist.js +6 -6
- package/dist/chatlist.js.map +1 -1
- package/dist/history.d.ts +20 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +847 -845
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +5 -3
- package/dist/react.js.map +1 -1
- package/dist/uid.js +42 -36
- package/dist/uid.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { p as
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var Be = Object.defineProperty;
|
|
2
|
+
var Ke = (s, e, t) => e in s ? Be(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
|
|
3
|
+
var r = (s, e, t) => Ke(s, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { p as Ae, r as ze, a as Le } from "./uid.js";
|
|
5
|
+
import { h as Xt } from "./uid.js";
|
|
6
|
+
const qt = (s) => s;
|
|
7
|
+
function Me(s) {
|
|
7
8
|
const e = s.length;
|
|
8
|
-
let t = 0,
|
|
9
|
-
for (;
|
|
10
|
-
let
|
|
11
|
-
if (
|
|
12
|
-
if (!(
|
|
9
|
+
let t = 0, i = 0;
|
|
10
|
+
for (; i < e; ) {
|
|
11
|
+
let n = s.charCodeAt(i++);
|
|
12
|
+
if (n & 4294967168)
|
|
13
|
+
if (!(n & 4294965248))
|
|
13
14
|
t += 2;
|
|
14
15
|
else {
|
|
15
|
-
if (
|
|
16
|
-
const
|
|
17
|
-
(
|
|
16
|
+
if (n >= 55296 && n <= 56319 && i < e) {
|
|
17
|
+
const o = s.charCodeAt(i);
|
|
18
|
+
(o & 64512) === 56320 && (++i, n = ((n & 1023) << 10) + (o & 1023) + 65536);
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
n & 4294901760 ? t += 4 : t += 3;
|
|
20
21
|
}
|
|
21
22
|
else {
|
|
22
23
|
t++;
|
|
@@ -25,72 +26,72 @@ function Le(s) {
|
|
|
25
26
|
}
|
|
26
27
|
return t;
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
const
|
|
30
|
-
let
|
|
31
|
-
for (;
|
|
32
|
-
let
|
|
33
|
-
if (
|
|
34
|
-
if (!(
|
|
35
|
-
e[
|
|
29
|
+
function De(s, e, t) {
|
|
30
|
+
const i = s.length;
|
|
31
|
+
let n = t, o = 0;
|
|
32
|
+
for (; o < i; ) {
|
|
33
|
+
let a = s.charCodeAt(o++);
|
|
34
|
+
if (a & 4294967168)
|
|
35
|
+
if (!(a & 4294965248))
|
|
36
|
+
e[n++] = a >> 6 & 31 | 192;
|
|
36
37
|
else {
|
|
37
|
-
if (
|
|
38
|
-
const
|
|
39
|
-
(
|
|
38
|
+
if (a >= 55296 && a <= 56319 && o < i) {
|
|
39
|
+
const d = s.charCodeAt(o);
|
|
40
|
+
(d & 64512) === 56320 && (++o, a = ((a & 1023) << 10) + (d & 1023) + 65536);
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
a & 4294901760 ? (e[n++] = a >> 18 & 7 | 240, e[n++] = a >> 12 & 63 | 128, e[n++] = a >> 6 & 63 | 128) : (e[n++] = a >> 12 & 15 | 224, e[n++] = a >> 6 & 63 | 128);
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
44
|
-
e[
|
|
45
|
+
e[n++] = a;
|
|
45
46
|
continue;
|
|
46
47
|
}
|
|
47
|
-
e[
|
|
48
|
+
e[n++] = a & 63 | 128;
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
const
|
|
51
|
-
function $e(s, e, t) {
|
|
52
|
-
De.encodeInto(s, e.subarray(t));
|
|
53
|
-
}
|
|
51
|
+
const _e = new TextEncoder(), $e = 50;
|
|
54
52
|
function He(s, e, t) {
|
|
55
|
-
|
|
53
|
+
_e.encodeInto(s, e.subarray(t));
|
|
54
|
+
}
|
|
55
|
+
function Re(s, e, t) {
|
|
56
|
+
s.length > $e ? He(s, e, t) : De(s, e, t);
|
|
56
57
|
}
|
|
57
|
-
const
|
|
58
|
+
const Fe = 4096;
|
|
58
59
|
function ye(s, e, t) {
|
|
59
|
-
let
|
|
60
|
-
const
|
|
61
|
-
let
|
|
62
|
-
for (;
|
|
63
|
-
const
|
|
64
|
-
if (!(
|
|
65
|
-
|
|
66
|
-
else if ((
|
|
67
|
-
const w = s[
|
|
68
|
-
|
|
69
|
-
} else if ((
|
|
70
|
-
const w = s[
|
|
71
|
-
|
|
72
|
-
} else if ((
|
|
73
|
-
const w = s[
|
|
74
|
-
let f = (
|
|
75
|
-
f > 65535 && (f -= 65536,
|
|
60
|
+
let i = e;
|
|
61
|
+
const n = i + t, o = [];
|
|
62
|
+
let a = "";
|
|
63
|
+
for (; i < n; ) {
|
|
64
|
+
const d = s[i++];
|
|
65
|
+
if (!(d & 128))
|
|
66
|
+
o.push(d);
|
|
67
|
+
else if ((d & 224) === 192) {
|
|
68
|
+
const w = s[i++] & 63;
|
|
69
|
+
o.push((d & 31) << 6 | w);
|
|
70
|
+
} else if ((d & 240) === 224) {
|
|
71
|
+
const w = s[i++] & 63, x = s[i++] & 63;
|
|
72
|
+
o.push((d & 31) << 12 | w << 6 | x);
|
|
73
|
+
} else if ((d & 248) === 240) {
|
|
74
|
+
const w = s[i++] & 63, x = s[i++] & 63, m = s[i++] & 63;
|
|
75
|
+
let f = (d & 7) << 18 | w << 12 | x << 6 | m;
|
|
76
|
+
f > 65535 && (f -= 65536, o.push(f >>> 10 & 1023 | 55296), f = 56320 | f & 1023), o.push(f);
|
|
76
77
|
} else
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
o.push(d);
|
|
79
|
+
o.length >= Fe && (a += String.fromCharCode(...o), o.length = 0);
|
|
79
80
|
}
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
const Fe = new TextDecoder(), je = 200;
|
|
83
|
-
function qe(s, e, t) {
|
|
84
|
-
const n = s.subarray(e, e + t);
|
|
85
|
-
return Fe.decode(n);
|
|
81
|
+
return o.length > 0 && (a += String.fromCharCode(...o)), a;
|
|
86
82
|
}
|
|
83
|
+
const je = new TextDecoder(), qe = 200;
|
|
87
84
|
function Oe(s, e, t) {
|
|
88
|
-
|
|
85
|
+
const i = s.subarray(e, e + t);
|
|
86
|
+
return je.decode(i);
|
|
87
|
+
}
|
|
88
|
+
function Ne(s, e, t) {
|
|
89
|
+
return t > qe ? Oe(s, e, t) : ye(s, e, t);
|
|
89
90
|
}
|
|
90
91
|
class X {
|
|
91
92
|
constructor(e, t) {
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
r(this, "type");
|
|
94
|
+
r(this, "data");
|
|
94
95
|
this.type = e, this.data = t;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -106,151 +107,151 @@ class z extends Error {
|
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
109
|
const j = 4294967295;
|
|
109
|
-
function
|
|
110
|
-
const
|
|
111
|
-
s.setUint32(e,
|
|
110
|
+
function Ve(s, e, t) {
|
|
111
|
+
const i = t / 4294967296, n = t;
|
|
112
|
+
s.setUint32(e, i), s.setUint32(e + 4, n);
|
|
112
113
|
}
|
|
113
114
|
function ge(s, e, t) {
|
|
114
|
-
const
|
|
115
|
-
s.setUint32(e,
|
|
115
|
+
const i = Math.floor(t / 4294967296), n = t;
|
|
116
|
+
s.setUint32(e, i), s.setUint32(e + 4, n);
|
|
116
117
|
}
|
|
117
118
|
function be(s, e) {
|
|
118
|
-
const t = s.getInt32(e),
|
|
119
|
-
return t * 4294967296 +
|
|
119
|
+
const t = s.getInt32(e), i = s.getUint32(e + 4);
|
|
120
|
+
return t * 4294967296 + i;
|
|
120
121
|
}
|
|
121
|
-
function
|
|
122
|
-
const t = s.getUint32(e),
|
|
123
|
-
return t * 4294967296 +
|
|
122
|
+
function We(s, e) {
|
|
123
|
+
const t = s.getUint32(e), i = s.getUint32(e + 4);
|
|
124
|
+
return t * 4294967296 + i;
|
|
124
125
|
}
|
|
125
|
-
const
|
|
126
|
-
function
|
|
127
|
-
if (s >= 0 && e >= 0 && s <=
|
|
128
|
-
if (e === 0 && s <=
|
|
126
|
+
const Xe = -1, Ye = 4294967296 - 1, Je = 17179869184 - 1;
|
|
127
|
+
function Ge({ sec: s, nsec: e }) {
|
|
128
|
+
if (s >= 0 && e >= 0 && s <= Je)
|
|
129
|
+
if (e === 0 && s <= Ye) {
|
|
129
130
|
const t = new Uint8Array(4);
|
|
130
131
|
return new DataView(t.buffer).setUint32(0, s), t;
|
|
131
132
|
} else {
|
|
132
|
-
const t = s / 4294967296,
|
|
133
|
-
return
|
|
133
|
+
const t = s / 4294967296, i = s & 4294967295, n = new Uint8Array(8), o = new DataView(n.buffer);
|
|
134
|
+
return o.setUint32(0, e << 2 | t & 3), o.setUint32(4, i), n;
|
|
134
135
|
}
|
|
135
136
|
else {
|
|
136
|
-
const t = new Uint8Array(12),
|
|
137
|
-
return
|
|
137
|
+
const t = new Uint8Array(12), i = new DataView(t.buffer);
|
|
138
|
+
return i.setUint32(0, e), ge(i, 4, s), t;
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
|
-
function
|
|
141
|
-
const e = s.getTime(), t = Math.floor(e / 1e3),
|
|
141
|
+
function Qe(s) {
|
|
142
|
+
const e = s.getTime(), t = Math.floor(e / 1e3), i = (e - t * 1e3) * 1e6, n = Math.floor(i / 1e9);
|
|
142
143
|
return {
|
|
143
|
-
sec: t +
|
|
144
|
-
nsec:
|
|
144
|
+
sec: t + n,
|
|
145
|
+
nsec: i - n * 1e9
|
|
145
146
|
};
|
|
146
147
|
}
|
|
147
|
-
function
|
|
148
|
+
function Ze(s) {
|
|
148
149
|
if (s instanceof Date) {
|
|
149
|
-
const e =
|
|
150
|
-
return
|
|
150
|
+
const e = Qe(s);
|
|
151
|
+
return Ge(e);
|
|
151
152
|
} else
|
|
152
153
|
return null;
|
|
153
154
|
}
|
|
154
|
-
function
|
|
155
|
+
function et(s) {
|
|
155
156
|
const e = new DataView(s.buffer, s.byteOffset, s.byteLength);
|
|
156
157
|
switch (s.byteLength) {
|
|
157
158
|
case 4:
|
|
158
159
|
return { sec: e.getUint32(0), nsec: 0 };
|
|
159
160
|
case 8: {
|
|
160
|
-
const t = e.getUint32(0),
|
|
161
|
-
return { sec:
|
|
161
|
+
const t = e.getUint32(0), i = e.getUint32(4), n = (t & 3) * 4294967296 + i, o = t >>> 2;
|
|
162
|
+
return { sec: n, nsec: o };
|
|
162
163
|
}
|
|
163
164
|
case 12: {
|
|
164
|
-
const t = be(e, 4),
|
|
165
|
-
return { sec: t, nsec:
|
|
165
|
+
const t = be(e, 4), i = e.getUint32(0);
|
|
166
|
+
return { sec: t, nsec: i };
|
|
166
167
|
}
|
|
167
168
|
default:
|
|
168
169
|
throw new z(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${s.length}`);
|
|
169
170
|
}
|
|
170
171
|
}
|
|
171
|
-
function
|
|
172
|
-
const e =
|
|
172
|
+
function tt(s) {
|
|
173
|
+
const e = et(s);
|
|
173
174
|
return new Date(e.sec * 1e3 + e.nsec / 1e6);
|
|
174
175
|
}
|
|
175
|
-
const
|
|
176
|
-
type:
|
|
177
|
-
encode:
|
|
178
|
-
decode:
|
|
176
|
+
const nt = {
|
|
177
|
+
type: Xe,
|
|
178
|
+
encode: Ze,
|
|
179
|
+
decode: tt
|
|
179
180
|
}, G = class G {
|
|
180
181
|
constructor() {
|
|
181
182
|
// ensures ExtensionCodecType<X> matches ExtensionCodec<X>
|
|
182
183
|
// this will make type errors a lot more clear
|
|
183
184
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
184
|
-
|
|
185
|
+
r(this, "__brand");
|
|
185
186
|
// built-in extensions
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
r(this, "builtInEncoders", []);
|
|
188
|
+
r(this, "builtInDecoders", []);
|
|
188
189
|
// custom extensions
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
this.register(
|
|
190
|
+
r(this, "encoders", []);
|
|
191
|
+
r(this, "decoders", []);
|
|
192
|
+
this.register(nt);
|
|
192
193
|
}
|
|
193
|
-
register({ type: e, encode: t, decode:
|
|
194
|
+
register({ type: e, encode: t, decode: i }) {
|
|
194
195
|
if (e >= 0)
|
|
195
|
-
this.encoders[e] = t, this.decoders[e] =
|
|
196
|
+
this.encoders[e] = t, this.decoders[e] = i;
|
|
196
197
|
else {
|
|
197
|
-
const
|
|
198
|
-
this.builtInEncoders[
|
|
198
|
+
const n = -1 - e;
|
|
199
|
+
this.builtInEncoders[n] = t, this.builtInDecoders[n] = i;
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
202
|
tryToEncode(e, t) {
|
|
202
|
-
for (let
|
|
203
|
-
const
|
|
204
|
-
if (
|
|
205
|
-
const
|
|
206
|
-
if (
|
|
207
|
-
const
|
|
208
|
-
return new X(
|
|
203
|
+
for (let i = 0; i < this.builtInEncoders.length; i++) {
|
|
204
|
+
const n = this.builtInEncoders[i];
|
|
205
|
+
if (n != null) {
|
|
206
|
+
const o = n(e, t);
|
|
207
|
+
if (o != null) {
|
|
208
|
+
const a = -1 - i;
|
|
209
|
+
return new X(a, o);
|
|
209
210
|
}
|
|
210
211
|
}
|
|
211
212
|
}
|
|
212
|
-
for (let
|
|
213
|
-
const
|
|
214
|
-
if (
|
|
215
|
-
const
|
|
216
|
-
if (
|
|
217
|
-
const
|
|
218
|
-
return new X(
|
|
213
|
+
for (let i = 0; i < this.encoders.length; i++) {
|
|
214
|
+
const n = this.encoders[i];
|
|
215
|
+
if (n != null) {
|
|
216
|
+
const o = n(e, t);
|
|
217
|
+
if (o != null) {
|
|
218
|
+
const a = i;
|
|
219
|
+
return new X(a, o);
|
|
219
220
|
}
|
|
220
221
|
}
|
|
221
222
|
}
|
|
222
223
|
return e instanceof X ? e : null;
|
|
223
224
|
}
|
|
224
|
-
decode(e, t,
|
|
225
|
-
const
|
|
226
|
-
return
|
|
225
|
+
decode(e, t, i) {
|
|
226
|
+
const n = t < 0 ? this.builtInDecoders[-1 - t] : this.decoders[t];
|
|
227
|
+
return n ? n(e, t, i) : new X(t, e);
|
|
227
228
|
}
|
|
228
229
|
};
|
|
229
|
-
|
|
230
|
+
r(G, "defaultCodec", new G());
|
|
230
231
|
let Y = G;
|
|
231
|
-
function
|
|
232
|
+
function it(s) {
|
|
232
233
|
return s instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && s instanceof SharedArrayBuffer;
|
|
233
234
|
}
|
|
234
235
|
function te(s) {
|
|
235
|
-
return s instanceof Uint8Array ? s : ArrayBuffer.isView(s) ? new Uint8Array(s.buffer, s.byteOffset, s.byteLength) :
|
|
236
|
+
return s instanceof Uint8Array ? s : ArrayBuffer.isView(s) ? new Uint8Array(s.buffer, s.byteOffset, s.byteLength) : it(s) ? new Uint8Array(s) : Uint8Array.from(s);
|
|
236
237
|
}
|
|
237
|
-
const
|
|
238
|
+
const st = 100, ot = 2048;
|
|
238
239
|
class se {
|
|
239
240
|
constructor(e) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
this.extensionCodec = (e == null ? void 0 : e.extensionCodec) ?? Y.defaultCodec, this.context = e == null ? void 0 : e.context, this.useBigInt64 = (e == null ? void 0 : e.useBigInt64) ?? !1, this.maxDepth = (e == null ? void 0 : e.maxDepth) ??
|
|
241
|
+
r(this, "extensionCodec");
|
|
242
|
+
r(this, "context");
|
|
243
|
+
r(this, "useBigInt64");
|
|
244
|
+
r(this, "maxDepth");
|
|
245
|
+
r(this, "initialBufferSize");
|
|
246
|
+
r(this, "sortKeys");
|
|
247
|
+
r(this, "forceFloat32");
|
|
248
|
+
r(this, "ignoreUndefined");
|
|
249
|
+
r(this, "forceIntegerToFloat");
|
|
250
|
+
r(this, "pos");
|
|
251
|
+
r(this, "view");
|
|
252
|
+
r(this, "bytes");
|
|
253
|
+
r(this, "entered", !1);
|
|
254
|
+
this.extensionCodec = (e == null ? void 0 : e.extensionCodec) ?? Y.defaultCodec, this.context = e == null ? void 0 : e.context, this.useBigInt64 = (e == null ? void 0 : e.useBigInt64) ?? !1, this.maxDepth = (e == null ? void 0 : e.maxDepth) ?? st, this.initialBufferSize = (e == null ? void 0 : e.initialBufferSize) ?? ot, this.sortKeys = (e == null ? void 0 : e.sortKeys) ?? !1, this.forceFloat32 = (e == null ? void 0 : e.forceFloat32) ?? !1, this.ignoreUndefined = (e == null ? void 0 : e.ignoreUndefined) ?? !1, this.forceIntegerToFloat = (e == null ? void 0 : e.forceIntegerToFloat) ?? !1, this.pos = 0, this.view = new DataView(new ArrayBuffer(this.initialBufferSize)), this.bytes = new Uint8Array(this.view.buffer);
|
|
254
255
|
}
|
|
255
256
|
clone() {
|
|
256
257
|
return new se({
|
|
@@ -304,8 +305,8 @@ class se {
|
|
|
304
305
|
this.view.byteLength < t && this.resizeBuffer(t * 2);
|
|
305
306
|
}
|
|
306
307
|
resizeBuffer(e) {
|
|
307
|
-
const t = new ArrayBuffer(e),
|
|
308
|
-
|
|
308
|
+
const t = new ArrayBuffer(e), i = new Uint8Array(t), n = new DataView(t);
|
|
309
|
+
i.set(this.bytes), this.view = n, this.bytes = i;
|
|
309
310
|
}
|
|
310
311
|
encodeNil() {
|
|
311
312
|
this.writeU8(192);
|
|
@@ -335,13 +336,13 @@ class se {
|
|
|
335
336
|
throw new Error(`Too long string: ${e} bytes in UTF-8`);
|
|
336
337
|
}
|
|
337
338
|
encodeString(e) {
|
|
338
|
-
const
|
|
339
|
-
this.ensureBufferSizeToWrite(5 +
|
|
339
|
+
const i = Me(e);
|
|
340
|
+
this.ensureBufferSizeToWrite(5 + i), this.writeStringHeader(i), Re(e, this.bytes, this.pos), this.pos += i;
|
|
340
341
|
}
|
|
341
342
|
encodeObject(e, t) {
|
|
342
|
-
const
|
|
343
|
-
if (
|
|
344
|
-
this.encodeExtension(
|
|
343
|
+
const i = this.extensionCodec.tryToEncode(e, this.context);
|
|
344
|
+
if (i != null)
|
|
345
|
+
this.encodeExtension(i);
|
|
345
346
|
else if (Array.isArray(e))
|
|
346
347
|
this.encodeArray(e, t);
|
|
347
348
|
else if (ArrayBuffer.isView(e))
|
|
@@ -361,51 +362,51 @@ class se {
|
|
|
361
362
|
this.writeU8(198), this.writeU32(t);
|
|
362
363
|
else
|
|
363
364
|
throw new Error(`Too large binary: ${t}`);
|
|
364
|
-
const
|
|
365
|
-
this.writeU8a(
|
|
365
|
+
const i = te(e);
|
|
366
|
+
this.writeU8a(i);
|
|
366
367
|
}
|
|
367
368
|
encodeArray(e, t) {
|
|
368
|
-
const
|
|
369
|
-
if (
|
|
370
|
-
this.writeU8(144 +
|
|
371
|
-
else if (
|
|
372
|
-
this.writeU8(220), this.writeU16(
|
|
373
|
-
else if (
|
|
374
|
-
this.writeU8(221), this.writeU32(
|
|
369
|
+
const i = e.length;
|
|
370
|
+
if (i < 16)
|
|
371
|
+
this.writeU8(144 + i);
|
|
372
|
+
else if (i < 65536)
|
|
373
|
+
this.writeU8(220), this.writeU16(i);
|
|
374
|
+
else if (i < 4294967296)
|
|
375
|
+
this.writeU8(221), this.writeU32(i);
|
|
375
376
|
else
|
|
376
|
-
throw new Error(`Too large array: ${
|
|
377
|
-
for (const
|
|
378
|
-
this.doEncode(
|
|
377
|
+
throw new Error(`Too large array: ${i}`);
|
|
378
|
+
for (const n of e)
|
|
379
|
+
this.doEncode(n, t + 1);
|
|
379
380
|
}
|
|
380
381
|
countWithoutUndefined(e, t) {
|
|
381
|
-
let
|
|
382
|
-
for (const
|
|
383
|
-
e[
|
|
384
|
-
return
|
|
382
|
+
let i = 0;
|
|
383
|
+
for (const n of t)
|
|
384
|
+
e[n] !== void 0 && i++;
|
|
385
|
+
return i;
|
|
385
386
|
}
|
|
386
387
|
encodeMap(e, t) {
|
|
387
|
-
const
|
|
388
|
-
this.sortKeys &&
|
|
389
|
-
const
|
|
390
|
-
if (
|
|
391
|
-
this.writeU8(128 +
|
|
392
|
-
else if (
|
|
393
|
-
this.writeU8(222), this.writeU16(
|
|
394
|
-
else if (
|
|
395
|
-
this.writeU8(223), this.writeU32(
|
|
388
|
+
const i = Object.keys(e);
|
|
389
|
+
this.sortKeys && i.sort();
|
|
390
|
+
const n = this.ignoreUndefined ? this.countWithoutUndefined(e, i) : i.length;
|
|
391
|
+
if (n < 16)
|
|
392
|
+
this.writeU8(128 + n);
|
|
393
|
+
else if (n < 65536)
|
|
394
|
+
this.writeU8(222), this.writeU16(n);
|
|
395
|
+
else if (n < 4294967296)
|
|
396
|
+
this.writeU8(223), this.writeU32(n);
|
|
396
397
|
else
|
|
397
|
-
throw new Error(`Too large map object: ${
|
|
398
|
-
for (const
|
|
399
|
-
const
|
|
400
|
-
this.ignoreUndefined &&
|
|
398
|
+
throw new Error(`Too large map object: ${n}`);
|
|
399
|
+
for (const o of i) {
|
|
400
|
+
const a = e[o];
|
|
401
|
+
this.ignoreUndefined && a === void 0 || (this.encodeString(o), this.doEncode(a, t + 1));
|
|
401
402
|
}
|
|
402
403
|
}
|
|
403
404
|
encodeExtension(e) {
|
|
404
405
|
if (typeof e.data == "function") {
|
|
405
|
-
const
|
|
406
|
-
if (
|
|
407
|
-
throw new Error(`Too large extension object: ${
|
|
408
|
-
this.writeU8(201), this.writeU32(
|
|
406
|
+
const i = e.data(this.pos + 6), n = i.length;
|
|
407
|
+
if (n >= 4294967296)
|
|
408
|
+
throw new Error(`Too large extension object: ${n}`);
|
|
409
|
+
this.writeU8(201), this.writeU32(n), this.writeI8(e.type), this.writeU8a(i);
|
|
409
410
|
return;
|
|
410
411
|
}
|
|
411
412
|
const t = e.data.length;
|
|
@@ -458,7 +459,7 @@ class se {
|
|
|
458
459
|
this.ensureBufferSizeToWrite(8), this.view.setFloat64(this.pos, e), this.pos += 8;
|
|
459
460
|
}
|
|
460
461
|
writeU64(e) {
|
|
461
|
-
this.ensureBufferSizeToWrite(8),
|
|
462
|
+
this.ensureBufferSizeToWrite(8), Ve(this.view, this.pos, e), this.pos += 8;
|
|
462
463
|
}
|
|
463
464
|
writeI64(e) {
|
|
464
465
|
this.ensureBufferSizeToWrite(8), ge(this.view, this.pos, e), this.pos += 8;
|
|
@@ -470,60 +471,60 @@ class se {
|
|
|
470
471
|
this.ensureBufferSizeToWrite(8), this.view.setBigInt64(this.pos, e), this.pos += 8;
|
|
471
472
|
}
|
|
472
473
|
}
|
|
473
|
-
function
|
|
474
|
+
function rt(s, e) {
|
|
474
475
|
return new se(e).encodeSharedRef(s);
|
|
475
476
|
}
|
|
476
477
|
function Z(s) {
|
|
477
478
|
return `${s < 0 ? "-" : ""}0x${Math.abs(s).toString(16).padStart(2, "0")}`;
|
|
478
479
|
}
|
|
479
|
-
const
|
|
480
|
-
class
|
|
481
|
-
constructor(e =
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
480
|
+
const at = 16, ct = 16;
|
|
481
|
+
class dt {
|
|
482
|
+
constructor(e = at, t = ct) {
|
|
483
|
+
r(this, "hit", 0);
|
|
484
|
+
r(this, "miss", 0);
|
|
485
|
+
r(this, "caches");
|
|
486
|
+
r(this, "maxKeyLength");
|
|
487
|
+
r(this, "maxLengthPerKey");
|
|
487
488
|
this.maxKeyLength = e, this.maxLengthPerKey = t, this.caches = [];
|
|
488
|
-
for (let
|
|
489
|
+
for (let i = 0; i < this.maxKeyLength; i++)
|
|
489
490
|
this.caches.push([]);
|
|
490
491
|
}
|
|
491
492
|
canBeCached(e) {
|
|
492
493
|
return e > 0 && e <= this.maxKeyLength;
|
|
493
494
|
}
|
|
494
|
-
find(e, t,
|
|
495
|
-
const
|
|
496
|
-
e: for (const
|
|
497
|
-
const
|
|
498
|
-
for (let
|
|
499
|
-
if (
|
|
495
|
+
find(e, t, i) {
|
|
496
|
+
const n = this.caches[i - 1];
|
|
497
|
+
e: for (const o of n) {
|
|
498
|
+
const a = o.bytes;
|
|
499
|
+
for (let d = 0; d < i; d++)
|
|
500
|
+
if (a[d] !== e[t + d])
|
|
500
501
|
continue e;
|
|
501
|
-
return
|
|
502
|
+
return o.str;
|
|
502
503
|
}
|
|
503
504
|
return null;
|
|
504
505
|
}
|
|
505
506
|
store(e, t) {
|
|
506
|
-
const
|
|
507
|
-
|
|
507
|
+
const i = this.caches[e.length - 1], n = { bytes: e, str: t };
|
|
508
|
+
i.length >= this.maxLengthPerKey ? i[Math.random() * i.length | 0] = n : i.push(n);
|
|
508
509
|
}
|
|
509
|
-
decode(e, t,
|
|
510
|
-
const
|
|
511
|
-
if (
|
|
512
|
-
return this.hit++,
|
|
510
|
+
decode(e, t, i) {
|
|
511
|
+
const n = this.find(e, t, i);
|
|
512
|
+
if (n != null)
|
|
513
|
+
return this.hit++, n;
|
|
513
514
|
this.miss++;
|
|
514
|
-
const
|
|
515
|
-
return this.store(
|
|
515
|
+
const o = ye(e, t, i), a = Uint8Array.prototype.slice.call(e, t, t + i);
|
|
516
|
+
return this.store(a, o), o;
|
|
516
517
|
}
|
|
517
518
|
}
|
|
518
|
-
const ne = "array", O = "map_key", me = "map_value",
|
|
519
|
+
const ne = "array", O = "map_key", me = "map_value", lt = (s) => {
|
|
519
520
|
if (typeof s == "string" || typeof s == "number")
|
|
520
521
|
return s;
|
|
521
522
|
throw new z("The type of key must be string or number but " + typeof s);
|
|
522
523
|
};
|
|
523
|
-
class
|
|
524
|
+
class ht {
|
|
524
525
|
constructor() {
|
|
525
|
-
|
|
526
|
-
|
|
526
|
+
r(this, "stack", []);
|
|
527
|
+
r(this, "stackHeadPosition", -1);
|
|
527
528
|
}
|
|
528
529
|
get length() {
|
|
529
530
|
return this.stackHeadPosition + 1;
|
|
@@ -558,12 +559,12 @@ class lt {
|
|
|
558
559
|
if (this.stack[this.stackHeadPosition] !== e)
|
|
559
560
|
throw new Error("Invalid stack state. Released state is not on top of the stack.");
|
|
560
561
|
if (e.type === ne) {
|
|
561
|
-
const
|
|
562
|
-
|
|
562
|
+
const i = e;
|
|
563
|
+
i.size = 0, i.array = void 0, i.position = 0, i.type = void 0;
|
|
563
564
|
}
|
|
564
565
|
if (e.type === O || e.type === me) {
|
|
565
|
-
const
|
|
566
|
-
|
|
566
|
+
const i = e;
|
|
567
|
+
i.size = 0, i.map = void 0, i.readCount = 0, i.type = void 0;
|
|
567
568
|
}
|
|
568
569
|
this.stackHeadPosition--;
|
|
569
570
|
}
|
|
@@ -571,35 +572,35 @@ class lt {
|
|
|
571
572
|
this.stack.length = 0, this.stackHeadPosition = -1;
|
|
572
573
|
}
|
|
573
574
|
}
|
|
574
|
-
const q = -1, oe = new DataView(new ArrayBuffer(0)),
|
|
575
|
+
const q = -1, oe = new DataView(new ArrayBuffer(0)), pt = new Uint8Array(oe.buffer);
|
|
575
576
|
try {
|
|
576
577
|
oe.getInt8(0);
|
|
577
578
|
} catch (s) {
|
|
578
579
|
if (!(s instanceof RangeError))
|
|
579
580
|
throw new Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access");
|
|
580
581
|
}
|
|
581
|
-
const pe = new RangeError("Insufficient data"),
|
|
582
|
+
const pe = new RangeError("Insufficient data"), ut = new dt();
|
|
582
583
|
class re {
|
|
583
584
|
constructor(e) {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
this.extensionCodec = (e == null ? void 0 : e.extensionCodec) ?? Y.defaultCodec, this.context = e == null ? void 0 : e.context, this.useBigInt64 = (e == null ? void 0 : e.useBigInt64) ?? !1, this.rawStrings = (e == null ? void 0 : e.rawStrings) ?? !1, this.maxStrLength = (e == null ? void 0 : e.maxStrLength) ?? j, this.maxBinLength = (e == null ? void 0 : e.maxBinLength) ?? j, this.maxArrayLength = (e == null ? void 0 : e.maxArrayLength) ?? j, this.maxMapLength = (e == null ? void 0 : e.maxMapLength) ?? j, this.maxExtLength = (e == null ? void 0 : e.maxExtLength) ?? j, this.keyDecoder = (e == null ? void 0 : e.keyDecoder) !== void 0 ? e.keyDecoder :
|
|
585
|
+
r(this, "extensionCodec");
|
|
586
|
+
r(this, "context");
|
|
587
|
+
r(this, "useBigInt64");
|
|
588
|
+
r(this, "rawStrings");
|
|
589
|
+
r(this, "maxStrLength");
|
|
590
|
+
r(this, "maxBinLength");
|
|
591
|
+
r(this, "maxArrayLength");
|
|
592
|
+
r(this, "maxMapLength");
|
|
593
|
+
r(this, "maxExtLength");
|
|
594
|
+
r(this, "keyDecoder");
|
|
595
|
+
r(this, "mapKeyConverter");
|
|
596
|
+
r(this, "totalPos", 0);
|
|
597
|
+
r(this, "pos", 0);
|
|
598
|
+
r(this, "view", oe);
|
|
599
|
+
r(this, "bytes", pt);
|
|
600
|
+
r(this, "headByte", q);
|
|
601
|
+
r(this, "stack", new ht());
|
|
602
|
+
r(this, "entered", !1);
|
|
603
|
+
this.extensionCodec = (e == null ? void 0 : e.extensionCodec) ?? Y.defaultCodec, this.context = e == null ? void 0 : e.context, this.useBigInt64 = (e == null ? void 0 : e.useBigInt64) ?? !1, this.rawStrings = (e == null ? void 0 : e.rawStrings) ?? !1, this.maxStrLength = (e == null ? void 0 : e.maxStrLength) ?? j, this.maxBinLength = (e == null ? void 0 : e.maxBinLength) ?? j, this.maxArrayLength = (e == null ? void 0 : e.maxArrayLength) ?? j, this.maxMapLength = (e == null ? void 0 : e.maxMapLength) ?? j, this.maxExtLength = (e == null ? void 0 : e.maxExtLength) ?? j, this.keyDecoder = (e == null ? void 0 : e.keyDecoder) !== void 0 ? e.keyDecoder : ut, this.mapKeyConverter = (e == null ? void 0 : e.mapKeyConverter) ?? lt;
|
|
603
604
|
}
|
|
604
605
|
clone() {
|
|
605
606
|
return new re({
|
|
@@ -626,16 +627,16 @@ class re {
|
|
|
626
627
|
if (this.headByte === q && !this.hasRemaining(1))
|
|
627
628
|
this.setBuffer(e);
|
|
628
629
|
else {
|
|
629
|
-
const t = this.bytes.subarray(this.pos),
|
|
630
|
-
|
|
630
|
+
const t = this.bytes.subarray(this.pos), i = te(e), n = new Uint8Array(t.length + i.length);
|
|
631
|
+
n.set(t), n.set(i, t.length), this.setBuffer(n);
|
|
631
632
|
}
|
|
632
633
|
}
|
|
633
634
|
hasRemaining(e) {
|
|
634
635
|
return this.view.byteLength - this.pos >= e;
|
|
635
636
|
}
|
|
636
637
|
createExtraByteError(e) {
|
|
637
|
-
const { view: t, pos:
|
|
638
|
-
return new RangeError(`Extra ${t.byteLength -
|
|
638
|
+
const { view: t, pos: i } = this;
|
|
639
|
+
return new RangeError(`Extra ${t.byteLength - i} of ${t.byteLength} byte(s) found at buffer[${e}]`);
|
|
639
640
|
}
|
|
640
641
|
/**
|
|
641
642
|
* @throws {@link DecodeError}
|
|
@@ -671,13 +672,13 @@ class re {
|
|
|
671
672
|
return this.clone().decodeAsync(e);
|
|
672
673
|
try {
|
|
673
674
|
this.entered = !0;
|
|
674
|
-
let t = !1,
|
|
675
|
-
for await (const
|
|
675
|
+
let t = !1, i;
|
|
676
|
+
for await (const d of e) {
|
|
676
677
|
if (t)
|
|
677
678
|
throw this.entered = !1, this.createExtraByteError(this.totalPos);
|
|
678
|
-
this.appendBuffer(
|
|
679
|
+
this.appendBuffer(d);
|
|
679
680
|
try {
|
|
680
|
-
|
|
681
|
+
i = this.doDecodeSync(), t = !0;
|
|
681
682
|
} catch (w) {
|
|
682
683
|
if (!(w instanceof RangeError))
|
|
683
684
|
throw w;
|
|
@@ -687,10 +688,10 @@ class re {
|
|
|
687
688
|
if (t) {
|
|
688
689
|
if (this.hasRemaining(1))
|
|
689
690
|
throw this.createExtraByteError(this.totalPos);
|
|
690
|
-
return
|
|
691
|
+
return i;
|
|
691
692
|
}
|
|
692
|
-
const { headByte:
|
|
693
|
-
throw new RangeError(`Insufficient data in parsing ${Z(
|
|
693
|
+
const { headByte: n, pos: o, totalPos: a } = this;
|
|
694
|
+
throw new RangeError(`Insufficient data in parsing ${Z(n)} at ${a} (${o} in the current buffer)`);
|
|
694
695
|
} finally {
|
|
695
696
|
this.entered = !1;
|
|
696
697
|
}
|
|
@@ -708,17 +709,17 @@ class re {
|
|
|
708
709
|
}
|
|
709
710
|
try {
|
|
710
711
|
this.entered = !0;
|
|
711
|
-
let
|
|
712
|
-
for await (const
|
|
713
|
-
if (t &&
|
|
712
|
+
let i = t, n = -1;
|
|
713
|
+
for await (const o of e) {
|
|
714
|
+
if (t && n === 0)
|
|
714
715
|
throw this.createExtraByteError(this.totalPos);
|
|
715
|
-
this.appendBuffer(
|
|
716
|
+
this.appendBuffer(o), i && (n = this.readArraySize(), i = !1, this.complete());
|
|
716
717
|
try {
|
|
717
|
-
for (; yield this.doDecodeSync(), --
|
|
718
|
+
for (; yield this.doDecodeSync(), --n !== 0; )
|
|
718
719
|
;
|
|
719
|
-
} catch (
|
|
720
|
-
if (!(
|
|
721
|
-
throw
|
|
720
|
+
} catch (a) {
|
|
721
|
+
if (!(a instanceof RangeError))
|
|
722
|
+
throw a;
|
|
722
723
|
}
|
|
723
724
|
this.totalPos += this.pos;
|
|
724
725
|
}
|
|
@@ -736,22 +737,22 @@ class re {
|
|
|
736
737
|
if (e < 128)
|
|
737
738
|
t = e;
|
|
738
739
|
else if (e < 144) {
|
|
739
|
-
const
|
|
740
|
-
if (
|
|
741
|
-
this.pushMapState(
|
|
740
|
+
const n = e - 128;
|
|
741
|
+
if (n !== 0) {
|
|
742
|
+
this.pushMapState(n), this.complete();
|
|
742
743
|
continue e;
|
|
743
744
|
} else
|
|
744
745
|
t = {};
|
|
745
746
|
} else if (e < 160) {
|
|
746
|
-
const
|
|
747
|
-
if (
|
|
748
|
-
this.pushArrayState(
|
|
747
|
+
const n = e - 144;
|
|
748
|
+
if (n !== 0) {
|
|
749
|
+
this.pushArrayState(n), this.complete();
|
|
749
750
|
continue e;
|
|
750
751
|
} else
|
|
751
752
|
t = [];
|
|
752
753
|
} else {
|
|
753
|
-
const
|
|
754
|
-
t = this.decodeString(
|
|
754
|
+
const n = e - 160;
|
|
755
|
+
t = this.decodeString(n, 0);
|
|
755
756
|
}
|
|
756
757
|
else if (e === 192)
|
|
757
758
|
t = null;
|
|
@@ -780,51 +781,51 @@ class re {
|
|
|
780
781
|
else if (e === 211)
|
|
781
782
|
this.useBigInt64 ? t = this.readI64AsBigInt() : t = this.readI64();
|
|
782
783
|
else if (e === 217) {
|
|
783
|
-
const
|
|
784
|
-
t = this.decodeString(
|
|
784
|
+
const n = this.lookU8();
|
|
785
|
+
t = this.decodeString(n, 1);
|
|
785
786
|
} else if (e === 218) {
|
|
786
|
-
const
|
|
787
|
-
t = this.decodeString(
|
|
787
|
+
const n = this.lookU16();
|
|
788
|
+
t = this.decodeString(n, 2);
|
|
788
789
|
} else if (e === 219) {
|
|
789
|
-
const
|
|
790
|
-
t = this.decodeString(
|
|
790
|
+
const n = this.lookU32();
|
|
791
|
+
t = this.decodeString(n, 4);
|
|
791
792
|
} else if (e === 220) {
|
|
792
|
-
const
|
|
793
|
-
if (
|
|
794
|
-
this.pushArrayState(
|
|
793
|
+
const n = this.readU16();
|
|
794
|
+
if (n !== 0) {
|
|
795
|
+
this.pushArrayState(n), this.complete();
|
|
795
796
|
continue e;
|
|
796
797
|
} else
|
|
797
798
|
t = [];
|
|
798
799
|
} else if (e === 221) {
|
|
799
|
-
const
|
|
800
|
-
if (
|
|
801
|
-
this.pushArrayState(
|
|
800
|
+
const n = this.readU32();
|
|
801
|
+
if (n !== 0) {
|
|
802
|
+
this.pushArrayState(n), this.complete();
|
|
802
803
|
continue e;
|
|
803
804
|
} else
|
|
804
805
|
t = [];
|
|
805
806
|
} else if (e === 222) {
|
|
806
|
-
const
|
|
807
|
-
if (
|
|
808
|
-
this.pushMapState(
|
|
807
|
+
const n = this.readU16();
|
|
808
|
+
if (n !== 0) {
|
|
809
|
+
this.pushMapState(n), this.complete();
|
|
809
810
|
continue e;
|
|
810
811
|
} else
|
|
811
812
|
t = {};
|
|
812
813
|
} else if (e === 223) {
|
|
813
|
-
const
|
|
814
|
-
if (
|
|
815
|
-
this.pushMapState(
|
|
814
|
+
const n = this.readU32();
|
|
815
|
+
if (n !== 0) {
|
|
816
|
+
this.pushMapState(n), this.complete();
|
|
816
817
|
continue e;
|
|
817
818
|
} else
|
|
818
819
|
t = {};
|
|
819
820
|
} else if (e === 196) {
|
|
820
|
-
const
|
|
821
|
-
t = this.decodeBinary(
|
|
821
|
+
const n = this.lookU8();
|
|
822
|
+
t = this.decodeBinary(n, 1);
|
|
822
823
|
} else if (e === 197) {
|
|
823
|
-
const
|
|
824
|
-
t = this.decodeBinary(
|
|
824
|
+
const n = this.lookU16();
|
|
825
|
+
t = this.decodeBinary(n, 2);
|
|
825
826
|
} else if (e === 198) {
|
|
826
|
-
const
|
|
827
|
-
t = this.decodeBinary(
|
|
827
|
+
const n = this.lookU32();
|
|
828
|
+
t = this.decodeBinary(n, 4);
|
|
828
829
|
} else if (e === 212)
|
|
829
830
|
t = this.decodeExtension(1, 0);
|
|
830
831
|
else if (e === 213)
|
|
@@ -836,34 +837,34 @@ class re {
|
|
|
836
837
|
else if (e === 216)
|
|
837
838
|
t = this.decodeExtension(16, 0);
|
|
838
839
|
else if (e === 199) {
|
|
839
|
-
const
|
|
840
|
-
t = this.decodeExtension(
|
|
840
|
+
const n = this.lookU8();
|
|
841
|
+
t = this.decodeExtension(n, 1);
|
|
841
842
|
} else if (e === 200) {
|
|
842
|
-
const
|
|
843
|
-
t = this.decodeExtension(
|
|
843
|
+
const n = this.lookU16();
|
|
844
|
+
t = this.decodeExtension(n, 2);
|
|
844
845
|
} else if (e === 201) {
|
|
845
|
-
const
|
|
846
|
-
t = this.decodeExtension(
|
|
846
|
+
const n = this.lookU32();
|
|
847
|
+
t = this.decodeExtension(n, 4);
|
|
847
848
|
} else
|
|
848
849
|
throw new z(`Unrecognized type byte: ${Z(e)}`);
|
|
849
850
|
this.complete();
|
|
850
|
-
const
|
|
851
|
-
for (;
|
|
852
|
-
const
|
|
853
|
-
if (
|
|
854
|
-
if (
|
|
855
|
-
t =
|
|
851
|
+
const i = this.stack;
|
|
852
|
+
for (; i.length > 0; ) {
|
|
853
|
+
const n = i.top();
|
|
854
|
+
if (n.type === ne)
|
|
855
|
+
if (n.array[n.position] = t, n.position++, n.position === n.size)
|
|
856
|
+
t = n.array, i.release(n);
|
|
856
857
|
else
|
|
857
858
|
continue e;
|
|
858
|
-
else if (
|
|
859
|
+
else if (n.type === O) {
|
|
859
860
|
if (t === "__proto__")
|
|
860
861
|
throw new z("The key __proto__ is not allowed");
|
|
861
|
-
|
|
862
|
+
n.key = this.mapKeyConverter(t), n.type = me;
|
|
862
863
|
continue e;
|
|
863
|
-
} else if (
|
|
864
|
-
t =
|
|
864
|
+
} else if (n.map[n.key] = t, n.readCount++, n.readCount === n.size)
|
|
865
|
+
t = n.map, i.release(n);
|
|
865
866
|
else {
|
|
866
|
-
|
|
867
|
+
n.key = null, n.type = O;
|
|
867
868
|
continue e;
|
|
868
869
|
}
|
|
869
870
|
}
|
|
@@ -907,14 +908,14 @@ class re {
|
|
|
907
908
|
* @throws {@link RangeError}
|
|
908
909
|
*/
|
|
909
910
|
decodeUtf8String(e, t) {
|
|
910
|
-
var
|
|
911
|
+
var o;
|
|
911
912
|
if (e > this.maxStrLength)
|
|
912
913
|
throw new z(`Max length exceeded: UTF-8 byte length (${e}) > maxStrLength (${this.maxStrLength})`);
|
|
913
914
|
if (this.bytes.byteLength < this.pos + t + e)
|
|
914
915
|
throw pe;
|
|
915
|
-
const
|
|
916
|
-
let
|
|
917
|
-
return this.stateIsMapKey() && ((
|
|
916
|
+
const i = this.pos + t;
|
|
917
|
+
let n;
|
|
918
|
+
return this.stateIsMapKey() && ((o = this.keyDecoder) != null && o.canBeCached(e)) ? n = this.keyDecoder.decode(this.bytes, i, e) : n = Ne(this.bytes, i, e), this.pos += t + e, n;
|
|
918
919
|
}
|
|
919
920
|
stateIsMapKey() {
|
|
920
921
|
return this.stack.length > 0 ? this.stack.top().type === O : !1;
|
|
@@ -927,18 +928,18 @@ class re {
|
|
|
927
928
|
throw new z(`Max length exceeded: bin length (${e}) > maxBinLength (${this.maxBinLength})`);
|
|
928
929
|
if (!this.hasRemaining(e + t))
|
|
929
930
|
throw pe;
|
|
930
|
-
const
|
|
931
|
-
return this.pos += t + e,
|
|
931
|
+
const i = this.pos + t, n = this.bytes.subarray(i, i + e);
|
|
932
|
+
return this.pos += t + e, n;
|
|
932
933
|
}
|
|
933
934
|
decodeExtension(e, t) {
|
|
934
935
|
if (e > this.maxExtLength)
|
|
935
936
|
throw new z(`Max length exceeded: ext length (${e}) > maxExtLength (${this.maxExtLength})`);
|
|
936
|
-
const
|
|
937
|
+
const i = this.view.getInt8(this.pos + t), n = this.decodeBinary(
|
|
937
938
|
e,
|
|
938
939
|
t + 1
|
|
939
940
|
/* extType */
|
|
940
941
|
);
|
|
941
|
-
return this.extensionCodec.decode(
|
|
942
|
+
return this.extensionCodec.decode(n, i, this.context);
|
|
942
943
|
}
|
|
943
944
|
lookU8() {
|
|
944
945
|
return this.view.getUint8(this.pos);
|
|
@@ -974,7 +975,7 @@ class re {
|
|
|
974
975
|
return this.pos += 4, e;
|
|
975
976
|
}
|
|
976
977
|
readU64() {
|
|
977
|
-
const e =
|
|
978
|
+
const e = We(this.view, this.pos);
|
|
978
979
|
return this.pos += 8, e;
|
|
979
980
|
}
|
|
980
981
|
readI64() {
|
|
@@ -998,10 +999,10 @@ class re {
|
|
|
998
999
|
return this.pos += 8, e;
|
|
999
1000
|
}
|
|
1000
1001
|
}
|
|
1001
|
-
function
|
|
1002
|
+
function ft(s, e) {
|
|
1002
1003
|
return new re(e).decode(s);
|
|
1003
1004
|
}
|
|
1004
|
-
const
|
|
1005
|
+
const wt = /* @__PURE__ */ new Set([
|
|
1005
1006
|
"auth",
|
|
1006
1007
|
"open",
|
|
1007
1008
|
"send",
|
|
@@ -1018,56 +1019,56 @@ const ft = /* @__PURE__ */ new Set([
|
|
|
1018
1019
|
"annotate",
|
|
1019
1020
|
"annotate_clear"
|
|
1020
1021
|
]);
|
|
1021
|
-
function wt(s) {
|
|
1022
|
-
return ft.has(s.type);
|
|
1023
|
-
}
|
|
1024
1022
|
function xt(s) {
|
|
1025
|
-
return
|
|
1023
|
+
return wt.has(s.type);
|
|
1026
1024
|
}
|
|
1027
1025
|
function yt(s) {
|
|
1026
|
+
return rt(s);
|
|
1027
|
+
}
|
|
1028
|
+
function gt(s) {
|
|
1028
1029
|
let e;
|
|
1029
1030
|
try {
|
|
1030
|
-
e =
|
|
1031
|
+
e = ft(s);
|
|
1031
1032
|
} catch {
|
|
1032
1033
|
return null;
|
|
1033
1034
|
}
|
|
1034
1035
|
return typeof e != "object" || e === null || typeof e.type != "string" ? null : e;
|
|
1035
1036
|
}
|
|
1036
|
-
class
|
|
1037
|
+
class bt {
|
|
1037
1038
|
constructor(e) {
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1039
|
+
r(this, "conversationId");
|
|
1040
|
+
r(this, "state", "");
|
|
1041
|
+
r(this, "version", 0);
|
|
1042
|
+
r(this, "hasMoreHistory", !1);
|
|
1043
|
+
r(this, "lastReadByOthers", 0);
|
|
1044
|
+
r(this, "assignedAgentId");
|
|
1045
|
+
r(this, "accent");
|
|
1046
|
+
r(this, "subject");
|
|
1047
|
+
r(this, "name");
|
|
1048
|
+
r(this, "e2e", !1);
|
|
1049
|
+
r(this, "offline", !1);
|
|
1050
|
+
r(this, "offlineMessage", "");
|
|
1051
|
+
r(this, "whiteLabel", !1);
|
|
1052
|
+
r(this, "typing", /* @__PURE__ */ new Set());
|
|
1053
|
+
r(this, "online", /* @__PURE__ */ new Set());
|
|
1053
1054
|
/** Co-browsing: shared whiteboard strokes for this conversation. */
|
|
1054
|
-
|
|
1055
|
+
r(this, "annotations", []);
|
|
1055
1056
|
/** Bumped on any annotation change so the renderer can cheaply detect updates. */
|
|
1056
|
-
|
|
1057
|
+
r(this, "annotationVersion", 0);
|
|
1057
1058
|
/** Live sentiment of the guest's latest message (agent-side only). */
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1059
|
+
r(this, "sentiment");
|
|
1060
|
+
r(this, "sentimentScore");
|
|
1061
|
+
r(this, "actions", []);
|
|
1062
|
+
r(this, "byId", /* @__PURE__ */ new Map());
|
|
1063
|
+
r(this, "keyByClient", /* @__PURE__ */ new Map());
|
|
1064
|
+
r(this, "_maxSeq", 0);
|
|
1065
|
+
r(this, "_sorted", null);
|
|
1065
1066
|
this.me = e;
|
|
1066
1067
|
}
|
|
1067
1068
|
messages() {
|
|
1068
1069
|
return this._sorted || (this._sorted = [...this.byId.values()].sort((e, t) => {
|
|
1069
|
-
const
|
|
1070
|
-
return
|
|
1070
|
+
const i = e.status === "pending", n = t.status === "pending";
|
|
1071
|
+
return i !== n ? i ? 1 : -1 : i && n ? e.ts - t.ts : e.seq - t.seq;
|
|
1071
1072
|
})), this._sorted;
|
|
1072
1073
|
}
|
|
1073
1074
|
visibleActions() {
|
|
@@ -1077,7 +1078,7 @@ class gt {
|
|
|
1077
1078
|
return this._maxSeq;
|
|
1078
1079
|
}
|
|
1079
1080
|
addOptimistic(e, t) {
|
|
1080
|
-
const
|
|
1081
|
+
const i = {
|
|
1081
1082
|
id: e,
|
|
1082
1083
|
conversationId: this.conversationId,
|
|
1083
1084
|
seq: 0,
|
|
@@ -1088,7 +1089,7 @@ class gt {
|
|
|
1088
1089
|
clientMsgId: e,
|
|
1089
1090
|
status: "pending"
|
|
1090
1091
|
};
|
|
1091
|
-
return this.byId.set(e,
|
|
1092
|
+
return this.byId.set(e, i), this.keyByClient.set(e, e), this._sorted = null, i;
|
|
1092
1093
|
}
|
|
1093
1094
|
apply(e) {
|
|
1094
1095
|
var t;
|
|
@@ -1103,11 +1104,11 @@ class gt {
|
|
|
1103
1104
|
this.upsert({ ...e.message });
|
|
1104
1105
|
return;
|
|
1105
1106
|
case "ack": {
|
|
1106
|
-
const
|
|
1107
|
-
if (
|
|
1108
|
-
this.byId.delete(
|
|
1109
|
-
const
|
|
1110
|
-
this.byId.set(e.messageId,
|
|
1107
|
+
const i = this.keyByClient.get(e.clientMsgId), n = i ? this.byId.get(i) : void 0;
|
|
1108
|
+
if (n && i) {
|
|
1109
|
+
this.byId.delete(i);
|
|
1110
|
+
const o = { ...n, id: e.messageId, seq: e.seq, ts: e.ts, status: "sent" };
|
|
1111
|
+
this.byId.set(e.messageId, o), this.keyByClient.set(e.clientMsgId, e.messageId), e.seq > this._maxSeq && (this._maxSeq = e.seq);
|
|
1111
1112
|
}
|
|
1112
1113
|
this._sorted = null;
|
|
1113
1114
|
return;
|
|
@@ -1119,30 +1120,30 @@ class gt {
|
|
|
1119
1120
|
e.by !== this.me && (this.lastReadByOthers = Math.max(this.lastReadByOthers, e.seq), this.markOwnStatus(e.seq, "read"));
|
|
1120
1121
|
return;
|
|
1121
1122
|
case "sync":
|
|
1122
|
-
for (const
|
|
1123
|
+
for (const i of e.messages) this.upsert({ ...i });
|
|
1123
1124
|
return;
|
|
1124
1125
|
case "history":
|
|
1125
|
-
for (const
|
|
1126
|
+
for (const i of e.messages) this.upsert({ ...i });
|
|
1126
1127
|
this.hasMoreHistory = e.hasMore;
|
|
1127
1128
|
return;
|
|
1128
1129
|
case "typing":
|
|
1129
1130
|
e.userId !== this.me && (e.isTyping ? this.typing.add(e.userId) : this.typing.delete(e.userId));
|
|
1130
1131
|
return;
|
|
1131
1132
|
case "reaction": {
|
|
1132
|
-
const
|
|
1133
|
-
if (!
|
|
1134
|
-
const
|
|
1135
|
-
e.removed ||
|
|
1133
|
+
const i = this.byId.get(e.messageId);
|
|
1134
|
+
if (!i) return;
|
|
1135
|
+
const n = { ...i.reactions ?? {} }, o = (n[e.emoji] ?? []).filter((a) => a !== e.by);
|
|
1136
|
+
e.removed || o.push(e.by), o.length ? n[e.emoji] = o : delete n[e.emoji], this.byId.set(e.messageId, { ...i, reactions: n }), this._sorted = null;
|
|
1136
1137
|
return;
|
|
1137
1138
|
}
|
|
1138
1139
|
case "edited": {
|
|
1139
|
-
const
|
|
1140
|
-
|
|
1140
|
+
const i = this.byId.get(e.messageId);
|
|
1141
|
+
i && (this.byId.set(e.messageId, { ...i, content: e.content, editedAt: e.editedAt }), this._sorted = null);
|
|
1141
1142
|
return;
|
|
1142
1143
|
}
|
|
1143
1144
|
case "deleted": {
|
|
1144
|
-
const
|
|
1145
|
-
|
|
1145
|
+
const i = this.byId.get(e.messageId);
|
|
1146
|
+
i && (this.byId.set(e.messageId, { ...i, deletedAt: e.ts }), this._sorted = null);
|
|
1146
1147
|
return;
|
|
1147
1148
|
}
|
|
1148
1149
|
case "state":
|
|
@@ -1178,11 +1179,11 @@ class gt {
|
|
|
1178
1179
|
this.byId.set(e.id, t ? { ...t, ...e } : e), e.seq > this._maxSeq && (this._maxSeq = e.seq), this._sorted = null;
|
|
1179
1180
|
}
|
|
1180
1181
|
markOwnStatus(e, t) {
|
|
1181
|
-
const
|
|
1182
|
-
let
|
|
1183
|
-
for (const [
|
|
1184
|
-
|
|
1185
|
-
|
|
1182
|
+
const i = ue(t);
|
|
1183
|
+
let n = !1;
|
|
1184
|
+
for (const [o, a] of this.byId)
|
|
1185
|
+
a.senderId !== this.me || a.seq <= 0 || a.seq > e || ue(a.status) >= i || (this.byId.set(o, { ...a, status: t }), n = !0);
|
|
1186
|
+
n && (this._sorted = null);
|
|
1186
1187
|
}
|
|
1187
1188
|
}
|
|
1188
1189
|
function ue(s) {
|
|
@@ -1197,27 +1198,27 @@ function ue(s) {
|
|
|
1197
1198
|
return 0;
|
|
1198
1199
|
}
|
|
1199
1200
|
}
|
|
1200
|
-
class
|
|
1201
|
+
class mt {
|
|
1201
1202
|
constructor(e) {
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1203
|
+
r(this, "socket", null);
|
|
1204
|
+
r(this, "state", "idle");
|
|
1205
|
+
r(this, "authed", !1);
|
|
1206
|
+
r(this, "attempt", 0);
|
|
1207
|
+
r(this, "outbox", []);
|
|
1208
|
+
r(this, "stopped", !1);
|
|
1209
|
+
r(this, "timer", null);
|
|
1209
1210
|
this.opts = e;
|
|
1210
1211
|
}
|
|
1211
1212
|
connect() {
|
|
1212
|
-
var
|
|
1213
|
+
var i, n;
|
|
1213
1214
|
if (this.state === "connecting" || this.state === "open") return;
|
|
1214
|
-
this.stopped = !1, this.state = "connecting", this.authed = !1, (
|
|
1215
|
-
const t = (this.opts.socketFactory ??
|
|
1215
|
+
this.stopped = !1, this.state = "connecting", this.authed = !1, (n = (i = this.opts).onStatusChange) == null || n.call(i, this.attempt > 0 ? "reconnecting" : "connecting");
|
|
1216
|
+
const t = (this.opts.socketFactory ?? vt)(this.opts.url);
|
|
1216
1217
|
t.binaryType = "arraybuffer", this.socket = t, t.onopen = () => {
|
|
1217
1218
|
this.raw({ type: "auth", token: this.opts.token });
|
|
1218
|
-
}, t.onmessage = (
|
|
1219
|
-
const
|
|
1220
|
-
!
|
|
1219
|
+
}, t.onmessage = (o) => {
|
|
1220
|
+
const a = gt(new Uint8Array(o.data));
|
|
1221
|
+
!a || xt(a) || this.handle(a);
|
|
1221
1222
|
}, t.onclose = () => this.onClosed(), t.onerror = () => {
|
|
1222
1223
|
try {
|
|
1223
1224
|
t.close();
|
|
@@ -1245,8 +1246,8 @@ class bt {
|
|
|
1245
1246
|
}
|
|
1246
1247
|
}
|
|
1247
1248
|
handle(e) {
|
|
1248
|
-
var t,
|
|
1249
|
-
e.type === "authed" && (this.attempt = 0, this.state = "open", this.authed = !0, (
|
|
1249
|
+
var t, i;
|
|
1250
|
+
e.type === "authed" && (this.attempt = 0, this.state = "open", this.authed = !0, (i = (t = this.opts).onStatusChange) == null || i.call(t, "open"), this.raw(this.opts.open), this.flush()), e.type === "opened" && this.raw({ type: "sync", conversationId: e.conversation.id, sinceSeq: this.opts.getCursor() }), this.opts.onFrame(e);
|
|
1250
1251
|
}
|
|
1251
1252
|
flush() {
|
|
1252
1253
|
const e = this.outbox;
|
|
@@ -1256,7 +1257,7 @@ class bt {
|
|
|
1256
1257
|
raw(e) {
|
|
1257
1258
|
var t;
|
|
1258
1259
|
try {
|
|
1259
|
-
(t = this.socket) == null || t.send(
|
|
1260
|
+
(t = this.socket) == null || t.send(yt(e));
|
|
1260
1261
|
} catch {
|
|
1261
1262
|
this.outbox.push(e);
|
|
1262
1263
|
}
|
|
@@ -1267,17 +1268,17 @@ class bt {
|
|
|
1267
1268
|
return;
|
|
1268
1269
|
}
|
|
1269
1270
|
this.state = "idle";
|
|
1270
|
-
const e = this.opts.backoffBaseMs ?? 500, t = this.opts.backoffMaxMs ?? 15e3,
|
|
1271
|
-
this.attempt++, this.timer = setTimeout(() => this.connect(),
|
|
1271
|
+
const e = this.opts.backoffBaseMs ?? 500, t = this.opts.backoffMaxMs ?? 15e3, i = Math.min(t, e * 2 ** this.attempt) * (0.5 + Math.random() * 0.5);
|
|
1272
|
+
this.attempt++, this.timer = setTimeout(() => this.connect(), i);
|
|
1272
1273
|
}
|
|
1273
1274
|
}
|
|
1274
|
-
function
|
|
1275
|
+
function vt(s) {
|
|
1275
1276
|
return new WebSocket(s);
|
|
1276
1277
|
}
|
|
1277
|
-
const fe = 200,
|
|
1278
|
-
class
|
|
1278
|
+
const fe = 200, kt = 7 * 864e5;
|
|
1279
|
+
class St {
|
|
1279
1280
|
constructor(e) {
|
|
1280
|
-
|
|
1281
|
+
r(this, "key");
|
|
1281
1282
|
this.key = `ocw_outbox_${e}`;
|
|
1282
1283
|
}
|
|
1283
1284
|
/** All pending items, oldest first, with stale (>7d) entries dropped. */
|
|
@@ -1285,8 +1286,8 @@ class kt {
|
|
|
1285
1286
|
try {
|
|
1286
1287
|
const e = localStorage.getItem(this.key);
|
|
1287
1288
|
if (!e) return [];
|
|
1288
|
-
const t = JSON.parse(e),
|
|
1289
|
-
return
|
|
1289
|
+
const t = JSON.parse(e), i = Date.now() - kt, n = t.filter((o) => o.ts >= i);
|
|
1290
|
+
return n.length !== t.length && this.save(n), n;
|
|
1290
1291
|
} catch {
|
|
1291
1292
|
return [];
|
|
1292
1293
|
}
|
|
@@ -1301,7 +1302,7 @@ class kt {
|
|
|
1301
1302
|
/** Remove an item once it's been acknowledged by the server. */
|
|
1302
1303
|
remove(e) {
|
|
1303
1304
|
try {
|
|
1304
|
-
const t = this.load().filter((
|
|
1305
|
+
const t = this.load().filter((i) => i.clientMsgId !== e);
|
|
1305
1306
|
this.save(t);
|
|
1306
1307
|
} catch {
|
|
1307
1308
|
}
|
|
@@ -1313,31 +1314,31 @@ class kt {
|
|
|
1313
1314
|
}
|
|
1314
1315
|
}
|
|
1315
1316
|
}
|
|
1316
|
-
const
|
|
1317
|
+
const I = () => globalThis.crypto.subtle;
|
|
1317
1318
|
function J(s) {
|
|
1318
1319
|
const e = s instanceof Uint8Array ? s : new Uint8Array(s);
|
|
1319
1320
|
let t = "";
|
|
1320
|
-
for (const
|
|
1321
|
+
for (const i of e) t += String.fromCharCode(i);
|
|
1321
1322
|
return btoa(t);
|
|
1322
1323
|
}
|
|
1323
1324
|
function ie(s) {
|
|
1324
|
-
const e = atob(s), t = new ArrayBuffer(e.length),
|
|
1325
|
-
for (let
|
|
1326
|
-
return
|
|
1325
|
+
const e = atob(s), t = new ArrayBuffer(e.length), i = new Uint8Array(t);
|
|
1326
|
+
for (let n = 0; n < e.length; n++) i[n] = e.charCodeAt(n);
|
|
1327
|
+
return i;
|
|
1327
1328
|
}
|
|
1328
1329
|
async function N() {
|
|
1329
|
-
const s = await
|
|
1330
|
+
const s = await I().generateKey({ name: "ECDH", namedCurve: "P-256" }, !0, ["deriveKey", "deriveBits"]);
|
|
1330
1331
|
return { publicKey: s.publicKey, privateKey: s.privateKey };
|
|
1331
1332
|
}
|
|
1332
1333
|
async function _(s) {
|
|
1333
|
-
return J(await
|
|
1334
|
+
return J(await I().exportKey("raw", s));
|
|
1334
1335
|
}
|
|
1335
1336
|
async function F(s) {
|
|
1336
|
-
return
|
|
1337
|
+
return I().importKey("raw", ie(s), { name: "ECDH", namedCurve: "P-256" }, !1, []);
|
|
1337
1338
|
}
|
|
1338
|
-
async function
|
|
1339
|
+
async function It(s, e) {
|
|
1339
1340
|
const t = await F(e);
|
|
1340
|
-
return
|
|
1341
|
+
return I().deriveKey(
|
|
1341
1342
|
{ name: "ECDH", public: t },
|
|
1342
1343
|
s,
|
|
1343
1344
|
{ name: "AES-GCM", length: 256 },
|
|
@@ -1345,38 +1346,38 @@ async function St(s, e) {
|
|
|
1345
1346
|
["encrypt", "decrypt"]
|
|
1346
1347
|
);
|
|
1347
1348
|
}
|
|
1348
|
-
async function
|
|
1349
|
-
const t = globalThis.crypto.getRandomValues(new Uint8Array(12)),
|
|
1350
|
-
return { ct: J(
|
|
1349
|
+
async function Ct(s, e) {
|
|
1350
|
+
const t = globalThis.crypto.getRandomValues(new Uint8Array(12)), i = new TextEncoder().encode(e), n = await I().encrypt({ name: "AES-GCM", iv: t }, s, i);
|
|
1351
|
+
return { ct: J(n), iv: J(t) };
|
|
1351
1352
|
}
|
|
1352
|
-
async function
|
|
1353
|
-
const
|
|
1354
|
-
return new TextDecoder().decode(
|
|
1353
|
+
async function Et(s, e, t) {
|
|
1354
|
+
const i = await I().decrypt({ name: "AES-GCM", iv: ie(t) }, s, ie(e));
|
|
1355
|
+
return new TextDecoder().decode(i);
|
|
1355
1356
|
}
|
|
1356
|
-
async function
|
|
1357
|
-
var t,
|
|
1357
|
+
async function Tt(s) {
|
|
1358
|
+
var t, i;
|
|
1358
1359
|
try {
|
|
1359
|
-
const
|
|
1360
|
-
if (
|
|
1361
|
-
const { pub:
|
|
1362
|
-
return { publicKey:
|
|
1360
|
+
const n = (t = globalThis.localStorage) == null ? void 0 : t.getItem(s);
|
|
1361
|
+
if (n) {
|
|
1362
|
+
const { pub: o, priv: a } = JSON.parse(n), d = await I().importKey("jwk", o, { name: "ECDH", namedCurve: "P-256" }, !0, []), w = await I().importKey("jwk", a, { name: "ECDH", namedCurve: "P-256" }, !0, ["deriveKey", "deriveBits"]);
|
|
1363
|
+
return { publicKey: d, privateKey: w };
|
|
1363
1364
|
}
|
|
1364
1365
|
} catch {
|
|
1365
1366
|
}
|
|
1366
1367
|
const e = await N();
|
|
1367
1368
|
try {
|
|
1368
|
-
const
|
|
1369
|
-
(
|
|
1369
|
+
const n = await I().exportKey("jwk", e.publicKey), o = await I().exportKey("jwk", e.privateKey);
|
|
1370
|
+
(i = globalThis.localStorage) == null || i.setItem(s, JSON.stringify({ pub: n, priv: o }));
|
|
1370
1371
|
} catch {
|
|
1371
1372
|
}
|
|
1372
1373
|
return e;
|
|
1373
1374
|
}
|
|
1374
|
-
async function
|
|
1375
|
-
const t = await
|
|
1376
|
-
return J(
|
|
1375
|
+
async function Ut(s, e) {
|
|
1376
|
+
const t = await I().exportKey("raw", e), i = await I().sign({ name: "ECDSA", hash: "SHA-256" }, s, t);
|
|
1377
|
+
return J(i);
|
|
1377
1378
|
}
|
|
1378
|
-
async function
|
|
1379
|
-
const s = await N(), e = await
|
|
1379
|
+
async function Pt() {
|
|
1380
|
+
const s = await N(), e = await I().generateKey({ name: "ECDSA", namedCurve: "P-256" }, !0, ["sign", "verify"]);
|
|
1380
1381
|
return {
|
|
1381
1382
|
ecdhKP: s,
|
|
1382
1383
|
ecdsaKP: { publicKey: e.publicKey, privateKey: e.privateKey },
|
|
@@ -1385,49 +1386,49 @@ async function Ut() {
|
|
|
1385
1386
|
};
|
|
1386
1387
|
}
|
|
1387
1388
|
async function we(s) {
|
|
1388
|
-
var t,
|
|
1389
|
+
var t, i;
|
|
1389
1390
|
try {
|
|
1390
|
-
const
|
|
1391
|
-
if (
|
|
1392
|
-
const
|
|
1391
|
+
const n = (t = globalThis.localStorage) == null ? void 0 : t.getItem(`${s}-identity`);
|
|
1392
|
+
if (n) {
|
|
1393
|
+
const o = JSON.parse(n), a = await I().importKey("jwk", o.ecdhPub, { name: "ECDH", namedCurve: "P-256" }, !0, []), d = await I().importKey("jwk", o.ecdhPriv, { name: "ECDH", namedCurve: "P-256" }, !0, ["deriveKey", "deriveBits"]), w = await I().importKey("jwk", o.ecdsaPub, { name: "ECDSA", namedCurve: "P-256" }, !0, ["verify"]), x = await I().importKey("jwk", o.ecdsaPriv, { name: "ECDSA", namedCurve: "P-256" }, !0, ["sign"]);
|
|
1393
1394
|
return {
|
|
1394
|
-
ecdhKP: { publicKey:
|
|
1395
|
+
ecdhKP: { publicKey: a, privateKey: d },
|
|
1395
1396
|
ecdsaKP: { publicKey: w, privateKey: x },
|
|
1396
|
-
publicKeyB64: await _(
|
|
1397
|
+
publicKeyB64: await _(a),
|
|
1397
1398
|
sigPublicKeyB64: await _(w)
|
|
1398
1399
|
};
|
|
1399
1400
|
}
|
|
1400
1401
|
} catch {
|
|
1401
1402
|
}
|
|
1402
|
-
const e = await
|
|
1403
|
+
const e = await Pt();
|
|
1403
1404
|
try {
|
|
1404
|
-
const
|
|
1405
|
-
(
|
|
1405
|
+
const n = await I().exportKey("jwk", e.ecdhKP.publicKey), o = await I().exportKey("jwk", e.ecdhKP.privateKey), a = await I().exportKey("jwk", e.ecdsaKP.publicKey), d = await I().exportKey("jwk", e.ecdsaKP.privateKey);
|
|
1406
|
+
(i = globalThis.localStorage) == null || i.setItem(`${s}-identity`, JSON.stringify({ ecdhPub: n, ecdhPriv: o, ecdsaPub: a, ecdsaPriv: d }));
|
|
1406
1407
|
} catch {
|
|
1407
1408
|
}
|
|
1408
1409
|
return e;
|
|
1409
1410
|
}
|
|
1410
|
-
async function
|
|
1411
|
-
const t = await N(),
|
|
1412
|
-
return { sharedKey: await ke(f), ephemeralPublicKey:
|
|
1411
|
+
async function Bt(s, e) {
|
|
1412
|
+
const t = await N(), i = await _(t.publicKey), n = await F(e.identityKey), o = await F(e.signedPrekey), a = e.oneTimePrekey ? await F(e.oneTimePrekey) : null, d = await D(s.privateKey, o), w = await D(t.privateKey, n), x = await D(t.privateKey, o), m = a ? await D(t.privateKey, a) : null, f = ve(d, w, x, ...m ? [m] : []);
|
|
1413
|
+
return { sharedKey: await ke(f), ephemeralPublicKey: i };
|
|
1413
1414
|
}
|
|
1414
|
-
async function
|
|
1415
|
-
const
|
|
1415
|
+
async function Kt(s, e, t, i, n) {
|
|
1416
|
+
const o = await F(t), a = await F(i), d = await D(e.privateKey, o), w = await D(s.privateKey, a), x = await D(e.privateKey, a), m = n ? await D(n.privateKey, a) : null, f = ve(d, w, x, ...m ? [m] : []);
|
|
1416
1417
|
return ke(f);
|
|
1417
1418
|
}
|
|
1418
1419
|
async function D(s, e) {
|
|
1419
|
-
return
|
|
1420
|
+
return I().deriveBits({ name: "ECDH", public: e }, s, 256);
|
|
1420
1421
|
}
|
|
1421
1422
|
function ve(...s) {
|
|
1422
|
-
const e = s.reduce((
|
|
1423
|
-
let
|
|
1424
|
-
for (const
|
|
1425
|
-
t.set(new Uint8Array(
|
|
1423
|
+
const e = s.reduce((n, o) => n + o.byteLength, 0), t = new Uint8Array(e);
|
|
1424
|
+
let i = 0;
|
|
1425
|
+
for (const n of s)
|
|
1426
|
+
t.set(new Uint8Array(n), i), i += n.byteLength;
|
|
1426
1427
|
return t.buffer;
|
|
1427
1428
|
}
|
|
1428
1429
|
async function ke(s) {
|
|
1429
|
-
const e = await
|
|
1430
|
-
return
|
|
1430
|
+
const e = await I().importKey("raw", s, "HKDF", !1, ["deriveKey"]);
|
|
1431
|
+
return I().deriveKey(
|
|
1431
1432
|
{ name: "HKDF", hash: "SHA-256", salt: new Uint8Array(32), info: new TextEncoder().encode("ObjectChat X3DH v1") },
|
|
1432
1433
|
e,
|
|
1433
1434
|
{ name: "AES-GCM", length: 256 },
|
|
@@ -1435,21 +1436,21 @@ async function ke(s) {
|
|
|
1435
1436
|
["encrypt", "decrypt"]
|
|
1436
1437
|
);
|
|
1437
1438
|
}
|
|
1438
|
-
const
|
|
1439
|
-
class
|
|
1439
|
+
const At = 20;
|
|
1440
|
+
class zt {
|
|
1440
1441
|
constructor(e) {
|
|
1441
1442
|
// Live ECDH mode state
|
|
1442
|
-
|
|
1443
|
-
|
|
1443
|
+
r(this, "kp");
|
|
1444
|
+
r(this, "shared");
|
|
1444
1445
|
// X3DH async mode state
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1446
|
+
r(this, "identityKP");
|
|
1447
|
+
r(this, "signedPreKP");
|
|
1448
|
+
r(this, "signedPrekeyId");
|
|
1449
|
+
r(this, "otpKeys", []);
|
|
1449
1450
|
// one-time prekeys awaiting matching
|
|
1450
|
-
|
|
1451
|
+
r(this, "x3dhShared");
|
|
1451
1452
|
// Queued init messages arriving before we could derive (shouldn't happen, but safe)
|
|
1452
|
-
|
|
1453
|
+
r(this, "pendingX3DH");
|
|
1453
1454
|
this.storageKey = e;
|
|
1454
1455
|
}
|
|
1455
1456
|
get ready() {
|
|
@@ -1457,60 +1458,60 @@ class At {
|
|
|
1457
1458
|
}
|
|
1458
1459
|
/** Live ECDH mode: Generate/restore our keypair and return our public key to publish. */
|
|
1459
1460
|
async begin() {
|
|
1460
|
-
return this.kp = await
|
|
1461
|
+
return this.kp = await Tt(this.storageKey), _(this.kp.publicKey);
|
|
1461
1462
|
}
|
|
1462
1463
|
/** Live ECDH mode: A peer published their key — derive the shared secret. */
|
|
1463
1464
|
async onPeerKey(e) {
|
|
1464
|
-
this.kp && (this.shared = await
|
|
1465
|
+
this.kp && (this.shared = await It(this.kp.privateKey, e));
|
|
1465
1466
|
}
|
|
1466
1467
|
// ── X3DH async mode ────────────────────────────────────────────────────────
|
|
1467
1468
|
/** X3DH: Generate identity key, signed prekey, and OTP prekeys.
|
|
1468
1469
|
* Returns the upload frame payload the caller should send to the server. */
|
|
1469
1470
|
async initX3DH() {
|
|
1470
1471
|
this.identityKP = await we(this.storageKey), this.signedPreKP = await N(), this.signedPrekeyId = `spk-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1471
|
-
for (let
|
|
1472
|
-
const e = await _(this.signedPreKP.publicKey), t = await
|
|
1472
|
+
for (let n = 0; n < At; n++) this.otpKeys.push(await N());
|
|
1473
|
+
const e = await _(this.signedPreKP.publicKey), t = await Ut(this.identityKP.ecdsaKP.privateKey, this.signedPreKP.publicKey), i = await Promise.all(this.otpKeys.map((n) => _(n.publicKey)));
|
|
1473
1474
|
return {
|
|
1474
1475
|
identityKey: this.identityKP.publicKeyB64,
|
|
1475
1476
|
signedPrekey: e,
|
|
1476
1477
|
signedPrekeyId: this.signedPrekeyId,
|
|
1477
1478
|
signature: t,
|
|
1478
|
-
oneTimePrekeys:
|
|
1479
|
+
oneTimePrekeys: i
|
|
1479
1480
|
};
|
|
1480
1481
|
}
|
|
1481
1482
|
/** X3DH sender: given a recipient's prekey bundle, derive the shared key and
|
|
1482
1483
|
* return the init message fields to embed in the first encrypted message. */
|
|
1483
1484
|
async x3dhSendTo(e) {
|
|
1484
1485
|
this.identityKP || (this.identityKP = await we(this.storageKey));
|
|
1485
|
-
const { sharedKey: t, ephemeralPublicKey:
|
|
1486
|
-
return this.x3dhShared = t, { ephemeralKey:
|
|
1486
|
+
const { sharedKey: t, ephemeralPublicKey: i } = await Bt(this.identityKP.ecdhKP, e);
|
|
1487
|
+
return this.x3dhShared = t, { ephemeralKey: i, spkId: e.signedPrekeyId, usedOTP: !!e.oneTimePrekey, senderIK: this.identityKP.publicKeyB64 };
|
|
1487
1488
|
}
|
|
1488
1489
|
/** X3DH recipient: given an init message's sender IK + EK + SPK ID, derive the shared key. */
|
|
1489
|
-
async x3dhReceiveFrom(e, t,
|
|
1490
|
+
async x3dhReceiveFrom(e, t, i) {
|
|
1490
1491
|
if (!this.identityKP || !this.signedPreKP) {
|
|
1491
|
-
this.pendingX3DH = { senderIK: e, ephemeralKey: t, spkId:
|
|
1492
|
+
this.pendingX3DH = { senderIK: e, ephemeralKey: t, spkId: i };
|
|
1492
1493
|
return;
|
|
1493
1494
|
}
|
|
1494
|
-
const
|
|
1495
|
-
this.x3dhShared = await
|
|
1495
|
+
const n = this.otpKeys.shift();
|
|
1496
|
+
this.x3dhShared = await Kt(this.identityKP.ecdhKP, this.signedPreKP, e, t, n);
|
|
1496
1497
|
}
|
|
1497
1498
|
/** Flush pending X3DH derivation after initX3DH() completes. */
|
|
1498
1499
|
async flushPendingX3DH() {
|
|
1499
1500
|
if (!this.pendingX3DH) return;
|
|
1500
|
-
const { senderIK: e, ephemeralKey: t, spkId:
|
|
1501
|
-
this.pendingX3DH = void 0, await this.x3dhReceiveFrom(e, t,
|
|
1501
|
+
const { senderIK: e, ephemeralKey: t, spkId: i } = this.pendingX3DH;
|
|
1502
|
+
this.pendingX3DH = void 0, await this.x3dhReceiveFrom(e, t, i);
|
|
1502
1503
|
}
|
|
1503
1504
|
/** Encrypt outgoing text into a wire content object. For X3DH init messages,
|
|
1504
1505
|
* the caller should pass x3dhInit fields to embed in the content. */
|
|
1505
1506
|
async sealText(e, t) {
|
|
1506
|
-
const
|
|
1507
|
-
if (!
|
|
1508
|
-
const { ct:
|
|
1507
|
+
const i = this.x3dhShared ?? this.shared;
|
|
1508
|
+
if (!i) throw new Error("secure channel not ready");
|
|
1509
|
+
const { ct: n, iv: o } = await Ct(i, e);
|
|
1509
1510
|
return {
|
|
1510
1511
|
kind: "text",
|
|
1511
|
-
text:
|
|
1512
|
+
text: n,
|
|
1512
1513
|
enc: !0,
|
|
1513
|
-
iv:
|
|
1514
|
+
iv: o,
|
|
1514
1515
|
...t ? { x3dhEK: t.ephemeralKey, x3dhSPK: t.spkId, x3dhIK: t.senderIK } : {}
|
|
1515
1516
|
};
|
|
1516
1517
|
}
|
|
@@ -1520,7 +1521,7 @@ class At {
|
|
|
1520
1521
|
const t = this.x3dhShared ?? this.shared;
|
|
1521
1522
|
if (!t) return { kind: "text", text: "🔒 encrypted" };
|
|
1522
1523
|
try {
|
|
1523
|
-
return { kind: "text", text: await
|
|
1524
|
+
return { kind: "text", text: await Et(t, e.text, e.iv) };
|
|
1524
1525
|
} catch {
|
|
1525
1526
|
return { kind: "text", text: "🔒 unable to decrypt" };
|
|
1526
1527
|
}
|
|
@@ -1532,12 +1533,12 @@ class At {
|
|
|
1532
1533
|
for (const t of e.messages) t.content = await this.openContent(t.content);
|
|
1533
1534
|
}
|
|
1534
1535
|
}
|
|
1535
|
-
function
|
|
1536
|
+
function Lt(s) {
|
|
1536
1537
|
if (s.kind !== "text" || !s.enc) return null;
|
|
1537
1538
|
const e = s;
|
|
1538
1539
|
return !e.x3dhEK || !e.x3dhSPK || !e.x3dhIK ? null : { x3dhEK: e.x3dhEK, x3dhSPK: e.x3dhSPK, x3dhIK: e.x3dhIK };
|
|
1539
1540
|
}
|
|
1540
|
-
const xe = "objectchat-widget-styles",
|
|
1541
|
+
const xe = "objectchat-widget-styles", Mt = ["👍", "❤️", "😂", "😮", "😢", "🙏"], Dt = `
|
|
1541
1542
|
.ocw { --ocw-accent:#f5713c; --ocw-bg:#f3efe9; --ocw-card:#fff; --ocw-line:#ececec; --ocw-ink:#1c1b1a; --ocw-mut:#9b9690;
|
|
1542
1543
|
position:relative;
|
|
1543
1544
|
display:flex; flex-direction:column; height:100%; min-height:320px; background:var(--ocw-bg);
|
|
@@ -1696,16 +1697,16 @@ const xe = "objectchat-widget-styles", Lt = ["👍", "❤️", "😂", "😮", "
|
|
|
1696
1697
|
.ocw-bubble-wrap:hover .ocw-translate-btn { opacity:1; }
|
|
1697
1698
|
.ocw-translated-tag { font-size:10px; color:var(--ocw-mut); margin-top:2px; }
|
|
1698
1699
|
`;
|
|
1699
|
-
function
|
|
1700
|
+
function _t() {
|
|
1700
1701
|
if (typeof document > "u" || document.getElementById(xe)) return;
|
|
1701
1702
|
const s = document.createElement("style");
|
|
1702
|
-
s.id = xe, s.textContent =
|
|
1703
|
+
s.id = xe, s.textContent = Dt, document.head.appendChild(s);
|
|
1703
1704
|
}
|
|
1704
1705
|
function c(s, e, t) {
|
|
1705
|
-
const
|
|
1706
|
-
return e && (
|
|
1706
|
+
const i = document.createElement(s);
|
|
1707
|
+
return e && (i.className = e), t !== void 0 && (i.textContent = t), i;
|
|
1707
1708
|
}
|
|
1708
|
-
function
|
|
1709
|
+
function $t(s) {
|
|
1709
1710
|
try {
|
|
1710
1711
|
return new Date(s).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
1711
1712
|
} catch {
|
|
@@ -1729,62 +1730,62 @@ function ee(s) {
|
|
|
1729
1730
|
return `📅 ${s.title} — ${new Date(s.startIso).toLocaleString()}`;
|
|
1730
1731
|
}
|
|
1731
1732
|
}
|
|
1732
|
-
class
|
|
1733
|
+
class Ht {
|
|
1733
1734
|
/** Last seq the guest has seen per conversationId — used to compute unread badges. */
|
|
1734
|
-
constructor(e, t,
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1735
|
+
constructor(e, t, i, n = {}) {
|
|
1736
|
+
r(this, "scroll");
|
|
1737
|
+
r(this, "chips");
|
|
1738
|
+
r(this, "typing");
|
|
1739
|
+
r(this, "quick");
|
|
1740
|
+
r(this, "formHost");
|
|
1741
|
+
r(this, "csatPanel");
|
|
1742
|
+
r(this, "offlinePanel");
|
|
1743
|
+
r(this, "footer");
|
|
1744
|
+
r(this, "input");
|
|
1745
|
+
r(this, "subjectCard");
|
|
1746
|
+
r(this, "e2eBadge");
|
|
1747
|
+
r(this, "statusBadge");
|
|
1748
|
+
r(this, "headerName");
|
|
1749
|
+
r(this, "connStatus");
|
|
1750
|
+
r(this, "typingTimer", null);
|
|
1751
|
+
r(this, "csatSubmitted", !1);
|
|
1751
1752
|
// ── Co-browsing (shared whiteboard) ─────────────────────────────────────
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1753
|
+
r(this, "cobrowseBtn");
|
|
1754
|
+
r(this, "cobrowseCanvas");
|
|
1755
|
+
r(this, "cobrowseToolbar");
|
|
1756
|
+
r(this, "cobrowseHint");
|
|
1757
|
+
r(this, "cobrowseActive", !1);
|
|
1758
|
+
r(this, "cobrowseColor", "#f5713c");
|
|
1759
|
+
r(this, "lastAnnotationVersion", -1);
|
|
1760
|
+
r(this, "storeRef", null);
|
|
1761
|
+
r(this, "scrollCleanup", null);
|
|
1761
1762
|
// ── Live translation ──────────────────────────────────────────────────-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
var v,
|
|
1766
|
-
this.root = e, this.me = t, this.h =
|
|
1767
|
-
const
|
|
1768
|
-
if ((v =
|
|
1763
|
+
r(this, "translationCache", /* @__PURE__ */ new Map());
|
|
1764
|
+
r(this, "showingTranslation", /* @__PURE__ */ new Set());
|
|
1765
|
+
r(this, "subjectBuilt", !1);
|
|
1766
|
+
var v, b, T, K, g, C, A, U, M;
|
|
1767
|
+
this.root = e, this.me = t, this.h = i, this.cfg = n, _t(), e.replaceChildren(), e.classList.add("ocw"), n.accent && e.style.setProperty("--ocw-accent", n.accent);
|
|
1768
|
+
const o = c("div", "ocw-head"), a = c("div", "ocw-avatar");
|
|
1769
|
+
if ((v = n.userInfo) != null && v.avatar) {
|
|
1769
1770
|
const k = document.createElement("img");
|
|
1770
|
-
k.src =
|
|
1771
|
+
k.src = n.userInfo.avatar, k.alt = n.userInfo.name ?? "You", k.style.cssText = "width:100%;height:100%;border-radius:50%;object-fit:cover", a.append(k);
|
|
1771
1772
|
} else
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
const
|
|
1775
|
-
this.headerName = c("div", "ocw-head-name", ((
|
|
1773
|
+
a.textContent = (b = n.userInfo) != null && b.name ? n.userInfo.name[0].toUpperCase() : "🧑";
|
|
1774
|
+
o.append(a);
|
|
1775
|
+
const d = c("div", "ocw-head-main");
|
|
1776
|
+
this.headerName = c("div", "ocw-head-name", ((T = n.subject) == null ? void 0 : T.ownerLabel) ?? ((K = n.subject) == null ? void 0 : K.title) ?? ""), d.append(this.headerName), (g = n.subject) != null && g.subtitle && d.append(c("div", "ocw-head-meta", n.subject.subtitle)), o.append(d), this.statusBadge = c("span", "ocw-badge", ((C = n.subject) == null ? void 0 : C.status) ?? ""), (A = n.subject) != null && A.status || (this.statusBadge.style.display = "none"), o.append(this.statusBadge), this.e2eBadge = c("span", "ocw-e2e", "🔒 E2E"), this.e2eBadge.style.display = "none", o.append(this.e2eBadge), this.connStatus = c("span", "ocw-conn-status"), this.connStatus.style.display = "none", o.append(this.connStatus), this.cobrowseBtn = c("button", "ocw-menu ocw-cobrowse-btn", "🖍"), this.cobrowseBtn.title = "Shared whiteboard — draw to point things out together", this.cobrowseBtn.addEventListener("click", () => {
|
|
1776
1777
|
this.cobrowseActive = !this.cobrowseActive, this.updateCobrowseUI();
|
|
1777
|
-
}),
|
|
1778
|
+
}), o.append(this.cobrowseBtn), o.append(c("button", "ocw-menu", "⋯")), this.chips = c("div", "ocw-chiprow"), this.scroll = c("div", "ocw-scroll"), this.subjectCard = c("div", "ocw-subject"), this.typing = c("div", "ocw-typing");
|
|
1778
1779
|
const w = c("div", "ocw-typing-bubble");
|
|
1779
1780
|
w.append(c("div", "ocw-typing-dot"), c("div", "ocw-typing-dot"), c("div", "ocw-typing-dot")), this.typing.append(c("div", "ocw-dot", "🧑"), w), this.quick = c("div", "ocw-quick");
|
|
1780
|
-
for (const k of
|
|
1781
|
-
const
|
|
1782
|
-
|
|
1781
|
+
for (const k of n.quickReplies ?? []) {
|
|
1782
|
+
const P = c("button", void 0, k);
|
|
1783
|
+
P.addEventListener("click", () => {
|
|
1783
1784
|
this.h.onSend(k), this.quick.style.display = "none";
|
|
1784
|
-
}), this.quick.append(
|
|
1785
|
+
}), this.quick.append(P);
|
|
1785
1786
|
}
|
|
1786
1787
|
this.formHost = c("div", "ocw-form-host"), this.csatPanel = c("div", "ocw-csat"), this.csatPanel.style.display = "none", this.offlinePanel = c("div", "ocw-offline"), this.offlinePanel.style.display = "none", this.input = c("textarea", void 0), this.input.rows = 1, this.input.placeholder = "Message…";
|
|
1787
|
-
const x = c("button", "ocw-sendbtn", ((
|
|
1788
|
+
const x = c("button", "ocw-sendbtn", ((U = n.i18n) == null ? void 0 : U.send) ?? "➤");
|
|
1788
1789
|
x.addEventListener("click", () => this.flushSend()), this.input.addEventListener("keydown", (k) => {
|
|
1789
1790
|
k.isComposing || k.keyCode === 229 || (k.key === "Enter" && !k.shiftKey ? (k.preventDefault(), this.flushSend()) : this.signalTyping());
|
|
1790
1791
|
});
|
|
@@ -1795,23 +1796,23 @@ class $t {
|
|
|
1795
1796
|
var k;
|
|
1796
1797
|
(k = f.files) != null && k[0] && this.h.onAttach && this.h.onAttach(f.files[0]), f.value = "";
|
|
1797
1798
|
});
|
|
1798
|
-
const
|
|
1799
|
-
|
|
1800
|
-
const
|
|
1801
|
-
((M =
|
|
1799
|
+
const h = c("div", "ocw-input");
|
|
1800
|
+
h.append(m, f, this.input, x);
|
|
1801
|
+
const u = c("div", "ocw-footer");
|
|
1802
|
+
((M = n.i18n) == null ? void 0 : M.poweredBy) !== void 0 ? u.textContent = n.i18n.poweredBy : u.innerHTML = 'Powered by <a href="https://relay.paramms.com" target="_blank" rel="noopener">Relay</a>', this.footer = u, e.append(o, this.chips, this.scroll, this.typing, this.quick, this.formHost, this.csatPanel, this.offlinePanel, h, this.footer), this.cobrowseCanvas = c("canvas", "ocw-cobrowse-canvas"), this.cobrowseToolbar = c("div", "ocw-cobrowse-toolbar");
|
|
1802
1803
|
for (const k of ["#f5713c", "#1c1b1a", "#2563eb", "#16a34a", "#dc2626"]) {
|
|
1803
|
-
const
|
|
1804
|
-
|
|
1804
|
+
const P = c("button", "ocw-cobrowse-swatch");
|
|
1805
|
+
P.style.background = k, P.type = "button", k === this.cobrowseColor && P.classList.add("sel"), P.addEventListener("click", () => {
|
|
1805
1806
|
this.cobrowseColor = k;
|
|
1806
1807
|
for (const Q of this.cobrowseToolbar.querySelectorAll(".ocw-cobrowse-swatch")) Q.classList.remove("sel");
|
|
1807
|
-
|
|
1808
|
-
}), this.cobrowseToolbar.append(
|
|
1808
|
+
P.classList.add("sel");
|
|
1809
|
+
}), this.cobrowseToolbar.append(P);
|
|
1809
1810
|
}
|
|
1810
|
-
const
|
|
1811
|
-
|
|
1812
|
-
var k,
|
|
1813
|
-
return (
|
|
1814
|
-
}), this.cobrowseToolbar.append(
|
|
1811
|
+
const S = c("button", "ocw-cobrowse-clear", "Clear");
|
|
1812
|
+
S.addEventListener("click", () => {
|
|
1813
|
+
var k, P;
|
|
1814
|
+
return (P = (k = this.h).onAnnotateClear) == null ? void 0 : P.call(k);
|
|
1815
|
+
}), this.cobrowseToolbar.append(S), this.cobrowseHint = c("div", "ocw-cobrowse-hint", "🖍 Draw to point things out — visible to both sides"), e.append(this.cobrowseCanvas, this.cobrowseToolbar, this.cobrowseHint), this.bindCobrowsePointerEvents();
|
|
1815
1816
|
}
|
|
1816
1817
|
/** Returns the scroll container so history.ts can attach scroll listeners. */
|
|
1817
1818
|
getScrollEl() {
|
|
@@ -1843,26 +1844,26 @@ class $t {
|
|
|
1843
1844
|
render(e) {
|
|
1844
1845
|
var x, m, f;
|
|
1845
1846
|
if (this.storeRef = e, this.cobrowseBtn.classList.toggle("show", !!e.subject), !e.subject && this.cobrowseActive && (this.cobrowseActive = !1, this.updateCobrowseUI()), this.cobrowseActive && e.annotationVersion !== this.lastAnnotationVersion && (this.lastAnnotationVersion = e.annotationVersion, this.resizeCobrowseCanvas(), this.redrawCobrowse()), e.accent && this.root.style.setProperty("--ocw-accent", e.accent), this.e2eBadge.style.display = e.e2e ? "inline-flex" : "none", this.buildSubjectCard(e), e.subject) {
|
|
1846
|
-
const
|
|
1847
|
-
|
|
1847
|
+
const h = (x = this.cfg.subject) == null ? void 0 : x.ownerLabel;
|
|
1848
|
+
h && (this.headerName.textContent = h);
|
|
1848
1849
|
}
|
|
1849
1850
|
this.chips.replaceChildren();
|
|
1850
1851
|
const t = e.visibleActions();
|
|
1851
1852
|
this.chips.style.display = t.length ? "flex" : "none";
|
|
1852
|
-
for (const
|
|
1853
|
-
const
|
|
1853
|
+
for (const h of t) this.chips.append(this.chipEl(h));
|
|
1854
|
+
const i = this.scroll.scrollHeight, n = this.scroll.scrollTop;
|
|
1854
1855
|
if (this.scroll.replaceChildren(), this.subjectCard.childNodes.length && this.scroll.append(this.subjectCard), e.hasMoreHistory) {
|
|
1855
|
-
const
|
|
1856
|
-
|
|
1856
|
+
const h = c("div", "ocw-load-more");
|
|
1857
|
+
h.textContent = "↑ Loading earlier messages…", h.style.pointerEvents = "none", this.scroll.append(h);
|
|
1857
1858
|
}
|
|
1858
|
-
let
|
|
1859
|
-
for (const
|
|
1860
|
-
this.scroll.append(this.messageEl(
|
|
1861
|
-
|
|
1862
|
-
const
|
|
1863
|
-
this.typing.classList.toggle("active",
|
|
1864
|
-
const
|
|
1865
|
-
|
|
1859
|
+
let o = 0;
|
|
1860
|
+
for (const h of e.messages())
|
|
1861
|
+
this.scroll.append(this.messageEl(h, e)), h.senderId !== this.me && h.seq > o && (o = h.seq);
|
|
1862
|
+
n > 20 ? this.scroll.scrollTop = this.scroll.scrollHeight - i + n : this.scroll.scrollTop = this.scroll.scrollHeight, o > 0 && this.h.onReadUpTo(o);
|
|
1863
|
+
const a = [...e.typing];
|
|
1864
|
+
this.typing.classList.toggle("active", a.length > 0);
|
|
1865
|
+
const d = this.typing.querySelector(".ocw-typing-bubble");
|
|
1866
|
+
d && d.setAttribute("aria-label", a.length ? "typing" : ""), this.footer.style.display = e.whiteLabel ? "none" : "block", e.offline ? (this.offlinePanel.style.display === "none" && this.buildOfflinePanel(e.offlineMessage), this.offlinePanel.style.display = "block", (m = this.root.querySelector(".ocw-input")) == null || m.style.setProperty("display", "none")) : (this.offlinePanel.style.display = "none", (f = this.root.querySelector(".ocw-input")) == null || f.style.removeProperty("display"));
|
|
1866
1867
|
const w = ["resolved", "closed", "sold", "issued", "checked_out"];
|
|
1867
1868
|
this.h.onCsat && !this.csatSubmitted && w.includes(e.state) && e.messages().length > 0 && (this.csatPanel.style.display === "none" && this.buildCsatPanel(), this.csatPanel.style.display = "block");
|
|
1868
1869
|
}
|
|
@@ -1874,31 +1875,31 @@ class $t {
|
|
|
1874
1875
|
this.connStatus.style.display = "", this.connStatus.className = `ocw-conn-status${e === "reconnecting" ? " warn" : ""}`, this.connStatus.textContent = e === "reconnecting" ? "↻ reconnecting…" : "● connecting…";
|
|
1875
1876
|
}
|
|
1876
1877
|
buildOfflinePanel(e) {
|
|
1877
|
-
var
|
|
1878
|
-
this.offlinePanel.replaceChildren(), this.offlinePanel.append(c("div", "ocw-offline-icon", "🌙")), this.offlinePanel.append(c("div", "ocw-offline-title", ((
|
|
1879
|
-
const t = c("div", "ocw-offline-form"),
|
|
1880
|
-
|
|
1881
|
-
const
|
|
1882
|
-
|
|
1883
|
-
const
|
|
1884
|
-
|
|
1885
|
-
const
|
|
1886
|
-
|
|
1887
|
-
!
|
|
1888
|
-
Name: ${
|
|
1889
|
-
Email: ${
|
|
1890
|
-
Message: ${
|
|
1891
|
-
}), t.append(
|
|
1878
|
+
var d;
|
|
1879
|
+
this.offlinePanel.replaceChildren(), this.offlinePanel.append(c("div", "ocw-offline-icon", "🌙")), this.offlinePanel.append(c("div", "ocw-offline-title", ((d = this.cfg.i18n) == null ? void 0 : d.offline) ?? "We're offline right now")), this.offlinePanel.append(c("div", "ocw-offline-msg", e || "Leave your details and we'll get back to you soon."));
|
|
1880
|
+
const t = c("div", "ocw-offline-form"), i = c("input", "ocw-offline-input");
|
|
1881
|
+
i.placeholder = "Your name", i.type = "text";
|
|
1882
|
+
const n = c("input", "ocw-offline-input");
|
|
1883
|
+
n.placeholder = "Your email", n.type = "email";
|
|
1884
|
+
const o = c("textarea", "ocw-offline-input");
|
|
1885
|
+
o.placeholder = "Your message", o.rows = 3;
|
|
1886
|
+
const a = c("button", "ocw-offline-submit", "Send message");
|
|
1887
|
+
a.addEventListener("click", () => {
|
|
1888
|
+
!n.value.trim() || !o.value.trim() || (this.h.onSend(`[Offline form]
|
|
1889
|
+
Name: ${i.value || "Anonymous"}
|
|
1890
|
+
Email: ${n.value}
|
|
1891
|
+
Message: ${o.value}`), this.offlinePanel.replaceChildren(c("div", "ocw-offline-thanks", "✓ Message sent! We'll reply to your email.")));
|
|
1892
|
+
}), t.append(i, n, o, a), this.offlinePanel.append(t);
|
|
1892
1893
|
}
|
|
1893
1894
|
buildCsatPanel() {
|
|
1894
1895
|
this.csatPanel.replaceChildren(), this.csatPanel.append(c("div", "ocw-csat-title", "How did we do?"));
|
|
1895
1896
|
const e = c("div", "ocw-csat-stars"), t = [];
|
|
1896
|
-
for (let
|
|
1897
|
-
const
|
|
1898
|
-
|
|
1899
|
-
var
|
|
1900
|
-
this.csatSubmitted = !0, this.csatPanel.replaceChildren(c("div", "ocw-csat-done", `Thanks for your ${
|
|
1901
|
-
}), t.push(
|
|
1897
|
+
for (let i = 1; i <= 5; i++) {
|
|
1898
|
+
const n = c("button", "ocw-csat-star", "★");
|
|
1899
|
+
n.dataset.score = String(i), n.addEventListener("mouseenter", () => t.forEach((o, a) => o.classList.toggle("lit", a < i))), n.addEventListener("mouseleave", () => t.forEach((o) => o.classList.remove("lit"))), n.addEventListener("click", () => {
|
|
1900
|
+
var o, a;
|
|
1901
|
+
this.csatSubmitted = !0, this.csatPanel.replaceChildren(c("div", "ocw-csat-done", `Thanks for your ${i}★ rating!`)), (a = (o = this.h).onCsat) == null || a.call(o, i);
|
|
1902
|
+
}), t.push(n), e.append(n);
|
|
1902
1903
|
}
|
|
1903
1904
|
this.csatPanel.append(e);
|
|
1904
1905
|
}
|
|
@@ -1916,9 +1917,9 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(c("div", "ocw-offline-t
|
|
|
1916
1917
|
drawStroke(e) {
|
|
1917
1918
|
const t = this.cobrowseCanvas.getContext("2d");
|
|
1918
1919
|
if (!t || e.points.length < 2) return;
|
|
1919
|
-
const
|
|
1920
|
-
t.strokeStyle = e.color, t.lineWidth = Math.max(1, e.width * Math.min(
|
|
1921
|
-
for (const
|
|
1920
|
+
const i = this.cobrowseCanvas.width, n = this.cobrowseCanvas.height;
|
|
1921
|
+
t.strokeStyle = e.color, t.lineWidth = Math.max(1, e.width * Math.min(i, n)), t.lineJoin = "round", t.lineCap = "round", t.beginPath(), t.moveTo(e.points[0].x * i, e.points[0].y * n);
|
|
1922
|
+
for (const o of e.points.slice(1)) t.lineTo(o.x * i, o.y * n);
|
|
1922
1923
|
t.stroke();
|
|
1923
1924
|
}
|
|
1924
1925
|
redrawCobrowse() {
|
|
@@ -1926,92 +1927,92 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(c("div", "ocw-offline-t
|
|
|
1926
1927
|
const e = this.cobrowseCanvas.getContext("2d");
|
|
1927
1928
|
if (e) {
|
|
1928
1929
|
e.clearRect(0, 0, this.cobrowseCanvas.width, this.cobrowseCanvas.height);
|
|
1929
|
-
for (const
|
|
1930
|
+
for (const i of ((t = this.storeRef) == null ? void 0 : t.annotations) ?? []) this.drawStroke(i);
|
|
1930
1931
|
}
|
|
1931
1932
|
}
|
|
1932
1933
|
bindCobrowsePointerEvents() {
|
|
1933
1934
|
let e = !1, t = [];
|
|
1934
|
-
const
|
|
1935
|
-
const
|
|
1935
|
+
const i = (a) => {
|
|
1936
|
+
const d = this.cobrowseCanvas.getBoundingClientRect(), w = d.width > 0 ? (a.clientX - d.left) / d.width : 0, x = d.height > 0 ? (a.clientY - d.top) / d.height : 0;
|
|
1936
1937
|
return { x: Math.min(1, Math.max(0, w)), y: Math.min(1, Math.max(0, x)) };
|
|
1937
|
-
},
|
|
1938
|
-
this.cobrowseCanvas.addEventListener("pointerdown", (
|
|
1939
|
-
this.cobrowseActive && (e = !0, t = [
|
|
1940
|
-
}), this.cobrowseCanvas.addEventListener("pointermove", (
|
|
1941
|
-
e && (t.push(
|
|
1938
|
+
}, n = 6e-3;
|
|
1939
|
+
this.cobrowseCanvas.addEventListener("pointerdown", (a) => {
|
|
1940
|
+
this.cobrowseActive && (e = !0, t = [i(a)], this.cobrowseCanvas.setPointerCapture(a.pointerId));
|
|
1941
|
+
}), this.cobrowseCanvas.addEventListener("pointermove", (a) => {
|
|
1942
|
+
e && (t.push(i(a)), this.redrawCobrowse(), this.drawStroke({ points: t, color: this.cobrowseColor, width: n }));
|
|
1942
1943
|
});
|
|
1943
|
-
const
|
|
1944
|
-
var
|
|
1944
|
+
const o = (a) => {
|
|
1945
|
+
var d, w;
|
|
1945
1946
|
if (e) {
|
|
1946
|
-
e = !1, t.length > 1 && ((w = (
|
|
1947
|
+
e = !1, t.length > 1 && ((w = (d = this.h).onAnnotate) == null || w.call(d, { id: `an_${Date.now()}_${Math.random().toString(36).slice(2)}`, points: t, color: this.cobrowseColor, width: n })), t = [];
|
|
1947
1948
|
try {
|
|
1948
|
-
this.cobrowseCanvas.releasePointerCapture(
|
|
1949
|
+
this.cobrowseCanvas.releasePointerCapture(a.pointerId);
|
|
1949
1950
|
} catch {
|
|
1950
1951
|
}
|
|
1951
1952
|
}
|
|
1952
1953
|
};
|
|
1953
|
-
this.cobrowseCanvas.addEventListener("pointerup",
|
|
1954
|
+
this.cobrowseCanvas.addEventListener("pointerup", o), this.cobrowseCanvas.addEventListener("pointercancel", o);
|
|
1954
1955
|
}
|
|
1955
1956
|
buildSubjectCard(e) {
|
|
1956
1957
|
if (this.subjectBuilt) return;
|
|
1957
|
-
const t = e.subject,
|
|
1958
|
-
if (!
|
|
1959
|
-
this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(c("div", "ocw-subject-title",
|
|
1960
|
-
const
|
|
1961
|
-
if (t) for (const [
|
|
1962
|
-
else for (const
|
|
1963
|
-
|
|
1964
|
-
const
|
|
1965
|
-
|
|
1958
|
+
const t = e.subject, i = this.cfg.subject, n = (t == null ? void 0 : t.title) ?? (i == null ? void 0 : i.title);
|
|
1959
|
+
if (!n) return;
|
|
1960
|
+
this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(c("div", "ocw-subject-title", n)), i != null && i.subtitle && this.subjectCard.append(c("div", "ocw-subject-sub", i.subtitle));
|
|
1961
|
+
const o = c("div", "ocw-tags");
|
|
1962
|
+
if (t) for (const [d, w] of Object.entries(t.fields)) o.append(c("span", "ocw-tag", `${d}: ${w}`));
|
|
1963
|
+
else for (const d of (i == null ? void 0 : i.tags) ?? []) o.append(c("span", "ocw-tag", d));
|
|
1964
|
+
o.childNodes.length && this.subjectCard.append(o);
|
|
1965
|
+
const a = (t == null ? void 0 : t.state) ?? (i == null ? void 0 : i.status);
|
|
1966
|
+
a && (this.statusBadge.textContent = a, this.statusBadge.style.display = "inline-flex");
|
|
1966
1967
|
}
|
|
1967
1968
|
chipEl(e) {
|
|
1968
1969
|
const t = c("button", "ocw-chip", e.icon ? `${e.icon} ${e.label}` : e.label);
|
|
1969
1970
|
return t.dataset.actionId = e.id, t.addEventListener("click", async () => {
|
|
1970
|
-
var
|
|
1971
|
-
e.confirm && !await this.confirm(e.label) || ((
|
|
1971
|
+
var i;
|
|
1972
|
+
e.confirm && !await this.confirm(e.label) || ((i = e.input) != null && i.length ? this.openForm(e) : this.h.onInvoke(e.id));
|
|
1972
1973
|
}), t;
|
|
1973
1974
|
}
|
|
1974
1975
|
/** In-widget confirmation modal (replaces window.confirm). */
|
|
1975
1976
|
confirm(e) {
|
|
1976
1977
|
return new Promise((t) => {
|
|
1977
|
-
const
|
|
1978
|
-
|
|
1979
|
-
const
|
|
1980
|
-
|
|
1978
|
+
const i = c("div", "ocw-modal"), n = c("div", "ocw-modal-card");
|
|
1979
|
+
n.append(c("div", "ocw-modal-title", e)), n.append(c("div", "ocw-modal-body", `Confirm “${e}”?`));
|
|
1980
|
+
const o = c("div", "ocw-modal-actions"), a = c("button", "ocw-modal-cancel", "Cancel"), d = c("button", "ocw-modal-ok", "Confirm"), w = (x) => {
|
|
1981
|
+
i.remove(), t(x);
|
|
1981
1982
|
};
|
|
1982
|
-
|
|
1983
|
-
x.target ===
|
|
1984
|
-
}),
|
|
1983
|
+
a.addEventListener("click", () => w(!1)), d.addEventListener("click", () => w(!0)), i.addEventListener("click", (x) => {
|
|
1984
|
+
x.target === i && w(!1);
|
|
1985
|
+
}), o.append(a, d), n.append(o), i.append(n), this.root.append(i), d.focus();
|
|
1985
1986
|
});
|
|
1986
1987
|
}
|
|
1987
1988
|
/** Inline form for a form-effect action: typed inputs (date picker, number,
|
|
1988
1989
|
* text) rendered above the composer — no browser prompts. */
|
|
1989
1990
|
openForm(e) {
|
|
1990
|
-
var
|
|
1991
|
+
var d, w;
|
|
1991
1992
|
this.formHost.replaceChildren();
|
|
1992
1993
|
const t = c("div", "ocw-form");
|
|
1993
1994
|
t.append(c("div", "ocw-form-title", e.icon ? `${e.icon} ${e.label}` : e.label));
|
|
1994
|
-
const
|
|
1995
|
+
const i = /* @__PURE__ */ new Map();
|
|
1995
1996
|
for (const x of e.input ?? []) {
|
|
1996
1997
|
const m = c("label", "ocw-form-row");
|
|
1997
|
-
if (m.append(c("span", "ocw-form-lbl", x.label)), x.type === "select" && ((
|
|
1998
|
+
if (m.append(c("span", "ocw-form-lbl", x.label)), x.type === "select" && ((d = x.options) != null && d.length)) {
|
|
1998
1999
|
const f = c("select", "ocw-form-input");
|
|
1999
2000
|
x.required || f.append(c("option", void 0, "— select —"));
|
|
2000
|
-
for (const
|
|
2001
|
-
const
|
|
2002
|
-
|
|
2001
|
+
for (const h of x.options) {
|
|
2002
|
+
const u = c("option");
|
|
2003
|
+
u.value = h, u.textContent = h, f.append(u);
|
|
2003
2004
|
}
|
|
2004
|
-
x.required && (f.required = !0), m.append(f),
|
|
2005
|
+
x.required && (f.required = !0), m.append(f), i.set(x.name, f);
|
|
2005
2006
|
} else {
|
|
2006
2007
|
const f = c("input", "ocw-form-input");
|
|
2007
|
-
f.type = x.type === "number" ? "number" : x.type === "date" ? "datetime-local" : "text", x.required && (f.required = !0), m.append(f),
|
|
2008
|
+
f.type = x.type === "number" ? "number" : x.type === "date" ? "datetime-local" : "text", x.required && (f.required = !0), m.append(f), i.set(x.name, f);
|
|
2008
2009
|
}
|
|
2009
2010
|
t.append(m);
|
|
2010
2011
|
}
|
|
2011
|
-
const
|
|
2012
|
-
|
|
2012
|
+
const n = c("div", "ocw-form-actions"), o = c("button", "ocw-form-cancel", "Cancel"), a = c("button", "ocw-form-submit", "Send");
|
|
2013
|
+
o.addEventListener("click", () => this.formHost.replaceChildren()), a.addEventListener("click", () => {
|
|
2013
2014
|
const x = {};
|
|
2014
|
-
for (const [m, f] of
|
|
2015
|
+
for (const [m, f] of i) {
|
|
2015
2016
|
if (f.required && !f.value) {
|
|
2016
2017
|
f.style.borderColor = "#e5484d";
|
|
2017
2018
|
return;
|
|
@@ -2019,136 +2020,136 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(c("div", "ocw-offline-t
|
|
|
2019
2020
|
x[m] = f.type === "number" ? Number(f.value) : f.value;
|
|
2020
2021
|
}
|
|
2021
2022
|
this.formHost.replaceChildren(), this.h.onInvoke(e.id, x);
|
|
2022
|
-
}),
|
|
2023
|
+
}), n.append(o, a), t.append(n), this.formHost.append(t), (w = i.values().next().value) == null || w.focus();
|
|
2023
2024
|
}
|
|
2024
2025
|
messageEl(e, t) {
|
|
2025
2026
|
var f;
|
|
2026
2027
|
if (e.senderRole === "system") {
|
|
2027
|
-
const
|
|
2028
|
-
return
|
|
2028
|
+
const h = c("div", "ocw-sys");
|
|
2029
|
+
return h.textContent = e.deletedAt ? "message deleted" : ee(e.content), h;
|
|
2029
2030
|
}
|
|
2030
|
-
const
|
|
2031
|
-
!
|
|
2032
|
-
const
|
|
2031
|
+
const i = e.senderId === this.me, n = !!e.internal, o = c("div", `ocw-row ${n ? "ocw-note mine" : i ? "mine" : "theirs"} ${e.senderRole === "bot" ? "ocw-bot" : ""}`);
|
|
2032
|
+
!i && !n && o.append(c("div", "ocw-dot", e.senderRole === "bot" ? "🤖" : "🧑"));
|
|
2033
|
+
const a = c("div"), d = c("div", "ocw-bubble-wrap");
|
|
2033
2034
|
if (e.replyToId) {
|
|
2034
|
-
const
|
|
2035
|
-
|
|
2035
|
+
const h = c("div", "ocw-reply-to", "↩ replying to a message");
|
|
2036
|
+
h.style.cssText = "font-size:11px;color:var(--ocw-mut);margin-bottom:2px;font-style:italic", a.append(h);
|
|
2036
2037
|
}
|
|
2037
2038
|
const w = c("div", "ocw-bubble");
|
|
2038
2039
|
let x = null;
|
|
2039
2040
|
if (e.deletedAt) w.append(c("span", "ocw-deleted", "message deleted"));
|
|
2040
2041
|
else if (e.content.kind === "attachment") {
|
|
2041
|
-
const
|
|
2042
|
-
if ((f =
|
|
2043
|
-
const
|
|
2044
|
-
|
|
2042
|
+
const h = e.content;
|
|
2043
|
+
if ((f = h.mime) != null && f.startsWith("image/")) {
|
|
2044
|
+
const u = document.createElement("img");
|
|
2045
|
+
u.src = h.url, u.alt = h.name ?? "image", u.style.cssText = "max-width:220px;max-height:160px;border-radius:10px;display:block;cursor:pointer", u.addEventListener("click", () => window.open(h.url, "_blank")), w.append(u);
|
|
2045
2046
|
} else {
|
|
2046
|
-
const
|
|
2047
|
-
|
|
2047
|
+
const u = document.createElement("a");
|
|
2048
|
+
u.href = h.url, u.target = "_blank", u.rel = "noopener", u.style.cssText = "display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none", u.append(c("span", void 0, "📄"), c("span", void 0, h.name ?? "file")), w.append(u);
|
|
2048
2049
|
}
|
|
2049
2050
|
} else if (e.content.kind === "appointment") {
|
|
2050
|
-
const
|
|
2051
|
-
|
|
2052
|
-
const
|
|
2053
|
-
v.href =
|
|
2054
|
-
const
|
|
2055
|
-
|
|
2051
|
+
const h = e.content, u = c("div", "ocw-appt");
|
|
2052
|
+
u.append(c("div", "ocw-appt-title", `📅 ${h.title}`)), u.append(c("div", "ocw-appt-time", new Date(h.startIso).toLocaleString() + " – " + new Date(h.endIso).toLocaleTimeString())), h.location && u.append(c("div", "ocw-appt-loc", `📍 ${h.location}`)), h.description && u.append(c("div", "ocw-appt-desc", h.description));
|
|
2053
|
+
const S = c("div", "ocw-appt-links"), v = document.createElement("a");
|
|
2054
|
+
v.href = h.googleUrl, v.target = "_blank", v.rel = "noopener", v.className = "ocw-appt-btn", v.textContent = "📅 Add to Google Calendar";
|
|
2055
|
+
const b = document.createElement("a");
|
|
2056
|
+
b.href = h.icalUrl, b.download = `${h.title}.ics`, b.className = "ocw-appt-btn ocw-appt-btn-sec", b.textContent = "🍎 Apple / iCal", S.append(v, b), u.append(S), w.append(u);
|
|
2056
2057
|
} else
|
|
2057
2058
|
x = document.createTextNode(ee(e.content)), w.append(x), e.editedAt && w.append(c("span", "ocw-edited", "(edited)"));
|
|
2058
|
-
if (
|
|
2059
|
-
const
|
|
2060
|
-
if (
|
|
2061
|
-
const
|
|
2062
|
-
|
|
2063
|
-
if (
|
|
2064
|
-
this.showingTranslation.delete(e.id), x.textContent =
|
|
2059
|
+
if (d.append(w), !i && !n && this.h.onTranslate && e.content.kind === "text" && !e.deletedAt && e.seq > 0 && x) {
|
|
2060
|
+
const h = e.content.text;
|
|
2061
|
+
if (h.trim()) {
|
|
2062
|
+
const u = c("button", "ocw-translate-btn", "🌐");
|
|
2063
|
+
u.type = "button", u.title = "Translate", u.addEventListener("click", (S) => {
|
|
2064
|
+
if (S.stopPropagation(), this.showingTranslation.has(e.id)) {
|
|
2065
|
+
this.showingTranslation.delete(e.id), x.textContent = h, u.textContent = "🌐", u.title = "Translate";
|
|
2065
2066
|
return;
|
|
2066
2067
|
}
|
|
2067
2068
|
const v = this.translationCache.get(e.id);
|
|
2068
2069
|
if (v !== void 0) {
|
|
2069
|
-
this.showingTranslation.add(e.id), x.textContent = v,
|
|
2070
|
+
this.showingTranslation.add(e.id), x.textContent = v, u.textContent = "↩", u.title = "Show original";
|
|
2070
2071
|
return;
|
|
2071
2072
|
}
|
|
2072
|
-
|
|
2073
|
-
if (
|
|
2074
|
-
|
|
2075
|
-
|
|
2073
|
+
u.textContent = "⏳", this.h.onTranslate(h).then((b) => {
|
|
2074
|
+
if (b === null) {
|
|
2075
|
+
u.textContent = "⚠️", u.title = "Translation unavailable", setTimeout(() => {
|
|
2076
|
+
u.textContent = "🌐", u.title = "Translate";
|
|
2076
2077
|
}, 1500);
|
|
2077
2078
|
return;
|
|
2078
2079
|
}
|
|
2079
|
-
this.translationCache.set(e.id,
|
|
2080
|
+
this.translationCache.set(e.id, b), this.showingTranslation.add(e.id), x.textContent = b, u.textContent = "↩", u.title = "Show original";
|
|
2080
2081
|
});
|
|
2081
|
-
}),
|
|
2082
|
+
}), d.append(u);
|
|
2082
2083
|
}
|
|
2083
2084
|
}
|
|
2084
|
-
if (
|
|
2085
|
-
const
|
|
2085
|
+
if (i && !e.deletedAt && e.seq > 0 && (this.h.onEdit ?? this.h.onDelete)) {
|
|
2086
|
+
const h = c("div", "ocw-msg-menu");
|
|
2086
2087
|
if (this.h.onEdit) {
|
|
2087
|
-
const
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
const v = ee(e.content),
|
|
2091
|
-
|
|
2092
|
-
const
|
|
2093
|
-
|
|
2094
|
-
const
|
|
2095
|
-
|
|
2096
|
-
const
|
|
2097
|
-
|
|
2098
|
-
const
|
|
2099
|
-
|
|
2100
|
-
const
|
|
2101
|
-
|
|
2102
|
-
const
|
|
2103
|
-
|
|
2104
|
-
}),
|
|
2105
|
-
|
|
2088
|
+
const u = c("button", void 0, "✏️");
|
|
2089
|
+
u.title = "Edit", u.addEventListener("click", (S) => {
|
|
2090
|
+
S.stopPropagation();
|
|
2091
|
+
const v = ee(e.content), b = document.createElement("textarea");
|
|
2092
|
+
b.value = v, b.rows = Math.min(4, Math.ceil(v.length / 40) + 1), b.style.cssText = "width:100%;resize:vertical;border:1px solid var(--ocw-accent);border-radius:8px;padding:6px 10px;font:inherit;font-size:14px;background:#fff;color:#1c1b1a;box-sizing:border-box";
|
|
2093
|
+
const T = c("button", "ocw-form-submit", "Save");
|
|
2094
|
+
T.style.cssText = "margin-top:6px;padding:5px 14px;font-size:13px";
|
|
2095
|
+
const K = c("button", "ocw-form-cancel", "Cancel");
|
|
2096
|
+
K.style.cssText = "margin-top:6px;padding:5px 10px;font-size:13px";
|
|
2097
|
+
const g = c("div");
|
|
2098
|
+
g.style.cssText = "display:flex;gap:6px;justify-content:flex-end", g.append(K, T);
|
|
2099
|
+
const C = c("div");
|
|
2100
|
+
C.append(b, g), w.replaceChildren(C), b.focus(), b.select();
|
|
2101
|
+
const A = () => w.replaceChildren(x ?? document.createTextNode(v));
|
|
2102
|
+
K.addEventListener("click", A), T.addEventListener("click", () => {
|
|
2103
|
+
const U = b.value.trim();
|
|
2104
|
+
U && U !== v && this.h.onEdit(e.id, U), A();
|
|
2105
|
+
}), b.addEventListener("keydown", (U) => {
|
|
2106
|
+
U.key === "Enter" && !U.shiftKey && (U.preventDefault(), T.click()), U.key === "Escape" && A();
|
|
2106
2107
|
});
|
|
2107
|
-
}),
|
|
2108
|
+
}), h.append(u);
|
|
2108
2109
|
}
|
|
2109
2110
|
if (this.h.onDelete) {
|
|
2110
|
-
const
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
}),
|
|
2111
|
+
const u = c("button", "del", "🗑");
|
|
2112
|
+
u.title = "Delete", u.addEventListener("click", (S) => {
|
|
2113
|
+
S.stopPropagation(), this.h.onDelete(e.id);
|
|
2114
|
+
}), h.append(u);
|
|
2114
2115
|
}
|
|
2115
|
-
|
|
2116
|
+
d.append(h);
|
|
2116
2117
|
}
|
|
2117
|
-
if (
|
|
2118
|
-
const
|
|
2118
|
+
if (a.append(d), this.h.onReact && !e.deletedAt && e.seq > 0) {
|
|
2119
|
+
const h = c("div", "ocw-react-wrap"), u = c("div", "ocw-react");
|
|
2119
2120
|
if (e.reactions && Object.keys(e.reactions).length)
|
|
2120
|
-
for (const [
|
|
2121
|
-
const
|
|
2122
|
-
|
|
2123
|
-
var
|
|
2124
|
-
return (
|
|
2125
|
-
}),
|
|
2121
|
+
for (const [b, T] of Object.entries(e.reactions)) {
|
|
2122
|
+
const K = c("button", `ocw-react-pill${T.includes(this.me) ? " mine" : ""}`, `${b} ${T.length}`);
|
|
2123
|
+
K.addEventListener("click", () => {
|
|
2124
|
+
var g, C;
|
|
2125
|
+
return (C = (g = this.h).onReact) == null ? void 0 : C.call(g, e.id, b, T.includes(this.me));
|
|
2126
|
+
}), u.append(K);
|
|
2126
2127
|
}
|
|
2127
|
-
const
|
|
2128
|
-
for (const
|
|
2129
|
-
const
|
|
2130
|
-
|
|
2131
|
-
var
|
|
2132
|
-
|
|
2133
|
-
const
|
|
2134
|
-
(M = (
|
|
2135
|
-
}), v.append(
|
|
2128
|
+
const S = c("button", "ocw-react-btn", "+"), v = c("div", "ocw-react-picker");
|
|
2129
|
+
for (const b of Mt) {
|
|
2130
|
+
const T = c("button", void 0, b);
|
|
2131
|
+
T.addEventListener("click", (K) => {
|
|
2132
|
+
var C, A, U, M;
|
|
2133
|
+
K.stopPropagation();
|
|
2134
|
+
const g = (A = (C = e.reactions) == null ? void 0 : C[b]) == null ? void 0 : A.includes(this.me);
|
|
2135
|
+
(M = (U = this.h).onReact) == null || M.call(U, e.id, b, !!g), v.style.display = "none";
|
|
2136
|
+
}), v.append(T);
|
|
2136
2137
|
}
|
|
2137
|
-
v.style.display = "none",
|
|
2138
|
-
|
|
2138
|
+
v.style.display = "none", S.addEventListener("click", (b) => {
|
|
2139
|
+
b.stopPropagation(), v.style.display = v.style.display === "none" ? "flex" : "none";
|
|
2139
2140
|
}), document.addEventListener("click", () => {
|
|
2140
2141
|
v.style.display = "none";
|
|
2141
|
-
}, { once: !0 }),
|
|
2142
|
-
} else e.reactions && Object.keys(e.reactions).length &&
|
|
2143
|
-
const m = c("div", "ocw-time ocw-meta",
|
|
2144
|
-
if (
|
|
2145
|
-
const
|
|
2146
|
-
m.append(
|
|
2142
|
+
}, { once: !0 }), u.append(S), h.append(u, v), a.append(h);
|
|
2143
|
+
} else e.reactions && Object.keys(e.reactions).length && a.append(c("div", "ocw-react", Object.entries(e.reactions).map(([h, u]) => `${h}${u.length}`).join(" ")));
|
|
2144
|
+
const m = c("div", "ocw-time ocw-meta", $t(e.ts));
|
|
2145
|
+
if (i && e.status) {
|
|
2146
|
+
const h = c("span", `ocw-tick${e.status === "read" ? " read" : e.status === "delivered" ? " delivered" : ""}`, Rt(e.status));
|
|
2147
|
+
m.append(h);
|
|
2147
2148
|
}
|
|
2148
|
-
return
|
|
2149
|
+
return i && e.seq > 0 && t.lastReadByOthers >= e.seq && m.append(c("span", "ocw-seen", " · Seen")), a.append(m), o.append(a), o;
|
|
2149
2150
|
}
|
|
2150
2151
|
}
|
|
2151
|
-
function
|
|
2152
|
+
function Rt(s) {
|
|
2152
2153
|
switch (s) {
|
|
2153
2154
|
case "read":
|
|
2154
2155
|
return "✓✓";
|
|
@@ -2161,24 +2162,24 @@ function Ht(s) {
|
|
|
2161
2162
|
}
|
|
2162
2163
|
}
|
|
2163
2164
|
const H = /* @__PURE__ */ new WeakMap();
|
|
2164
|
-
function
|
|
2165
|
+
function Ot(s) {
|
|
2165
2166
|
var e;
|
|
2166
2167
|
(e = H.get(s)) == null || e.close(), H.delete(s);
|
|
2167
2168
|
}
|
|
2168
|
-
function
|
|
2169
|
+
function Nt(s) {
|
|
2169
2170
|
var ce, de, le, he;
|
|
2170
2171
|
H.has(s.el) && (H.get(s.el).close(), H.delete(s.el));
|
|
2171
|
-
const e = s.token ??
|
|
2172
|
-
let n = new
|
|
2173
|
-
const
|
|
2174
|
-
let
|
|
2172
|
+
const e = s.token ?? Ae(), { wsUrl: t, httpBase: i } = ze(s.url, s.apiUrl);
|
|
2173
|
+
let n = new bt(e);
|
|
2174
|
+
const o = s.subjectId ? `${e}::${s.subjectId}` : e, a = new St(o);
|
|
2175
|
+
let d, w = !1, x = null, m = null;
|
|
2175
2176
|
!s.launcher && !s.el.style.height && s.el.clientHeight === 0 && (s.el.style.width = s.el.style.width || "100%", s.el.style.height = "600px");
|
|
2176
|
-
for (const
|
|
2177
|
-
let
|
|
2177
|
+
for (const l of a.load()) n.addOptimistic(l.clientMsgId, l.content);
|
|
2178
|
+
let f = null, h = null, u = 0, S = !s.launcher;
|
|
2178
2179
|
if (s.launcher) {
|
|
2179
2180
|
const p = (s.position ?? "bottom-right").includes("right");
|
|
2180
|
-
|
|
2181
|
-
const y = document.createElement("div"),
|
|
2181
|
+
f = document.createElement("div"), f.style.cssText = `position:fixed;${p ? "right:20px" : "left:20px"};bottom:20px;z-index:9999;display:flex;flex-direction:column;align-items:${p ? "flex-end" : "flex-start"};gap:12px`;
|
|
2182
|
+
const y = document.createElement("div"), E = typeof window < "u" ? window.matchMedia("(max-width: 479px)") : null, R = ($) => {
|
|
2182
2183
|
y.style.cssText = $ ? [
|
|
2183
2184
|
"position:fixed",
|
|
2184
2185
|
"inset:0",
|
|
@@ -2208,9 +2209,9 @@ function Ot(s) {
|
|
|
2208
2209
|
"transform:scale(.95)"
|
|
2209
2210
|
].join(";");
|
|
2210
2211
|
};
|
|
2211
|
-
R((
|
|
2212
|
+
R((E == null ? void 0 : E.matches) ?? !1);
|
|
2212
2213
|
const V = ($) => R($.matches);
|
|
2213
|
-
|
|
2214
|
+
E == null || E.addEventListener("change", V), x = E, m = V, s.el.style.cssText = "width:100%;height:100%;overflow:hidden", y.append(s.el);
|
|
2214
2215
|
const B = document.createElement("button");
|
|
2215
2216
|
B.style.cssText = [
|
|
2216
2217
|
"width:56px;height:56px;border-radius:50%",
|
|
@@ -2223,126 +2224,126 @@ function Ot(s) {
|
|
|
2223
2224
|
B.style.transform = "scale(1.08)";
|
|
2224
2225
|
}, B.onmouseleave = () => {
|
|
2225
2226
|
B.style.transform = "scale(1)";
|
|
2226
|
-
},
|
|
2227
|
+
}, h = document.createElement("span"), h.style.cssText = "position:absolute;top:-4px;right:-4px;background:#ef4444;color:#fff;border-radius:50%;width:20px;height:20px;font-size:11px;font-weight:700;display:none;align-items:center;justify-content:center", B.append(h), f.append(y, B), document.body.append(f);
|
|
2227
2228
|
const W = ($) => {
|
|
2228
2229
|
$ ? (y.style.display = "flex", requestAnimationFrame(() => {
|
|
2229
2230
|
y.style.opacity = "1", y.style.transform = "scale(1)";
|
|
2230
2231
|
})) : (y.style.opacity = "0", y.style.transform = "scale(.95)", setTimeout(() => {
|
|
2231
|
-
|
|
2232
|
+
S || (y.style.display = "none");
|
|
2232
2233
|
}, 180));
|
|
2233
2234
|
};
|
|
2234
2235
|
B.addEventListener("click", () => {
|
|
2235
|
-
|
|
2236
|
+
S = !S, W(S), B.textContent = S ? "✕" : "💬", B.append(h), S && (u = 0, h && (h.style.display = "none"));
|
|
2236
2237
|
}), document.addEventListener("keydown", ($) => {
|
|
2237
|
-
$.key === "Escape" &&
|
|
2238
|
+
$.key === "Escape" && S && (S = !1, W(!1), B.textContent = "💬", B.append(h));
|
|
2238
2239
|
});
|
|
2239
2240
|
}
|
|
2240
|
-
const
|
|
2241
|
-
|
|
2242
|
-
},
|
|
2241
|
+
const v = () => {
|
|
2242
|
+
S || (u++, h && (h.textContent = String(u), h.style.display = "flex"));
|
|
2243
|
+
}, b = () => {
|
|
2243
2244
|
try {
|
|
2244
|
-
const
|
|
2245
|
-
p.connect(y), y.connect(
|
|
2245
|
+
const l = new AudioContext(), p = l.createOscillator(), y = l.createGain();
|
|
2246
|
+
p.connect(y), y.connect(l.destination), p.frequency.setValueAtTime(880, l.currentTime), p.frequency.exponentialRampToValueAtTime(440, l.currentTime + 0.15), y.gain.setValueAtTime(0.3, l.currentTime), y.gain.exponentialRampToValueAtTime(1e-3, l.currentTime + 0.3), p.start(), p.stop(l.currentTime + 0.3);
|
|
2246
2247
|
} catch {
|
|
2247
2248
|
}
|
|
2248
|
-
},
|
|
2249
|
-
for (;
|
|
2250
|
-
const p =
|
|
2251
|
-
|
|
2249
|
+
}, T = [], K = (l) => {
|
|
2250
|
+
for (; T.length; ) {
|
|
2251
|
+
const p = T.shift();
|
|
2252
|
+
a.add({ clientMsgId: p.clientMsgId, content: p.content, ts: Date.now() }), g.send({ type: "send", conversationId: l, clientMsgId: p.clientMsgId, content: p.content });
|
|
2252
2253
|
}
|
|
2253
2254
|
};
|
|
2254
|
-
let
|
|
2255
|
-
const
|
|
2256
|
-
let
|
|
2257
|
-
const
|
|
2258
|
-
let
|
|
2259
|
-
const
|
|
2260
|
-
|
|
2261
|
-
|
|
2255
|
+
let g;
|
|
2256
|
+
const C = new zt(`ocw-e2e-${s.profileId}`);
|
|
2257
|
+
let A = !1;
|
|
2258
|
+
const U = [], M = [];
|
|
2259
|
+
let k = !1;
|
|
2260
|
+
const P = (l, p) => {
|
|
2261
|
+
C.sealText(p).then((y) => {
|
|
2262
|
+
d && g.send({ type: "send", conversationId: d, clientMsgId: l, content: y });
|
|
2262
2263
|
});
|
|
2263
|
-
},
|
|
2264
|
-
|
|
2265
|
-
|
|
2264
|
+
}, Q = (l, p, y) => {
|
|
2265
|
+
C.sealText(p, y).then((E) => {
|
|
2266
|
+
d && g.send({ type: "send", conversationId: d, clientMsgId: l, content: E });
|
|
2266
2267
|
});
|
|
2267
|
-
},
|
|
2268
|
-
for (;
|
|
2269
|
-
const
|
|
2270
|
-
|
|
2268
|
+
}, Se = () => {
|
|
2269
|
+
for (; U.length; ) {
|
|
2270
|
+
const l = U.shift();
|
|
2271
|
+
P(l.clientMsgId, l.text);
|
|
2271
2272
|
}
|
|
2272
|
-
for (;
|
|
2273
|
-
const
|
|
2274
|
-
|
|
2273
|
+
for (; M.length; ) {
|
|
2274
|
+
const l = M.shift();
|
|
2275
|
+
P(l.clientMsgId, l.text);
|
|
2275
2276
|
}
|
|
2276
|
-
},
|
|
2277
|
-
|
|
2278
|
-
},
|
|
2279
|
-
|
|
2280
|
-
const L = new
|
|
2281
|
-
onSend(
|
|
2282
|
-
const p = `cm_${Math.random().toString(36).slice(2)}`, y = { kind: "text", text:
|
|
2283
|
-
n.addOptimistic(p, y), L.render(n), n.e2e ?
|
|
2277
|
+
}, Ie = (l) => {
|
|
2278
|
+
g.send({ type: "fetchPrekey", targetUserId: l });
|
|
2279
|
+
}, Ce = s.i18n ?? {}, Ee = ["ar", "he", "fa", "ur"], Te = typeof navigator < "u" ? (navigator.language ?? "").slice(0, 2).toLowerCase() : "";
|
|
2280
|
+
Ee.includes(Te) && !s.el.dir && (s.el.dir = "rtl", s.el.style.fontFamily = s.el.style.fontFamily || "Tahoma,Arial,system-ui,sans-serif");
|
|
2281
|
+
const L = new Ht(s.el, e, {
|
|
2282
|
+
onSend(l) {
|
|
2283
|
+
const p = `cm_${Math.random().toString(36).slice(2)}`, y = { kind: "text", text: l };
|
|
2284
|
+
n.addOptimistic(p, y), L.render(n), n.e2e ? C.ready ? P(p, l) : k ? M.push({ clientMsgId: p, text: l }) : (U.push({ clientMsgId: p, text: l }), n.assignedAgentId && Ie(n.assignedAgentId)) : d ? (a.add({ clientMsgId: p, content: y, ts: Date.now() }), g.send({ type: "send", conversationId: d, clientMsgId: p, content: y })) : T.push({ clientMsgId: p, content: y });
|
|
2284
2285
|
},
|
|
2285
|
-
async onAttach(
|
|
2286
|
-
if (!
|
|
2287
|
-
const p = `${
|
|
2288
|
-
n.addOptimistic(y, { kind: "text", text: `📎 Uploading ${
|
|
2286
|
+
async onAttach(l) {
|
|
2287
|
+
if (!d) return;
|
|
2288
|
+
const p = `${i}/upload?name=${encodeURIComponent(l.name)}`, y = `cm_${Math.random().toString(36).slice(2)}`;
|
|
2289
|
+
n.addOptimistic(y, { kind: "text", text: `📎 Uploading ${l.name}…` }), L.render(n);
|
|
2289
2290
|
try {
|
|
2290
|
-
const
|
|
2291
|
+
const E = await fetch(p, {
|
|
2291
2292
|
method: "POST",
|
|
2292
|
-
headers: { "content-type":
|
|
2293
|
-
body:
|
|
2293
|
+
headers: { "content-type": l.type, ...s.token ? { authorization: `Bearer ${s.token}` } : {} },
|
|
2294
|
+
body: l
|
|
2294
2295
|
});
|
|
2295
|
-
if (!
|
|
2296
|
-
const { url: R, name: V, mime: B, size: W } = await
|
|
2297
|
-
|
|
2298
|
-
} catch (
|
|
2299
|
-
n.addOptimistic(y, { kind: "text", text: `⚠️ Upload failed: ${
|
|
2296
|
+
if (!E.ok) throw new Error(`Upload failed: ${E.status}`);
|
|
2297
|
+
const { url: R, name: V, mime: B, size: W } = await E.json();
|
|
2298
|
+
g.send({ type: "send", conversationId: d, clientMsgId: y, content: { kind: "attachment", url: R, name: V, mime: B, size: W } });
|
|
2299
|
+
} catch (E) {
|
|
2300
|
+
n.addOptimistic(y, { kind: "text", text: `⚠️ Upload failed: ${E.message}` }), L.render(n);
|
|
2300
2301
|
}
|
|
2301
2302
|
},
|
|
2302
|
-
onInvoke(
|
|
2303
|
-
|
|
2303
|
+
onInvoke(l, p) {
|
|
2304
|
+
d && g.send({ type: "invoke", conversationId: d, actionId: l, clientInvokeId: `iv_${Math.random().toString(36).slice(2)}`, ...p ? { inputs: p } : {} });
|
|
2304
2305
|
},
|
|
2305
|
-
onTyping(
|
|
2306
|
-
|
|
2306
|
+
onTyping(l, p) {
|
|
2307
|
+
d && g.send({ type: "typing", conversationId: d, isTyping: l, ...p ? { preview: p } : {} });
|
|
2307
2308
|
},
|
|
2308
|
-
onReadUpTo(
|
|
2309
|
-
|
|
2309
|
+
onReadUpTo(l) {
|
|
2310
|
+
d && g.send({ type: "read", conversationId: d, seq: l });
|
|
2310
2311
|
},
|
|
2311
2312
|
onLoadMore() {
|
|
2312
|
-
if (!
|
|
2313
|
-
const
|
|
2314
|
-
|
|
2313
|
+
if (!d || !n.e2e) return;
|
|
2314
|
+
const l = n.messages()[0];
|
|
2315
|
+
l && g.send({ type: "history", conversationId: d, beforeSeq: l.seq, limit: 20 });
|
|
2315
2316
|
},
|
|
2316
|
-
onEdit(
|
|
2317
|
-
|
|
2317
|
+
onEdit(l, p) {
|
|
2318
|
+
d && g.send({ type: "edit", conversationId: d, messageId: l, content: { kind: "text", text: p } });
|
|
2318
2319
|
},
|
|
2319
|
-
onDelete(
|
|
2320
|
-
|
|
2320
|
+
onDelete(l) {
|
|
2321
|
+
d && g.send({ type: "delete", conversationId: d, messageId: l });
|
|
2321
2322
|
},
|
|
2322
|
-
onReact(
|
|
2323
|
-
|
|
2323
|
+
onReact(l, p, y) {
|
|
2324
|
+
d && g.send({ type: "react", conversationId: d, messageId: l, emoji: p, remove: y });
|
|
2324
2325
|
},
|
|
2325
|
-
onCsat(
|
|
2326
|
-
|
|
2326
|
+
onCsat(l) {
|
|
2327
|
+
d && fetch(`${i}/conversations/${d}/csat`, {
|
|
2327
2328
|
method: "POST",
|
|
2328
2329
|
headers: { "Content-Type": "application/json", Authorization: `Bearer ${e}` },
|
|
2329
|
-
body: JSON.stringify({ score:
|
|
2330
|
+
body: JSON.stringify({ score: l })
|
|
2330
2331
|
}).catch(() => {
|
|
2331
2332
|
});
|
|
2332
2333
|
},
|
|
2333
|
-
onAnnotate(
|
|
2334
|
-
|
|
2334
|
+
onAnnotate(l) {
|
|
2335
|
+
d && g.send({ type: "annotate", conversationId: d, stroke: l });
|
|
2335
2336
|
},
|
|
2336
2337
|
onAnnotateClear() {
|
|
2337
|
-
|
|
2338
|
+
d && g.send({ type: "annotate_clear", conversationId: d });
|
|
2338
2339
|
},
|
|
2339
2340
|
...s.translateLang ? {
|
|
2340
|
-
async onTranslate(
|
|
2341
|
+
async onTranslate(l) {
|
|
2341
2342
|
try {
|
|
2342
|
-
const p = await fetch(`${
|
|
2343
|
+
const p = await fetch(`${i}/translate`, {
|
|
2343
2344
|
method: "POST",
|
|
2344
2345
|
headers: { "content-type": "application/json", authorization: `Bearer ${e}` },
|
|
2345
|
-
body: JSON.stringify({ text:
|
|
2346
|
+
body: JSON.stringify({ text: l, targetLang: s.translateLang })
|
|
2346
2347
|
});
|
|
2347
2348
|
if (!p.ok) return null;
|
|
2348
2349
|
const { translated: y } = await p.json();
|
|
@@ -2357,8 +2358,8 @@ function Ot(s) {
|
|
|
2357
2358
|
...s.quickReplies ? { quickReplies: s.quickReplies } : {},
|
|
2358
2359
|
...s.accent ? { accent: s.accent } : {},
|
|
2359
2360
|
...(ce = s.user) != null && ce.name || (de = s.user) != null && de.avatar ? { userInfo: { ...s.user.name ? { name: s.user.name } : {}, ...s.user.avatar ? { avatar: s.user.avatar } : {} } } : {},
|
|
2360
|
-
i18n:
|
|
2361
|
-
}),
|
|
2361
|
+
i18n: Ce
|
|
2362
|
+
}), Ue = {
|
|
2362
2363
|
type: "open",
|
|
2363
2364
|
profileId: s.profileId,
|
|
2364
2365
|
...s.subjectId ? { subjectId: s.subjectId } : {},
|
|
@@ -2368,82 +2369,83 @@ function Ot(s) {
|
|
|
2368
2369
|
// This is how listingTitle and listingMeta get saved without a separate API call.
|
|
2369
2370
|
...(le = s.subject) != null && le.title ? { subjectTitle: s.subject.title } : {},
|
|
2370
2371
|
...(he = s.subject) != null && he.subtitle ? { subjectMeta: s.subject.subtitle } : {}
|
|
2371
|
-
},
|
|
2372
|
+
}, Pe = (l) => {
|
|
2372
2373
|
const p = s.user;
|
|
2373
2374
|
if (!p || !p.name && !p.email && !p.avatar && !p.meta) return;
|
|
2374
2375
|
const y = [];
|
|
2375
|
-
if (p.name && y.push(`Name: ${p.name}`), p.email && y.push(`Email: ${p.email}`), p.avatar && y.push(`Avatar: ${p.avatar}`), p.meta) for (const [
|
|
2376
|
-
|
|
2376
|
+
if (p.name && y.push(`Name: ${p.name}`), p.email && y.push(`Email: ${p.email}`), p.avatar && y.push(`Avatar: ${p.avatar}`), p.meta) for (const [E, R] of Object.entries(p.meta)) y.push(`${E}: ${R}`);
|
|
2377
|
+
g.send({ type: "note", conversationId: l, clientMsgId: `ui_${Date.now()}`, text: `[User info]
|
|
2377
2378
|
${y.join(`
|
|
2378
2379
|
`)}` });
|
|
2379
2380
|
};
|
|
2380
|
-
|
|
2381
|
-
url:
|
|
2381
|
+
g = new mt({
|
|
2382
|
+
url: t,
|
|
2382
2383
|
token: e,
|
|
2383
|
-
open:
|
|
2384
|
+
open: Ue,
|
|
2384
2385
|
getCursor: () => n.highestSeq(),
|
|
2385
|
-
onStatusChange: (
|
|
2386
|
-
onFrame(
|
|
2387
|
-
if (
|
|
2388
|
-
const p =
|
|
2389
|
-
if (
|
|
2390
|
-
|
|
2391
|
-
for (const y of
|
|
2392
|
-
|
|
2386
|
+
onStatusChange: (l) => L.setConnStatus(l),
|
|
2387
|
+
onFrame(l) {
|
|
2388
|
+
if (l.type === "opened") {
|
|
2389
|
+
const p = d === void 0;
|
|
2390
|
+
if (d = l.conversation.id, !w) {
|
|
2391
|
+
w = !0;
|
|
2392
|
+
for (const y of a.load())
|
|
2393
|
+
g.send({ type: "send", conversationId: d, clientMsgId: y.clientMsgId, content: y.content });
|
|
2393
2394
|
}
|
|
2394
|
-
|
|
2395
|
+
Le(t, e, d, n, L, i), T.length && K(d), p && l.conversation.lastSeq === 0 && Pe(d);
|
|
2395
2396
|
}
|
|
2396
|
-
if (
|
|
2397
|
-
|
|
2398
|
-
const y = [...
|
|
2399
|
-
for (const
|
|
2397
|
+
if (l.type === "ack" && a.remove(l.clientMsgId), l.type === "prekeyBundle") {
|
|
2398
|
+
l.bundle && (k = !0, C.x3dhSendTo(l.bundle).then((p) => {
|
|
2399
|
+
const y = [...U.splice(0), ...M.splice(0)];
|
|
2400
|
+
for (const E of y) Q(E.clientMsgId, E.text, p);
|
|
2400
2401
|
L.render(n);
|
|
2401
2402
|
}));
|
|
2402
2403
|
return;
|
|
2403
2404
|
}
|
|
2404
|
-
if (
|
|
2405
|
-
const p =
|
|
2406
|
-
if (p && !
|
|
2407
|
-
|
|
2408
|
-
await
|
|
2405
|
+
if (l.type === "message" && n.e2e) {
|
|
2406
|
+
const p = Lt(l.message.content);
|
|
2407
|
+
if (p && !C.ready) {
|
|
2408
|
+
C.x3dhReceiveFrom(p.x3dhIK, p.x3dhEK, p.x3dhSPK).then(async () => {
|
|
2409
|
+
await C.openFrame(l), n.apply(l), L.render(n);
|
|
2409
2410
|
});
|
|
2410
2411
|
return;
|
|
2411
2412
|
}
|
|
2412
2413
|
}
|
|
2413
|
-
if (
|
|
2414
|
-
|
|
2415
|
-
|
|
2414
|
+
if (l.type === "peerkey") {
|
|
2415
|
+
C.onPeerKey(l.key).then(() => {
|
|
2416
|
+
Se(), L.render(n);
|
|
2416
2417
|
});
|
|
2417
2418
|
return;
|
|
2418
2419
|
}
|
|
2419
2420
|
(async () => {
|
|
2420
|
-
if (n.e2e && await
|
|
2421
|
-
|
|
2422
|
-
const p = await
|
|
2423
|
-
|
|
2424
|
-
const y = await
|
|
2425
|
-
|
|
2421
|
+
if (n.e2e && await C.openFrame(l), n.apply(l), l.type === "message" && l.message.senderId !== e && !l.message.internal && (v(), b()), n.e2e && d && !A) {
|
|
2422
|
+
A = !0;
|
|
2423
|
+
const p = await C.initX3DH();
|
|
2424
|
+
g.send({ type: "uploadPrekeys", ...p });
|
|
2425
|
+
const y = await C.begin();
|
|
2426
|
+
g.send({ type: "pubkey", conversationId: d, key: y });
|
|
2426
2427
|
}
|
|
2427
2428
|
L.render(n);
|
|
2428
2429
|
})();
|
|
2429
2430
|
}
|
|
2430
|
-
}),
|
|
2431
|
+
}), g.connect(), L.render(n);
|
|
2431
2432
|
const ae = { close: () => {
|
|
2432
|
-
|
|
2433
|
+
g.close(), f == null || f.remove(), L.destroy(), x && m && x.removeEventListener("change", m), H.delete(s.el);
|
|
2433
2434
|
} };
|
|
2434
2435
|
return H.set(s.el, ae), ae;
|
|
2435
2436
|
}
|
|
2436
2437
|
export {
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
ze as
|
|
2447
|
-
|
|
2438
|
+
bt as ChatStore,
|
|
2439
|
+
mt as ConnectionManager,
|
|
2440
|
+
zt as E2ESession,
|
|
2441
|
+
St as PersistentOutbox,
|
|
2442
|
+
Ht as Renderer,
|
|
2443
|
+
qt as asConversationId,
|
|
2444
|
+
Lt as extractX3DHInit,
|
|
2445
|
+
Xt as httpBaseFromWsUrl,
|
|
2446
|
+
Nt as mount,
|
|
2447
|
+
ze as resolveRelayUrls,
|
|
2448
|
+
Le as restoreHistory,
|
|
2449
|
+
Ot as unmount
|
|
2448
2450
|
};
|
|
2449
2451
|
//# sourceMappingURL=index.js.map
|