@dialstack/sdk-native 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Only these survive until JS subscribes. This mirrors expo-callkit-telecom,
3
+ * where every other event has a queue limit of 0 and is dropped if no listener
4
+ * is mounted — the bridge must never depend on a late `setHeld` or `end`.
5
+ */
6
+ const REPLAYED = new Set([
7
+ 'incomingReported',
8
+ 'answer',
9
+ 'audioSessionActivated',
10
+ ]);
11
+ /**
12
+ * In-memory OS. The `os` side (`nativeReportIncoming`, `answer`, `end`, …)
13
+ * plays the platform: it is what a test drives, and what a real adapter's
14
+ * native code does on a device.
15
+ */
16
+ class FakeOsCallAdapter {
17
+ constructor(options = {}) {
18
+ this.listeners = new Map();
19
+ this.queued = new Map();
20
+ this.sessions = new Map();
21
+ this.minted = 0;
22
+ this.log = [];
23
+ this.injectedFailures = new Map();
24
+ this.ignored = new Map();
25
+ this.echo = options.echoSetActions ?? true;
26
+ this.multiCall = options.multiCall ?? false;
27
+ }
28
+ // --- OsCallAdapter (what the bridge calls) ---
29
+ async reportIncoming(call) {
30
+ this.maybeFail('reportIncoming');
31
+ if (!this.multiCall && this.sessions.size > 0) {
32
+ throw new Error('FakeOsCallAdapter: one call at a time');
33
+ }
34
+ this.minted += 1;
35
+ const sessionId = `fake-session-${this.minted}`;
36
+ this.sessions.set(sessionId, {
37
+ sessionId,
38
+ callId: call.callId,
39
+ connected: false,
40
+ answerRequested: false,
41
+ });
42
+ this.log.push(`reportIncoming ${sessionId} ${call.from}`);
43
+ this.emit('incomingReported', { sessionId, callId: call.callId });
44
+ return sessionId;
45
+ }
46
+ async reportOutgoing(call) {
47
+ this.maybeFail('reportOutgoing');
48
+ if (this.sessions.size > 0) {
49
+ throw new Error('FakeOsCallAdapter: one call at a time');
50
+ }
51
+ this.minted += 1;
52
+ const sessionId = `fake-session-${this.minted}`;
53
+ // No callId yet — the bridge links it after phone.call() returns.
54
+ this.sessions.set(sessionId, {
55
+ sessionId,
56
+ callId: null,
57
+ connected: false,
58
+ answerRequested: false,
59
+ });
60
+ this.log.push(`reportOutgoing ${sessionId} ${call.to}`);
61
+ return sessionId;
62
+ }
63
+ async reportConnected(sessionId) {
64
+ const s = this.require(sessionId, 'reportConnected');
65
+ if (!this.takeIgnored('reportConnected'))
66
+ s.connected = true;
67
+ this.log.push(`reportConnected ${sessionId}`);
68
+ }
69
+ async reportEnded(sessionId, reason) {
70
+ this.require(sessionId, 'reportEnded');
71
+ this.sessions.delete(sessionId);
72
+ this.log.push(`reportEnded ${sessionId} ${reason}`);
73
+ }
74
+ async setHeld(sessionId, held) {
75
+ const s = this.require(sessionId, 'setHeld');
76
+ if (!this.takeIgnored('setHeld'))
77
+ s.onHold = held;
78
+ this.log.push(`setHeld ${sessionId} ${held}`);
79
+ if (this.echo)
80
+ this.emit('setHeld', { sessionId, held });
81
+ }
82
+ async setMuted(sessionId, muted) {
83
+ this.require(sessionId, 'setMuted');
84
+ this.log.push(`setMuted ${sessionId} ${muted}`);
85
+ if (this.echo)
86
+ this.emit('setMuted', { sessionId, muted });
87
+ }
88
+ async getActiveSession() {
89
+ const first = this.sessions.values().next();
90
+ if (first.done)
91
+ return null;
92
+ return this.view(first.value);
93
+ }
94
+ view(s) {
95
+ const status = s.connected ? 'connected' : s.answerRequested ? 'connecting' : 'ringing';
96
+ return { sessionId: s.sessionId, callId: s.callId, status, held: s.onHold ?? false };
97
+ }
98
+ on(event, listener) {
99
+ let set = this.listeners.get(event);
100
+ if (!set) {
101
+ set = new Set();
102
+ this.listeners.set(event, set);
103
+ }
104
+ set.add(listener);
105
+ const pending = this.queued.get(event);
106
+ if (pending) {
107
+ this.queued.delete(event);
108
+ for (const e of pending)
109
+ listener(e);
110
+ }
111
+ return () => {
112
+ set?.delete(listener);
113
+ };
114
+ }
115
+ // --- the OS side (what native code / the user does) ---
116
+ /**
117
+ * Native reported the call before any JS existed (FCM service / PushKit handler).
118
+ *
119
+ * `callId` is the call_id the wake push carried, reported on
120
+ * `incomingReported` so the bridge can pair the session with its call. Pass
121
+ * `callId: null` for a push that carried none.
122
+ */
123
+ nativeReportIncoming(session) {
124
+ this.sessions.set(session.sessionId, {
125
+ ...session,
126
+ connected: false,
127
+ answerRequested: false,
128
+ });
129
+ this.emit('incomingReported', session);
130
+ }
131
+ /** The user dialled from the OS's own UI (Recents / Siri / dialer). */
132
+ nativeCallIntent(handle) {
133
+ this.emit('callIntent', { handle });
134
+ }
135
+ /**
136
+ * The user answered, from the OS surface or via the adapter's `answer`.
137
+ *
138
+ * Modelled as a REQUEST, which is what both platforms do: CallKit's
139
+ * CXAnswerCallAction and Telecom's answer leave the call alerting until the
140
+ * app reports it connected. Forgetting that report is invisible in a unit test
141
+ * that only checks the SDK call answered — but on a device it is a phone that
142
+ * never stops ringing, so the fake tracks it and `stillAlerting()` asserts it.
143
+ */
144
+ async answer(sessionId) {
145
+ this.maybeFail('answer');
146
+ const s = this.sessions.get(sessionId);
147
+ if (s)
148
+ s.answerRequested = true;
149
+ this.emit('answer', { sessionId });
150
+ }
151
+ /**
152
+ * Sessions the user answered that were never reported connected — the OS is
153
+ * still showing its incoming UI for each one.
154
+ */
155
+ stillAlerting() {
156
+ return [...this.sessions.values()]
157
+ .filter((s) => s.answerRequested && !s.connected)
158
+ .map((s) => s.sessionId);
159
+ }
160
+ /** The user ended/declined from the OS surface. The session is gone from the OS's view. */
161
+ async end(sessionId) {
162
+ this.maybeFail('end');
163
+ this.sessions.delete(sessionId);
164
+ this.emit('end', { sessionId });
165
+ }
166
+ hold(sessionId, held) {
167
+ const s = this.sessions.get(sessionId);
168
+ if (s)
169
+ s.onHold = held;
170
+ this.emit('setHeld', { sessionId, held });
171
+ }
172
+ mute(sessionId, muted) {
173
+ this.emit('setMuted', { sessionId, muted });
174
+ }
175
+ dtmf(sessionId, digits) {
176
+ this.emit('dtmf', { sessionId, digits });
177
+ }
178
+ /**
179
+ * The OS dropped a report it accepted: the session stays where it was, as iOS
180
+ * leaves an incoming call ringing after a connected report.
181
+ */
182
+ ignoreNext(op, times = 1) {
183
+ this.ignored.set(op, times);
184
+ }
185
+ isConnected(sessionId) {
186
+ return this.sessions.get(sessionId)?.connected ?? false;
187
+ }
188
+ sessionCount() {
189
+ return this.sessions.size;
190
+ }
191
+ // --- internals ---
192
+ /** Make the next `times` calls to adapter method `op` reject, as a real OS layer can. */
193
+ failNext(op, times = 1) {
194
+ this.injectedFailures.set(op, times);
195
+ }
196
+ maybeFail(op) {
197
+ const left = this.injectedFailures.get(op) ?? 0;
198
+ if (left <= 0)
199
+ return;
200
+ this.injectedFailures.set(op, left - 1);
201
+ throw new Error(`FakeOsCallAdapter: injected ${op} failure`);
202
+ }
203
+ takeIgnored(op) {
204
+ const left = this.ignored.get(op) ?? 0;
205
+ if (left <= 0)
206
+ return false;
207
+ this.ignored.set(op, left - 1);
208
+ return true;
209
+ }
210
+ require(sessionId, op) {
211
+ this.maybeFail(op);
212
+ const s = this.sessions.get(sessionId);
213
+ if (!s)
214
+ throw new Error(`FakeOsCallAdapter: ${op} on unknown session ${sessionId}`);
215
+ return s;
216
+ }
217
+ emit(event, e) {
218
+ const set = this.listeners.get(event);
219
+ if (!set || set.size === 0) {
220
+ if (REPLAYED.has(event)) {
221
+ const q = this.queued.get(event) ?? [];
222
+ q.push(e);
223
+ this.queued.set(event, q);
224
+ }
225
+ return;
226
+ }
227
+ for (const l of [...set])
228
+ l(e);
229
+ }
230
+ }
231
+
232
+ const flush = () => new Promise((r) => setTimeout(r, 0));
233
+ /**
234
+ * What the bridge assumes of every adapter. An adapter that passes this can be
235
+ * dropped in for the shipped one; one that fails it will show up as the
236
+ * intermittent "answer does nothing" class of bug, so run it before a device.
237
+ */
238
+ function runOsCallAdapterContract(name, t, fixture) {
239
+ t.describe(`${name}: OsCallAdapter contract`, () => {
240
+ t.it('replays an incomingReported that fired before JS subscribed', async () => {
241
+ const { adapter, os } = await fixture();
242
+ await os.nativeReportIncoming({ sessionId: 's1', callId: 'call_1' });
243
+ const seen = [];
244
+ adapter.on('incomingReported', (e) => seen.push(e));
245
+ await flush();
246
+ t.expect(seen).toEqual([{ sessionId: 's1', callId: 'call_1' }]);
247
+ });
248
+ t.it('replays an answer that fired before JS subscribed', async () => {
249
+ const { adapter, os } = await fixture();
250
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
251
+ await adapter.answer('s1');
252
+ const seen = [];
253
+ adapter.on('answer', (e) => seen.push(e.sessionId));
254
+ await flush();
255
+ t.expect(seen).toEqual(['s1']);
256
+ });
257
+ t.it('getActiveSession after incomingReported returns that session', async () => {
258
+ const { adapter, os } = await fixture();
259
+ await os.nativeReportIncoming({ sessionId: 's1', callId: 'call_1' });
260
+ const active = await adapter.getActiveSession();
261
+ t.expect(active?.sessionId).toBe('s1');
262
+ });
263
+ t.it('getActiveSession reflects a call reported from JS', async () => {
264
+ const { adapter } = await fixture();
265
+ const sessionId = await adapter.reportIncoming({ callId: 'call_1', from: '1002' });
266
+ const active = await adapter.getActiveSession();
267
+ t.expect({ sessionId: active?.sessionId, callId: active?.callId }).toEqual({
268
+ sessionId,
269
+ callId: 'call_1',
270
+ });
271
+ });
272
+ t.it('getActiveSession reports status and hold as the OS shows them, when it reports them', async () => {
273
+ // Optional fields: an adapter that leaves one out opts that field out of
274
+ // the bridge's reconcile. One that reports it must report it right, or the
275
+ // bridge "corrects" a session that was fine.
276
+ const { adapter } = await fixture();
277
+ const sessionId = await adapter.reportIncoming({ callId: 'call_1', from: '1002' });
278
+ const ringing = await adapter.getActiveSession();
279
+ if (ringing?.status !== undefined)
280
+ t.expect(ringing.status).toBe('ringing');
281
+ await adapter.reportConnected(sessionId);
282
+ await adapter.setHeld(sessionId, true);
283
+ await flush();
284
+ const after = await adapter.getActiveSession();
285
+ if (after?.status !== undefined)
286
+ t.expect(after.status).toBe('connected');
287
+ if (after?.held !== undefined)
288
+ t.expect(after.held).toBe(true);
289
+ });
290
+ t.it('incomingReported carries the call_id the session was reported with', async () => {
291
+ // The bridge pairs a session with its call by this, with no second lookup.
292
+ const { adapter } = await fixture();
293
+ const seen = [];
294
+ adapter.on('incomingReported', (e) => seen.push(e));
295
+ const sessionId = await adapter.reportIncoming({
296
+ callId: 'call_1',
297
+ from: '15551234567',
298
+ displayName: null,
299
+ });
300
+ await Promise.resolve();
301
+ t.expect(seen.find((e) => e.sessionId === sessionId)?.callId).toBe('call_1');
302
+ });
303
+ t.it('reportOutgoing opens a live session that reportEnded clears', async () => {
304
+ const { adapter } = await fixture();
305
+ const sessionId = await adapter.reportOutgoing({ to: '15551234567' });
306
+ t.expect(typeof sessionId).toBe('string');
307
+ // The session is live (this is the FGS an outbound call needs); ending it
308
+ // must not re-emit 'end' and must clear it, like the incoming path.
309
+ const ends = [];
310
+ adapter.on('end', (e) => ends.push(e.sessionId));
311
+ await adapter.reportEnded(sessionId, 'remoteEnded');
312
+ await flush();
313
+ t.expect(ends).toHaveLength(0);
314
+ t.expect(await adapter.getActiveSession()).toBeNull();
315
+ });
316
+ t.it('reportEnded does not re-emit end and clears the active session', async () => {
317
+ const { adapter, os } = await fixture();
318
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
319
+ const ends = [];
320
+ adapter.on('end', (e) => ends.push(e.sessionId));
321
+ await adapter.reportEnded('s1', 'remoteEnded');
322
+ await flush();
323
+ t.expect(ends).toHaveLength(0);
324
+ t.expect(await adapter.getActiveSession()).toBeNull();
325
+ });
326
+ t.it('an OS end emits end exactly once and clears the active session', async () => {
327
+ const { adapter, os } = await fixture();
328
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
329
+ const ends = [];
330
+ adapter.on('end', (e) => ends.push(e.sessionId));
331
+ await adapter.end('s1');
332
+ await flush();
333
+ t.expect(ends).toEqual(['s1']);
334
+ t.expect(await adapter.getActiveSession()).toBeNull();
335
+ });
336
+ t.it('setHeld echoes at most once, with the value that was set', async () => {
337
+ const { adapter, os } = await fixture();
338
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
339
+ const echoes = [];
340
+ adapter.on('setHeld', (e) => echoes.push(e.held));
341
+ await adapter.setHeld('s1', true);
342
+ await flush();
343
+ t.expect(echoes.length).toBeLessThanOrEqual(1);
344
+ t.expect(echoes.every((h) => h === true)).toBe(true);
345
+ });
346
+ t.it('answer(sessionId) emits answer exactly once', async () => {
347
+ const { adapter, os } = await fixture();
348
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
349
+ const seen = [];
350
+ adapter.on('answer', (e) => seen.push(e.sessionId));
351
+ await adapter.answer('s1');
352
+ await flush();
353
+ t.expect(seen).toEqual(['s1']);
354
+ });
355
+ t.it('unsubscribing stops delivery', async () => {
356
+ const { adapter, os } = await fixture();
357
+ const seen = [];
358
+ const off = adapter.on('answer', (e) => seen.push(e.sessionId));
359
+ off();
360
+ await os.nativeReportIncoming({ sessionId: 's1', callId: null });
361
+ await adapter.answer('s1');
362
+ await flush();
363
+ t.expect(seen).toHaveLength(0);
364
+ });
365
+ });
366
+ }
367
+
368
+ function addHandler(handlers, event, handler) {
369
+ (handlers[event] ?? (handlers[event] = [])).push(handler);
370
+ }
371
+ function emitTo(handlers, event, ...args) {
372
+ for (const h of handlers[event] ?? [])
373
+ h(...args);
374
+ }
375
+ class FakeCall {
376
+ constructor(id, from = '1002') {
377
+ this.id = id;
378
+ this.from = from;
379
+ this.state = 'ringing';
380
+ this.isMuted = false;
381
+ this.fromName = null;
382
+ this.actions = [];
383
+ this.handlers = {};
384
+ /**
385
+ * Off: hold, resume and hangup only send, like the SDK's; the outcome comes
386
+ * later as an event or a phone error. On: they take effect at once.
387
+ */
388
+ this.autoConfirm = true;
389
+ /** Set to make answer() throw once, for the answer-failure path. */
390
+ this.failAnswer = false;
391
+ /** Make the next call to one of these fail the way the SDK's does. */
392
+ this.failNext = {};
393
+ }
394
+ takeFailure(op) {
395
+ const err = this.failNext[op];
396
+ delete this.failNext[op];
397
+ return err;
398
+ }
399
+ answer() {
400
+ this.actions.push('answer');
401
+ if (this.failAnswer) {
402
+ this.failAnswer = false;
403
+ throw new Error('answer failed');
404
+ }
405
+ this.state = 'active';
406
+ }
407
+ reject(reason = 'decline') {
408
+ this.actions.push(`reject:${reason}`);
409
+ const err = this.takeFailure('reject');
410
+ if (err)
411
+ throw err;
412
+ this.state = 'ended';
413
+ }
414
+ hangup() {
415
+ this.actions.push('hangup');
416
+ if (this.autoConfirm)
417
+ this.state = 'ended';
418
+ }
419
+ // Each throws, as the SDK's does when the socket is closed. A server-side
420
+ // refusal arrives instead as a phone error naming the call.
421
+ hold() {
422
+ this.actions.push('hold');
423
+ const err = this.takeFailure('hold');
424
+ if (err)
425
+ throw err;
426
+ if (this.autoConfirm)
427
+ this.state = 'held';
428
+ }
429
+ resume() {
430
+ this.actions.push('resume');
431
+ const err = this.takeFailure('resume');
432
+ if (err)
433
+ throw err;
434
+ if (this.autoConfirm)
435
+ this.state = 'active';
436
+ }
437
+ mute() {
438
+ this.actions.push('mute');
439
+ const err = this.takeFailure('mute');
440
+ if (err)
441
+ throw err;
442
+ this.isMuted = true;
443
+ }
444
+ unmute() {
445
+ this.actions.push('unmute');
446
+ const err = this.takeFailure('unmute');
447
+ if (err)
448
+ throw err;
449
+ this.isMuted = false;
450
+ }
451
+ sendDtmf(digits) {
452
+ this.actions.push(`dtmf:${digits}`);
453
+ const err = this.takeFailure('dtmf');
454
+ if (err)
455
+ throw err;
456
+ }
457
+ on(event, handler) {
458
+ addHandler(this.handlers, event, handler);
459
+ }
460
+ off(event, handler) {
461
+ this.handlers[event] = (this.handlers[event] ?? []).filter((h) => h !== handler);
462
+ }
463
+ emitAnswered() {
464
+ this.state = 'active';
465
+ this.emit('answered');
466
+ }
467
+ emitHeld(by) {
468
+ this.state = 'held';
469
+ this.emit('held', by);
470
+ }
471
+ emitResumed() {
472
+ this.state = 'active';
473
+ this.emit('resumed');
474
+ }
475
+ emitEnded(reason) {
476
+ this.state = 'ended';
477
+ this.emit('ended', reason);
478
+ }
479
+ emit(event, ...args) {
480
+ emitTo(this.handlers, event, ...args);
481
+ }
482
+ }
483
+ class FakePhone {
484
+ constructor() {
485
+ this.isConnected = false;
486
+ this.connectCalls = 0;
487
+ this.disconnectCalls = 0;
488
+ /** Set before connect() is called to make it fail. */
489
+ this.failConnectWith = null;
490
+ /** Set to hold connect() open until `resolveConnect()`. */
491
+ this.manualConnect = false;
492
+ this.resolvePending = null;
493
+ this.pendingConnect = null;
494
+ this.handlers = {};
495
+ this.tokens = [];
496
+ /** Set to make the next call() reject, for the placement-failure path. */
497
+ this.failCallWith = null;
498
+ this.outboundCalls = [];
499
+ this.callResult = null;
500
+ /** Set to hold call() open until `resolveCall()`. */
501
+ this.manualCall = false;
502
+ this.resolvePendingCall = null;
503
+ }
504
+ connect() {
505
+ this.connectCalls += 1;
506
+ if (this.failConnectWith)
507
+ return Promise.reject(this.failConnectWith);
508
+ // Like the real phone, a second connect() joins the one in flight.
509
+ if (this.pendingConnect)
510
+ return this.pendingConnect;
511
+ if (this.manualConnect) {
512
+ this.pendingConnect = new Promise((resolve) => {
513
+ this.resolvePending = () => {
514
+ this.isConnected = true;
515
+ this.pendingConnect = null;
516
+ resolve();
517
+ };
518
+ });
519
+ return this.pendingConnect;
520
+ }
521
+ this.isConnected = true;
522
+ return Promise.resolve();
523
+ }
524
+ resolveConnect() {
525
+ this.resolvePending?.();
526
+ this.resolvePending = null;
527
+ }
528
+ setToken(token) {
529
+ this.tokens.push(token);
530
+ }
531
+ call(destination) {
532
+ this.outboundCalls.push(destination);
533
+ if (this.failCallWith)
534
+ return Promise.reject(this.failCallWith);
535
+ const call = this.callResult ?? new FakeCall(`call_out_${this.outboundCalls.length}`, destination);
536
+ if (this.manualCall) {
537
+ return new Promise((resolve) => {
538
+ this.resolvePendingCall = () => resolve(call);
539
+ });
540
+ }
541
+ return Promise.resolve(call);
542
+ }
543
+ resolveCall() {
544
+ this.resolvePendingCall?.();
545
+ this.resolvePendingCall = null;
546
+ }
547
+ disconnect() {
548
+ this.disconnectCalls += 1;
549
+ this.isConnected = false;
550
+ // Like the real phone, abandons a connect in flight: the next connect() is new.
551
+ this.pendingConnect = null;
552
+ this.resolvePending = null;
553
+ this.emit('disconnected');
554
+ }
555
+ /**
556
+ * The OS froze the backgrounded app and killed the socket with no close frame:
557
+ * the transport is dead but `isConnected` still reads true and NO 'disconnected'
558
+ * fires. Models the corpse the wake path must not trust.
559
+ */
560
+ killSocketSilently() {
561
+ // isConnected deliberately left true; no event emitted.
562
+ }
563
+ /**
564
+ * The socket dropped and the transport is between automatic reconnect attempts:
565
+ * neither connected nor connecting, and no 'disconnected' fires.
566
+ */
567
+ startReconnecting() {
568
+ this.isConnected = false;
569
+ this.emit('reconnecting', 1, 30000);
570
+ }
571
+ on(event, handler) {
572
+ addHandler(this.handlers, event, handler);
573
+ }
574
+ emitIncoming(call) {
575
+ this.emit('incoming', call);
576
+ }
577
+ /** A server error frame, which the SDK names a call on when it can. */
578
+ emitError(err) {
579
+ this.emit('error', err);
580
+ }
581
+ emit(event, ...args) {
582
+ emitTo(this.handlers, event, ...args);
583
+ }
584
+ }
585
+ class FakeLifecycle {
586
+ constructor() {
587
+ this.listeners = [];
588
+ }
589
+ onChange(listener) {
590
+ this.listeners.push(listener);
591
+ return () => {
592
+ this.listeners = this.listeners.filter((l) => l !== listener);
593
+ };
594
+ }
595
+ set(state) {
596
+ for (const l of this.listeners)
597
+ l(state);
598
+ }
599
+ }
600
+
601
+ /** Test-only: the app never has a valid reason to forget its phone. */
602
+ function resetPhoneForTests() {
603
+ }
604
+
605
+ export { FakeCall, FakeLifecycle, FakeOsCallAdapter, FakePhone, resetPhoneForTests, runOsCallAdapterContract };
606
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sources":["../src/os/FakeOsCallAdapter.ts","../src/os/contract.ts","../src/bridge/fakes.ts","../src/bridge/createPhone.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dialstack/sdk-native",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "React Native softphone components for the DialStack SDK",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,6 +25,11 @@
25
25
  "types": "./dist/index.d.ts",
26
26
  "react-native": "./dist/index.js",
27
27
  "default": "./dist/index.js"
28
+ },
29
+ "./testing": {
30
+ "types": "./dist/testing.d.ts",
31
+ "react-native": "./dist/testing.js",
32
+ "default": "./dist/testing.js"
28
33
  }
29
34
  },
30
35
  "files": [