@juzi/wechaty 1.0.146 → 1.0.147
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/cjs/src/mods/impls.d.ts +2 -2
- package/dist/cjs/src/mods/impls.d.ts.map +1 -1
- package/dist/cjs/src/mods/impls.js +2 -1
- package/dist/cjs/src/mods/impls.js.map +1 -1
- package/dist/cjs/src/mods/users.d.ts +2 -1
- package/dist/cjs/src/mods/users.d.ts.map +1 -1
- package/dist/cjs/src/package-json.js +4 -4
- package/dist/cjs/src/package-json.js.map +1 -1
- package/dist/cjs/src/schemas/call-events.d.ts +20 -0
- package/dist/cjs/src/schemas/call-events.d.ts.map +1 -0
- package/dist/cjs/src/schemas/call-events.js +7 -0
- package/dist/cjs/src/schemas/call-events.js.map +1 -0
- package/dist/cjs/src/schemas/mod.d.ts +3 -2
- package/dist/cjs/src/schemas/mod.d.ts.map +1 -1
- package/dist/cjs/src/schemas/mod.js +3 -1
- package/dist/cjs/src/schemas/mod.js.map +1 -1
- package/dist/cjs/src/schemas/wechaty-events.d.ts +23 -2
- package/dist/cjs/src/schemas/wechaty-events.d.ts.map +1 -1
- package/dist/cjs/src/schemas/wechaty-events.js +6 -0
- package/dist/cjs/src/schemas/wechaty-events.js.map +1 -1
- package/dist/cjs/src/user-modules/call.d.ts +158 -0
- package/dist/cjs/src/user-modules/call.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/call.js +289 -1
- package/dist/cjs/src/user-modules/call.js.map +1 -1
- package/dist/cjs/src/user-modules/call.spec.d.ts +7 -0
- package/dist/cjs/src/user-modules/call.spec.d.ts.map +1 -0
- package/dist/cjs/src/user-modules/call.spec.js +759 -0
- package/dist/cjs/src/user-modules/call.spec.js.map +1 -0
- package/dist/cjs/src/user-modules/contact.d.ts +16 -0
- package/dist/cjs/src/user-modules/contact.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/contact.js +16 -0
- package/dist/cjs/src/user-modules/contact.js.map +1 -1
- package/dist/cjs/src/user-modules/mod.d.ts +5 -4
- package/dist/cjs/src/user-modules/mod.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/mod.js +2 -1
- package/dist/cjs/src/user-modules/mod.js.map +1 -1
- package/dist/cjs/src/wechaty/wechaty-base.d.ts +66 -7
- package/dist/cjs/src/wechaty/wechaty-base.d.ts.map +1 -1
- package/dist/cjs/src/wechaty/wechaty-base.js +28 -0
- package/dist/cjs/src/wechaty/wechaty-base.js.map +1 -1
- package/dist/cjs/src/wechaty/wechaty-impl.spec.js +10 -8
- package/dist/cjs/src/wechaty/wechaty-impl.spec.js.map +1 -1
- package/dist/cjs/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
- package/dist/cjs/src/wechaty-mixins/io-mixin.d.ts +2 -2
- package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts +15 -5
- package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts +15 -5
- package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts +32 -6
- package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts +39 -5
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.js +149 -0
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.js.map +1 -1
- package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +5 -3
- package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.js +3 -0
- package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.js.map +1 -1
- package/dist/esm/src/mods/impls.d.ts +2 -2
- package/dist/esm/src/mods/impls.d.ts.map +1 -1
- package/dist/esm/src/mods/impls.js +1 -1
- package/dist/esm/src/mods/impls.js.map +1 -1
- package/dist/esm/src/mods/users.d.ts +2 -1
- package/dist/esm/src/mods/users.d.ts.map +1 -1
- package/dist/esm/src/package-json.js +4 -4
- package/dist/esm/src/package-json.js.map +1 -1
- package/dist/esm/src/schemas/call-events.d.ts +20 -0
- package/dist/esm/src/schemas/call-events.d.ts.map +1 -0
- package/dist/esm/src/schemas/call-events.js +4 -0
- package/dist/esm/src/schemas/call-events.js.map +1 -0
- package/dist/esm/src/schemas/mod.d.ts +3 -2
- package/dist/esm/src/schemas/mod.d.ts.map +1 -1
- package/dist/esm/src/schemas/mod.js +2 -1
- package/dist/esm/src/schemas/mod.js.map +1 -1
- package/dist/esm/src/schemas/wechaty-events.d.ts +23 -2
- package/dist/esm/src/schemas/wechaty-events.d.ts.map +1 -1
- package/dist/esm/src/schemas/wechaty-events.js +6 -0
- package/dist/esm/src/schemas/wechaty-events.js.map +1 -1
- package/dist/esm/src/user-modules/call.d.ts +158 -0
- package/dist/esm/src/user-modules/call.d.ts.map +1 -1
- package/dist/esm/src/user-modules/call.js +289 -1
- package/dist/esm/src/user-modules/call.js.map +1 -1
- package/dist/esm/src/user-modules/call.spec.d.ts +7 -0
- package/dist/esm/src/user-modules/call.spec.d.ts.map +1 -0
- package/dist/esm/src/user-modules/call.spec.js +734 -0
- package/dist/esm/src/user-modules/call.spec.js.map +1 -0
- package/dist/esm/src/user-modules/contact.d.ts +16 -0
- package/dist/esm/src/user-modules/contact.d.ts.map +1 -1
- package/dist/esm/src/user-modules/contact.js +16 -0
- package/dist/esm/src/user-modules/contact.js.map +1 -1
- package/dist/esm/src/user-modules/mod.d.ts +5 -4
- package/dist/esm/src/user-modules/mod.d.ts.map +1 -1
- package/dist/esm/src/user-modules/mod.js +2 -2
- package/dist/esm/src/user-modules/mod.js.map +1 -1
- package/dist/esm/src/wechaty/wechaty-base.d.ts +66 -7
- package/dist/esm/src/wechaty/wechaty-base.d.ts.map +1 -1
- package/dist/esm/src/wechaty/wechaty-base.js +28 -0
- package/dist/esm/src/wechaty/wechaty-base.js.map +1 -1
- package/dist/esm/src/wechaty/wechaty-impl.spec.js +10 -8
- package/dist/esm/src/wechaty/wechaty-impl.spec.js.map +1 -1
- package/dist/esm/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
- package/dist/esm/src/wechaty-mixins/io-mixin.d.ts +2 -2
- package/dist/esm/src/wechaty-mixins/login-mixin.d.ts +15 -5
- package/dist/esm/src/wechaty-mixins/login-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts +15 -5
- package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts +32 -6
- package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts +39 -5
- package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/puppet-mixin.js +149 -0
- package/dist/esm/src/wechaty-mixins/puppet-mixin.js.map +1 -1
- package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +5 -3
- package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.js +4 -1
- package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.js.map +1 -1
- package/package.json +3 -3
- package/src/mods/impls.ts +2 -0
- package/src/mods/users.ts +6 -0
- package/src/package-json.ts +4 -4
- package/src/schemas/call-events.ts +35 -0
- package/src/schemas/mod.ts +6 -0
- package/src/schemas/wechaty-events.ts +28 -0
- package/src/user-modules/call.spec.ts +929 -0
- package/src/user-modules/call.ts +373 -0
- package/src/user-modules/contact.ts +18 -0
- package/src/user-modules/mod.ts +11 -0
- package/src/wechaty/wechaty-base.ts +40 -1
- package/src/wechaty/wechaty-impl.spec.ts +4 -0
- package/src/wechaty-mixins/puppet-mixin.ts +184 -0
- package/src/wechaty-mixins/wechatify-user-module-mixin.ts +6 -0
|
@@ -23,11 +23,299 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.CallRecordImpl = void 0;
|
|
26
|
+
exports.CallRecordImpl = exports.CallImpl = void 0;
|
|
27
27
|
const PUPPET = __importStar(require("@juzi/wechaty-puppet"));
|
|
28
28
|
const config_js_1 = require("../config.js");
|
|
29
29
|
const validation_js_1 = require("../user-mixins/validation.js");
|
|
30
30
|
const wechatify_js_1 = require("../user-mixins/wechatify.js");
|
|
31
|
+
const call_events_js_1 = require("../schemas/call-events.js");
|
|
32
|
+
const CallMixinBase = (0, wechatify_js_1.wechatifyMixin)(call_events_js_1.CallEventEmitter);
|
|
33
|
+
/**
|
|
34
|
+
* Call – a live, stateful call-control session abstraction.
|
|
35
|
+
*
|
|
36
|
+
* A Call is a first-class citizen alongside Message and Contact.
|
|
37
|
+
* It models the signaling lifecycle of a call (not the media connection itself;
|
|
38
|
+
* media runs through a direct gateway link addressed by callId).
|
|
39
|
+
*
|
|
40
|
+
* Outgoing: obtain via `bot.call([contact, ...])` or `contact.call()`.
|
|
41
|
+
* Incoming: received as the argument of the `bot.on('call', …)` event.
|
|
42
|
+
*
|
|
43
|
+
* State (media, roster, lifecycle timestamps) is hydrated from the puppet via
|
|
44
|
+
* `ready()` / `sync()`. The dirty stream (`Dirty.Call`) drives cache invalidation.
|
|
45
|
+
*/
|
|
46
|
+
class CallMixin extends CallMixinBase {
|
|
47
|
+
id;
|
|
48
|
+
__direction;
|
|
49
|
+
__status;
|
|
50
|
+
__payload;
|
|
51
|
+
__endedEmitted = false;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
super();
|
|
54
|
+
this.id = options.id;
|
|
55
|
+
this.__direction = options.direction;
|
|
56
|
+
this.__status = options.status ?? (options.direction === 'outgoing' ? 'calling' : 'ringing');
|
|
57
|
+
config_js_1.log.verbose('Call', 'constructor(%s, dir=%s, status=%s)', this.id, this.__direction, this.__status);
|
|
58
|
+
}
|
|
59
|
+
direction() { return this.__direction; }
|
|
60
|
+
status() { return this.__status; }
|
|
61
|
+
/**
|
|
62
|
+
* The media type of the call (audio | video).
|
|
63
|
+
* Requires the payload to be hydrated; throws otherwise.
|
|
64
|
+
*/
|
|
65
|
+
media() {
|
|
66
|
+
if (!this.__payload) {
|
|
67
|
+
throw new Error(`Call ${this.id} not ready: call ready() first`);
|
|
68
|
+
}
|
|
69
|
+
return this.__payload.media;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* When the call was initiated (protocol-side clock).
|
|
73
|
+
* Requires the payload to be hydrated; throws otherwise.
|
|
74
|
+
*/
|
|
75
|
+
startTime() {
|
|
76
|
+
if (!this.__payload) {
|
|
77
|
+
throw new Error(`Call ${this.id} not ready: call ready() first`);
|
|
78
|
+
}
|
|
79
|
+
return new Date(this.__payload.startTime);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* When the call terminated. Becomes defined once a dirty refresh observes
|
|
83
|
+
* the protocol-side endTime; returns undefined while the call is live.
|
|
84
|
+
*/
|
|
85
|
+
endTime() {
|
|
86
|
+
if (!this.__payload?.endTime) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return new Date(this.__payload.endTime);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The participant who started the call. Returns undefined when the protocol
|
|
93
|
+
* payload does not identify a starter (rare; defensive).
|
|
94
|
+
*/
|
|
95
|
+
async starter() {
|
|
96
|
+
if (!this.__payload) {
|
|
97
|
+
await this.ready();
|
|
98
|
+
}
|
|
99
|
+
const starterId = this.__payload.starter;
|
|
100
|
+
if (!starterId) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
return this.wechaty.Contact.find({ id: starterId });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Current participant roster. The list is maintained server-side and refreshed
|
|
107
|
+
* via the dirty mechanism; consumers should expect this to change between calls.
|
|
108
|
+
*/
|
|
109
|
+
async participants() {
|
|
110
|
+
if (!this.__payload) {
|
|
111
|
+
await this.ready();
|
|
112
|
+
}
|
|
113
|
+
const found = await Promise.all(this.__payload.participants.map(id => this.wechaty.Contact.find({ id })));
|
|
114
|
+
return found.filter((c) => !!c);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Hydrate the call payload from the puppet. A no-op if already hydrated
|
|
118
|
+
* unless `forceSync` is true.
|
|
119
|
+
*/
|
|
120
|
+
async ready(forceSync = false) {
|
|
121
|
+
if (!forceSync && this.__payload) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.__payload = await this.wechaty.puppet.callPayload(this.id);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Force-invalidate the cached payload and re-pull it. Used after a dirty
|
|
128
|
+
* signal or when the local view is suspected to be stale.
|
|
129
|
+
*/
|
|
130
|
+
async sync() {
|
|
131
|
+
await this.wechaty.puppet.callPayloadDirty(this.id);
|
|
132
|
+
await this.ready(true);
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Control methods
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* Accept an incoming call. Only valid when direction=incoming, status=ringing.
|
|
139
|
+
*/
|
|
140
|
+
async accept() {
|
|
141
|
+
if (this.__direction !== 'incoming' || this.__status !== 'ringing') {
|
|
142
|
+
throw new Error(`Call.accept() invalid: direction=${this.__direction}, status=${this.__status}. `
|
|
143
|
+
+ 'Only valid for incoming calls in ringing state.');
|
|
144
|
+
}
|
|
145
|
+
await this.wechaty.puppet.callAccept(this.id);
|
|
146
|
+
this.__transitionTo('connected');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Reject an incoming call. Only valid when direction=incoming, status=ringing.
|
|
150
|
+
* Local state transitions to 'ended' regardless of whether the protocol
|
|
151
|
+
* acknowledgement reaches the peer.
|
|
152
|
+
*/
|
|
153
|
+
async reject(reason) {
|
|
154
|
+
if (this.__direction !== 'incoming' || this.__status !== 'ringing') {
|
|
155
|
+
throw new Error(`Call.reject() invalid: direction=${this.__direction}, status=${this.__status}. `
|
|
156
|
+
+ 'Only valid for incoming calls in ringing state.');
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
await this.wechaty.puppet.callReject(this.id, reason);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
this.__finalize();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Cancel an outgoing call before it is connected.
|
|
167
|
+
* Only valid when direction=outgoing and status is calling or ringing.
|
|
168
|
+
*/
|
|
169
|
+
async cancel() {
|
|
170
|
+
if (this.__direction !== 'outgoing') {
|
|
171
|
+
throw new Error(`Call.cancel() invalid: direction=${this.__direction}. `
|
|
172
|
+
+ 'Only valid for outgoing calls.');
|
|
173
|
+
}
|
|
174
|
+
if (this.__status !== 'calling' && this.__status !== 'ringing') {
|
|
175
|
+
throw new Error(`Call.cancel() invalid: status=${this.__status}. `
|
|
176
|
+
+ 'Only valid when status is calling or ringing.');
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
await this.wechaty.puppet.callCancel(this.id);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
this.__finalize();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Hang up a connected call. Only valid when status=connected.
|
|
187
|
+
*/
|
|
188
|
+
async hangup(reason) {
|
|
189
|
+
if (this.__status !== 'connected') {
|
|
190
|
+
throw new Error(`Call.hangup() invalid: status=${this.__status}. `
|
|
191
|
+
+ 'Only valid for connected calls.');
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
await this.wechaty.puppet.callHangup(this.id, reason);
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
this.__finalize();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Invite additional contacts to a live call (group-call growth).
|
|
202
|
+
*/
|
|
203
|
+
async add(contacts) {
|
|
204
|
+
if (this.__status === 'ended') {
|
|
205
|
+
throw new Error('Call.add() invalid: status=ended. Cannot add to a finished call.');
|
|
206
|
+
}
|
|
207
|
+
if (contacts.length === 0) {
|
|
208
|
+
throw new Error('Call.add() requires at least one contact.');
|
|
209
|
+
}
|
|
210
|
+
await this.wechaty.puppet.callAdd(this.id, contacts.map(c => c.id));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Pull a fresh admission ticket to the direct-to-gateway media path.
|
|
214
|
+
* Not cached: the credential is short-lived and may pre-allocate a session.
|
|
215
|
+
*/
|
|
216
|
+
async mediaEndpoint() {
|
|
217
|
+
return this.wechaty.puppet.callMediaEndpoint(this.id);
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Framework-internal — must not be called from user code.
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
/**
|
|
223
|
+
* Process an inbound call signal from the puppet layer.
|
|
224
|
+
* Drives state transitions and emits the corresponding object-level event.
|
|
225
|
+
* Terminal lifecycle (ended) is owned by the puppet-mixin which calls
|
|
226
|
+
* `__markEnded()` after observing the protocol-side endTime.
|
|
227
|
+
*/
|
|
228
|
+
__handleSignal(signal, actor, reason) {
|
|
229
|
+
if (this.__status === 'ended') {
|
|
230
|
+
config_js_1.log.warn('Call', '__handleSignal(%s) ignored in ended state for callId=%s', signal, this.id);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
switch (signal) {
|
|
234
|
+
case PUPPET.types.CallSignal.Ringing:
|
|
235
|
+
if (this.__direction === 'outgoing' && this.__status === 'calling') {
|
|
236
|
+
this.__transitionTo('ringing');
|
|
237
|
+
this.emit('ringing');
|
|
238
|
+
}
|
|
239
|
+
break;
|
|
240
|
+
case PUPPET.types.CallSignal.Accept:
|
|
241
|
+
if (this.__status === 'calling' || this.__status === 'ringing') {
|
|
242
|
+
this.__transitionTo('connected');
|
|
243
|
+
}
|
|
244
|
+
this.emit('accept', actor);
|
|
245
|
+
break;
|
|
246
|
+
// Reject/Hangup emit BEFORE puppet-mixin's post-handler finalize, so
|
|
247
|
+
// consumers' handlers observe pre-terminal status. This is safe here
|
|
248
|
+
// because the callable terminal actions throw under their own guards at
|
|
249
|
+
// this moment (accept needs ringing, cancel needs calling/ringing,
|
|
250
|
+
// hangup needs connected). The Cancel case below is the asymmetric
|
|
251
|
+
// outlier: it MUST finalize first to close a media-acquisition race
|
|
252
|
+
// window on the receiving side.
|
|
253
|
+
case PUPPET.types.CallSignal.Reject:
|
|
254
|
+
this.emit('reject', actor, reason);
|
|
255
|
+
break;
|
|
256
|
+
case PUPPET.types.CallSignal.Hangup:
|
|
257
|
+
this.emit('hangup', actor, reason);
|
|
258
|
+
break;
|
|
259
|
+
case PUPPET.types.CallSignal.Cancel:
|
|
260
|
+
// Intentionally finalizes before emitting 'cancel' so consumers'
|
|
261
|
+
// cancel handler observes status === 'ended' synchronously. Cancel
|
|
262
|
+
// signals are always terminal on the receiving side (the caller has
|
|
263
|
+
// withdrawn), so the status flip should be visible to listeners
|
|
264
|
+
// before the descriptor event fires. The reverse order would let a
|
|
265
|
+
// cancel handler observe status === 'ringing' and, worse, call
|
|
266
|
+
// .accept() through the ringing guard before the puppet-mixin's
|
|
267
|
+
// post-emit finalize runs.
|
|
268
|
+
this.__finalize();
|
|
269
|
+
this.emit('cancel', reason);
|
|
270
|
+
break;
|
|
271
|
+
default:
|
|
272
|
+
config_js_1.log.warn('Call', '__handleSignal() unhandled signal: %s', signal);
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Force the call into the ended terminal state and emit 'ended'.
|
|
278
|
+
* Called by puppet-mixin after the protocol-side endTime is observed.
|
|
279
|
+
* Kept as a named entry point distinct from {@link __finalize} so the
|
|
280
|
+
* puppet-mixin surface reads as intent ("the protocol says this is over").
|
|
281
|
+
* Idempotent via __finalize.
|
|
282
|
+
*/
|
|
283
|
+
__markEnded() {
|
|
284
|
+
this.__finalize();
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Single chokepoint for ending a call: flip the status to ended, emit
|
|
288
|
+
* the object-level 'ended' event, emit the bot-level 'call-ended' lifecycle
|
|
289
|
+
* event, and evict the call from the wechaty pool. Guarded by
|
|
290
|
+
* `__endedEmitted` so that overlapping local-control and puppet-echo paths
|
|
291
|
+
* cannot double-emit or double-evict.
|
|
292
|
+
*
|
|
293
|
+
* Why both event tiers fire here: 'call-ended' is a terminal lifecycle event
|
|
294
|
+
* (not an action event like 'call-reject'/'call-hangup'), and is independent
|
|
295
|
+
* of who initiated the termination. Local control paths (reject/cancel/
|
|
296
|
+
* hangup) and remote-driven paths (puppet signal echo via __finalizeIfEnded)
|
|
297
|
+
* must both surface it.
|
|
298
|
+
*/
|
|
299
|
+
__finalize() {
|
|
300
|
+
if (this.__endedEmitted) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
this.__endedEmitted = true;
|
|
304
|
+
this.__transitionTo('ended');
|
|
305
|
+
this.emit('ended');
|
|
306
|
+
this.wechaty.emit('call-ended', this);
|
|
307
|
+
this.wechaty.__callPool?.delete(this.id);
|
|
308
|
+
}
|
|
309
|
+
__transitionTo(nextStatus) {
|
|
310
|
+
config_js_1.log.verbose('Call', '__transitionTo(%s) from %s', nextStatus, this.__status);
|
|
311
|
+
this.__status = nextStatus;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
class CallImplBase extends (0, validation_js_1.validationMixin)(CallMixin)() {
|
|
315
|
+
}
|
|
316
|
+
class CallImpl extends (0, validation_js_1.validationMixin)(CallImplBase)() {
|
|
317
|
+
}
|
|
318
|
+
exports.CallImpl = CallImpl;
|
|
31
319
|
class CallRecordMixin extends (0, wechatify_js_1.wechatifyMixinBase)() {
|
|
32
320
|
payload;
|
|
33
321
|
static async create() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAG9C,4CAAkC;AAElC,gEAA8D;AAE9D,
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAG9C,4CAAkC;AAElC,gEAA8D;AAE9D,8DAGoC;AACpC,8DAA4D;AAmB5D,MAAM,aAAa,GAAG,IAAA,6BAAc,EAAC,iCAAgB,CAAC,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,SAAU,SAAQ,aAAa;IAE1B,EAAE,CAAS;IAEZ,WAAW,CAAmB;IAC9B,QAAQ,CAAmB;IAC3B,SAAS,CAA4B;IACrC,cAAc,GAAG,KAAK,CAAA;IAE9B,YAAa,OAA+B;QAC1C,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,EAAE,GAAY,OAAO,CAAC,EAAE,CAAA;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAA;QACpC,IAAI,CAAC,QAAQ,GAAM,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAE/F,eAAG,CAAC,OAAO,CAAC,MAAM,EAAE,oCAAoC,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrG,CAAC;IAED,SAAS,KAAqB,OAAO,IAAI,CAAC,WAAW,CAAA,CAAC,CAAC;IACvD,MAAM,KAAwB,OAAO,IAAI,CAAC,QAAQ,CAAA,CAAC,CAAC;IAEpD;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,gCAAgC,CAAC,CAAA;SACjE;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAA;IAC7B,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,gCAAgC,CAAC,CAAA;SACjE;QACD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC3C,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YAC5B,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;SACnB;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAU,CAAC,OAAO,CAAA;QACzC,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,SAAS,CAAA;SACjB;QACD,OAAQ,IAAI,CAAC,OAAO,CAAC,OAA8B,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;SACnB;QACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,IAAI,CAAC,SAAU,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,IAAI,CAAC,OAAO,CAAC,OAA8B,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAClG,CAAA;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAE,SAAS,GAAG,KAAK;QAC5B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YAChC,OAAM;SACP;QACD,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAClE,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,WAAW,YAAY,IAAI,CAAC,QAAQ,IAAI;kBAC/E,iDAAiD,CACpD,CAAA;SACF;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAE,MAAe;QAC3B,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAClE,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,WAAW,YAAY,IAAI,CAAC,QAAQ,IAAI;kBAC/E,iDAAiD,CACpD,CAAA;SACF;QACD,IAAI;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;SACtD;gBAAS;YACR,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE;YACnC,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,WAAW,IAAI;kBACtD,gCAAgC,CACnC,CAAA;SACF;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC9D,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,QAAQ,IAAI;kBAChD,+CAA+C,CAClD,CAAA;SACF;QACD,IAAI;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SAC9C;gBAAS;YACR,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAE,MAAe;QAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE;YACjC,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,QAAQ,IAAI;kBAChD,iCAAiC,CACpC,CAAA;SACF;QACD,IAAI;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;SACtD;gBAAS;YACR,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAE,QAA4B;QACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;SACpF;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;SAC7D;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,8EAA8E;IAC9E,0DAA0D;IAC1D,8EAA8E;IAE9E;;;;;OAKG;IACH,cAAc,CACZ,MAA+B,EAC/B,KAAuB,EACvB,MAAe;QAEf,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;YAC7B,eAAG,CAAC,IAAI,CAAC,MAAM,EAAE,yDAAyD,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;YAC5F,OAAM;SACP;QAED,QAAQ,MAAM,EAAE;YACd,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO;gBAClC,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;oBAClE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;oBAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;iBACrB;gBACD,MAAK;YAEP,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;gBACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;oBAC9D,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;iBACjC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;gBAC1B,MAAK;YAEP,qEAAqE;YACrE,qEAAqE;YACrE,wEAAwE;YACxE,mEAAmE;YACnE,mEAAmE;YACnE,oEAAoE;YACpE,gCAAgC;YAChC,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;gBACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;gBAClC,MAAK;YAEP,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;gBACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;gBAClC,MAAK;YAEP,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;gBACjC,iEAAiE;gBACjE,mEAAmE;gBACnE,oEAAoE;gBACpE,gEAAgE;gBAChE,mEAAmE;gBACnE,+DAA+D;gBAC/D,gEAAgE;gBAChE,2BAA2B;gBAC3B,IAAI,CAAC,UAAU,EAAE,CAAA;gBACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3B,MAAK;YAEP;gBACE,eAAG,CAAC,IAAI,CAAC,MAAM,EAAE,uCAAuC,EAAE,MAAM,CAAC,CAAA;gBACjE,MAAK;SACR;IACH,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,UAAU;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,OAAM;SACP;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CACjB;QAAC,IAAI,CAAC,OAAe,CAAC,IAAI,CAAC,YAAY,EAAE,IAAgC,CAAC,CAC1E;QAAC,IAAI,CAAC,OAAe,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpD,CAAC;IAEO,cAAc,CAAE,UAAsB;QAC5C,eAAG,CAAC,OAAO,CAAC,MAAM,EAAE,4BAA4B,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5E,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAA;IAC5B,CAAC;CAEF;AAED,MAAM,YAAa,SAAQ,IAAA,+BAAe,EAAC,SAAS,CAAC,EAAqB;CAAG;AAU7E,MAAM,QAAS,SAAQ,IAAA,+BAAe,EAAC,YAAY,CAAC,EAAiB;CAAG;AAatE,4BAAQ;AAGV,MAAM,eAAgB,SAAQ,IAAA,iCAAkB,GAAE;IAoB5B;IAlBpB,MAAM,CAAC,KAAK,CAAC,MAAM;QACjB,eAAG,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;QAErC,MAAM,OAAO,GAA+B;YAC1C,OAAO,EAAE,MAAM;YACf,YAAY,EAAE,CAAE,MAAM,CAAE;YACxB,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;SACV,CAAA;QAED,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,YACoB,OAAmC;QAErD,KAAK,EAAE,CAAA;QAFW,YAAO,GAAP,OAAO,CAA4B;QAGrD,eAAG,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;QACtC,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,SAAS,CAAA;SACjB;QACD,MAAM,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC,OAA8B,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QACpF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAA;QAEhD,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,OAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QACxH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;QAEnD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAuB,CAAA;IAC9D,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAA;IACvD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAA;IAC/D,CAAC;CAEF;AAED,MAAM,cAAe,SAAQ,IAAA,+BAAe,EAAC,eAAe,CAAC,EAAuB;CAAI;AAatF,wCAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.spec.d.ts","sourceRoot":"","sources":["../../../../src/user-modules/call.spec.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|