@juzi/wechaty 1.0.146 → 1.0.148

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.
Files changed (131) hide show
  1. package/dist/cjs/src/mods/impls.d.ts +2 -2
  2. package/dist/cjs/src/mods/impls.d.ts.map +1 -1
  3. package/dist/cjs/src/mods/impls.js +2 -1
  4. package/dist/cjs/src/mods/impls.js.map +1 -1
  5. package/dist/cjs/src/mods/users.d.ts +2 -1
  6. package/dist/cjs/src/mods/users.d.ts.map +1 -1
  7. package/dist/cjs/src/package-json.js +4 -4
  8. package/dist/cjs/src/package-json.js.map +1 -1
  9. package/dist/cjs/src/schemas/call-events.d.ts +20 -0
  10. package/dist/cjs/src/schemas/call-events.d.ts.map +1 -0
  11. package/dist/cjs/src/schemas/call-events.js +7 -0
  12. package/dist/cjs/src/schemas/call-events.js.map +1 -0
  13. package/dist/cjs/src/schemas/mod.d.ts +3 -2
  14. package/dist/cjs/src/schemas/mod.d.ts.map +1 -1
  15. package/dist/cjs/src/schemas/mod.js +3 -1
  16. package/dist/cjs/src/schemas/mod.js.map +1 -1
  17. package/dist/cjs/src/schemas/wechaty-events.d.ts +23 -2
  18. package/dist/cjs/src/schemas/wechaty-events.d.ts.map +1 -1
  19. package/dist/cjs/src/schemas/wechaty-events.js +6 -0
  20. package/dist/cjs/src/schemas/wechaty-events.js.map +1 -1
  21. package/dist/cjs/src/user-modules/call.d.ts +158 -0
  22. package/dist/cjs/src/user-modules/call.d.ts.map +1 -1
  23. package/dist/cjs/src/user-modules/call.js +289 -1
  24. package/dist/cjs/src/user-modules/call.js.map +1 -1
  25. package/dist/cjs/src/user-modules/call.spec.d.ts +7 -0
  26. package/dist/cjs/src/user-modules/call.spec.d.ts.map +1 -0
  27. package/dist/cjs/src/user-modules/call.spec.js +759 -0
  28. package/dist/cjs/src/user-modules/call.spec.js.map +1 -0
  29. package/dist/cjs/src/user-modules/contact.d.ts +16 -0
  30. package/dist/cjs/src/user-modules/contact.d.ts.map +1 -1
  31. package/dist/cjs/src/user-modules/contact.js +16 -0
  32. package/dist/cjs/src/user-modules/contact.js.map +1 -1
  33. package/dist/cjs/src/user-modules/mod.d.ts +5 -4
  34. package/dist/cjs/src/user-modules/mod.d.ts.map +1 -1
  35. package/dist/cjs/src/user-modules/mod.js +2 -1
  36. package/dist/cjs/src/user-modules/mod.js.map +1 -1
  37. package/dist/cjs/src/wechaty/wechaty-base.d.ts +66 -7
  38. package/dist/cjs/src/wechaty/wechaty-base.d.ts.map +1 -1
  39. package/dist/cjs/src/wechaty/wechaty-base.js +28 -0
  40. package/dist/cjs/src/wechaty/wechaty-base.js.map +1 -1
  41. package/dist/cjs/src/wechaty/wechaty-impl.spec.js +10 -8
  42. package/dist/cjs/src/wechaty/wechaty-impl.spec.js.map +1 -1
  43. package/dist/cjs/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
  44. package/dist/cjs/src/wechaty-mixins/io-mixin.d.ts +2 -2
  45. package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts +15 -5
  46. package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts.map +1 -1
  47. package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts +15 -5
  48. package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts.map +1 -1
  49. package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts +32 -6
  50. package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts.map +1 -1
  51. package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts +39 -5
  52. package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
  53. package/dist/cjs/src/wechaty-mixins/puppet-mixin.js +149 -0
  54. package/dist/cjs/src/wechaty-mixins/puppet-mixin.js.map +1 -1
  55. package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +5 -3
  56. package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts.map +1 -1
  57. package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.js +3 -0
  58. package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.js.map +1 -1
  59. package/dist/esm/src/mods/impls.d.ts +2 -2
  60. package/dist/esm/src/mods/impls.d.ts.map +1 -1
  61. package/dist/esm/src/mods/impls.js +1 -1
  62. package/dist/esm/src/mods/impls.js.map +1 -1
  63. package/dist/esm/src/mods/users.d.ts +2 -1
  64. package/dist/esm/src/mods/users.d.ts.map +1 -1
  65. package/dist/esm/src/package-json.js +4 -4
  66. package/dist/esm/src/package-json.js.map +1 -1
  67. package/dist/esm/src/schemas/call-events.d.ts +20 -0
  68. package/dist/esm/src/schemas/call-events.d.ts.map +1 -0
  69. package/dist/esm/src/schemas/call-events.js +4 -0
  70. package/dist/esm/src/schemas/call-events.js.map +1 -0
  71. package/dist/esm/src/schemas/mod.d.ts +3 -2
  72. package/dist/esm/src/schemas/mod.d.ts.map +1 -1
  73. package/dist/esm/src/schemas/mod.js +2 -1
  74. package/dist/esm/src/schemas/mod.js.map +1 -1
  75. package/dist/esm/src/schemas/wechaty-events.d.ts +23 -2
  76. package/dist/esm/src/schemas/wechaty-events.d.ts.map +1 -1
  77. package/dist/esm/src/schemas/wechaty-events.js +6 -0
  78. package/dist/esm/src/schemas/wechaty-events.js.map +1 -1
  79. package/dist/esm/src/user-modules/call.d.ts +158 -0
  80. package/dist/esm/src/user-modules/call.d.ts.map +1 -1
  81. package/dist/esm/src/user-modules/call.js +289 -1
  82. package/dist/esm/src/user-modules/call.js.map +1 -1
  83. package/dist/esm/src/user-modules/call.spec.d.ts +7 -0
  84. package/dist/esm/src/user-modules/call.spec.d.ts.map +1 -0
  85. package/dist/esm/src/user-modules/call.spec.js +734 -0
  86. package/dist/esm/src/user-modules/call.spec.js.map +1 -0
  87. package/dist/esm/src/user-modules/contact.d.ts +16 -0
  88. package/dist/esm/src/user-modules/contact.d.ts.map +1 -1
  89. package/dist/esm/src/user-modules/contact.js +16 -0
  90. package/dist/esm/src/user-modules/contact.js.map +1 -1
  91. package/dist/esm/src/user-modules/mod.d.ts +5 -4
  92. package/dist/esm/src/user-modules/mod.d.ts.map +1 -1
  93. package/dist/esm/src/user-modules/mod.js +2 -2
  94. package/dist/esm/src/user-modules/mod.js.map +1 -1
  95. package/dist/esm/src/wechaty/wechaty-base.d.ts +66 -7
  96. package/dist/esm/src/wechaty/wechaty-base.d.ts.map +1 -1
  97. package/dist/esm/src/wechaty/wechaty-base.js +28 -0
  98. package/dist/esm/src/wechaty/wechaty-base.js.map +1 -1
  99. package/dist/esm/src/wechaty/wechaty-impl.spec.js +10 -8
  100. package/dist/esm/src/wechaty/wechaty-impl.spec.js.map +1 -1
  101. package/dist/esm/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
  102. package/dist/esm/src/wechaty-mixins/io-mixin.d.ts +2 -2
  103. package/dist/esm/src/wechaty-mixins/login-mixin.d.ts +15 -5
  104. package/dist/esm/src/wechaty-mixins/login-mixin.d.ts.map +1 -1
  105. package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts +15 -5
  106. package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts.map +1 -1
  107. package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts +32 -6
  108. package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts.map +1 -1
  109. package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts +39 -5
  110. package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
  111. package/dist/esm/src/wechaty-mixins/puppet-mixin.js +149 -0
  112. package/dist/esm/src/wechaty-mixins/puppet-mixin.js.map +1 -1
  113. package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +5 -3
  114. package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts.map +1 -1
  115. package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.js +4 -1
  116. package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.js.map +1 -1
  117. package/package.json +3 -3
  118. package/src/mods/impls.ts +2 -0
  119. package/src/mods/users.ts +6 -0
  120. package/src/package-json.ts +4 -4
  121. package/src/schemas/call-events.ts +35 -0
  122. package/src/schemas/mod.ts +6 -0
  123. package/src/schemas/wechaty-events.ts +28 -0
  124. package/src/user-modules/call.spec.ts +929 -0
  125. package/src/user-modules/call.ts +373 -0
  126. package/src/user-modules/contact.ts +18 -0
  127. package/src/user-modules/mod.ts +11 -0
  128. package/src/wechaty/wechaty-base.ts +40 -1
  129. package/src/wechaty/wechaty-impl.spec.ts +4 -0
  130. package/src/wechaty-mixins/puppet-mixin.ts +184 -0
  131. package/src/wechaty-mixins/wechatify-user-module-mixin.ts +6 -0
@@ -1,6 +1,164 @@
1
1
  import * as PUPPET from '@juzi/wechaty-puppet';
2
2
  import type { Constructor } from 'clone-class';
3
3
  import type { ContactInterface } from './contact.js';
4
+ /**
5
+ * Lifecycle status of a call session as seen from this side.
6
+ *
7
+ * Intentionally defined here (not in wechaty-puppet) because the puppet's
8
+ * `CallStatus` enum is already occupied by the call-record domain.
9
+ */
10
+ export declare type CallStatus = 'calling' | 'ringing' | 'connected' | 'ended';
11
+ export declare type CallDirection = 'outgoing' | 'incoming';
12
+ interface CallConstructorOptions {
13
+ readonly id: string;
14
+ readonly direction: CallDirection;
15
+ /** If omitted the status is derived: outgoing → calling, incoming → ringing */
16
+ readonly status?: CallStatus;
17
+ }
18
+ declare const CallMixinBase: ((abstract new (...args: any[]) => {
19
+ readonly wechaty: import("../wechaty/wechaty-impl.js").WechatyInterface;
20
+ }) & {
21
+ readonly wechaty: import("../wechaty/wechaty-impl.js").WechatyInterface;
22
+ }) & (new () => import("typed-emitter").default<import("../schemas/call-events.js").CallEventListeners>);
23
+ /**
24
+ * Call – a live, stateful call-control session abstraction.
25
+ *
26
+ * A Call is a first-class citizen alongside Message and Contact.
27
+ * It models the signaling lifecycle of a call (not the media connection itself;
28
+ * media runs through a direct gateway link addressed by callId).
29
+ *
30
+ * Outgoing: obtain via `bot.call([contact, ...])` or `contact.call()`.
31
+ * Incoming: received as the argument of the `bot.on('call', …)` event.
32
+ *
33
+ * State (media, roster, lifecycle timestamps) is hydrated from the puppet via
34
+ * `ready()` / `sync()`. The dirty stream (`Dirty.Call`) drives cache invalidation.
35
+ */
36
+ declare class CallMixin extends CallMixinBase {
37
+ readonly id: string;
38
+ private __direction;
39
+ private __status;
40
+ private __payload?;
41
+ private __endedEmitted;
42
+ constructor(options: CallConstructorOptions);
43
+ direction(): CallDirection;
44
+ status(): CallStatus;
45
+ /**
46
+ * The media type of the call (audio | video).
47
+ * Requires the payload to be hydrated; throws otherwise.
48
+ */
49
+ media(): PUPPET.types.CallMediaType;
50
+ /**
51
+ * When the call was initiated (protocol-side clock).
52
+ * Requires the payload to be hydrated; throws otherwise.
53
+ */
54
+ startTime(): Date;
55
+ /**
56
+ * When the call terminated. Becomes defined once a dirty refresh observes
57
+ * the protocol-side endTime; returns undefined while the call is live.
58
+ */
59
+ endTime(): Date | undefined;
60
+ /**
61
+ * The participant who started the call. Returns undefined when the protocol
62
+ * payload does not identify a starter (rare; defensive).
63
+ */
64
+ starter(): Promise<ContactInterface | undefined>;
65
+ /**
66
+ * Current participant roster. The list is maintained server-side and refreshed
67
+ * via the dirty mechanism; consumers should expect this to change between calls.
68
+ */
69
+ participants(): Promise<ContactInterface[]>;
70
+ /**
71
+ * Hydrate the call payload from the puppet. A no-op if already hydrated
72
+ * unless `forceSync` is true.
73
+ */
74
+ ready(forceSync?: boolean): Promise<void>;
75
+ /**
76
+ * Force-invalidate the cached payload and re-pull it. Used after a dirty
77
+ * signal or when the local view is suspected to be stale.
78
+ */
79
+ sync(): Promise<void>;
80
+ /**
81
+ * Accept an incoming call. Only valid when direction=incoming, status=ringing.
82
+ */
83
+ accept(): Promise<void>;
84
+ /**
85
+ * Reject an incoming call. Only valid when direction=incoming, status=ringing.
86
+ * Local state transitions to 'ended' regardless of whether the protocol
87
+ * acknowledgement reaches the peer.
88
+ */
89
+ reject(reason?: string): Promise<void>;
90
+ /**
91
+ * Cancel an outgoing call before it is connected.
92
+ * Only valid when direction=outgoing and status is calling or ringing.
93
+ */
94
+ cancel(): Promise<void>;
95
+ /**
96
+ * Hang up a connected call. Only valid when status=connected.
97
+ */
98
+ hangup(reason?: string): Promise<void>;
99
+ /**
100
+ * Invite additional contacts to a live call (group-call growth).
101
+ */
102
+ add(contacts: ContactInterface[]): Promise<void>;
103
+ /**
104
+ * Pull a fresh admission ticket to the direct-to-gateway media path.
105
+ * Not cached: the credential is short-lived and may pre-allocate a session.
106
+ */
107
+ mediaEndpoint(): Promise<PUPPET.payloads.CallMediaEndpoint>;
108
+ /**
109
+ * Process an inbound call signal from the puppet layer.
110
+ * Drives state transitions and emits the corresponding object-level event.
111
+ * Terminal lifecycle (ended) is owned by the puppet-mixin which calls
112
+ * `__markEnded()` after observing the protocol-side endTime.
113
+ */
114
+ __handleSignal(signal: PUPPET.types.CallSignal, actor: ContactInterface, reason?: string): void;
115
+ /**
116
+ * Force the call into the ended terminal state and emit 'ended'.
117
+ * Called by puppet-mixin after the protocol-side endTime is observed.
118
+ * Kept as a named entry point distinct from {@link __finalize} so the
119
+ * puppet-mixin surface reads as intent ("the protocol says this is over").
120
+ * Idempotent via __finalize.
121
+ */
122
+ __markEnded(): void;
123
+ /**
124
+ * Single chokepoint for ending a call: flip the status to ended, emit
125
+ * the object-level 'ended' event, emit the bot-level 'call-ended' lifecycle
126
+ * event, and evict the call from the wechaty pool. Guarded by
127
+ * `__endedEmitted` so that overlapping local-control and puppet-echo paths
128
+ * cannot double-emit or double-evict.
129
+ *
130
+ * Why both event tiers fire here: 'call-ended' is a terminal lifecycle event
131
+ * (not an action event like 'call-reject'/'call-hangup'), and is independent
132
+ * of who initiated the termination. Local control paths (reject/cancel/
133
+ * hangup) and remote-driven paths (puppet signal echo via __finalizeIfEnded)
134
+ * must both surface it.
135
+ */
136
+ private __finalize;
137
+ private __transitionTo;
138
+ }
139
+ declare const CallImplBase_base: {
140
+ new (...args: any[]): {};
141
+ valid: (o: any) => o is CallImplInterface;
142
+ validInstance: (target: any) => target is CallMixin;
143
+ validInterface: (target: any) => target is CallImplInterface;
144
+ } & typeof CallMixin;
145
+ declare class CallImplBase extends CallImplBase_base {
146
+ }
147
+ interface CallImplInterface extends CallImplBase {
148
+ }
149
+ declare type CallProtectedProperty = '__handleSignal' | '__markEnded' | '__finalize' | '__endedEmitted';
150
+ declare type CallInterface = Omit<CallImplInterface, CallProtectedProperty>;
151
+ declare const CallImpl_base: {
152
+ new (...args: any[]): {};
153
+ valid: (o: any) => o is CallInterface;
154
+ validInstance: (target: any) => target is CallImplBase;
155
+ validInterface: (target: any) => target is CallInterface;
156
+ } & typeof CallImplBase;
157
+ declare class CallImpl extends CallImpl_base {
158
+ }
159
+ declare type CallConstructor = Constructor<CallInterface, typeof CallImpl>;
160
+ export type { CallConstructor, CallInterface, CallProtectedProperty, };
161
+ export { CallImpl, };
4
162
  declare const CallRecordMixin_base: ((abstract new (...args: any[]) => {
5
163
  readonly wechaty: import("../wechaty/wechaty-impl.js").WechatyInterface;
6
164
  }) & {
@@ -1 +1 @@
1
- {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAQ9C,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,cAAc,CAAA;;;;;;;;AAEjE,cAAM,eAAgB,SAAQ,oBAAoB;aAoB5B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;WAlB1C,MAAM,IAAK,OAAO,CAAC,mBAAmB,CAAC;gBAkBhC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;IAMjD,OAAO,IAAK,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC;IASjD,YAAY,IAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;IASlD,MAAM,IAAK,MAAM;IAIjB,IAAI,IAAK,MAAM,CAAC,KAAK,CAAC,IAAI;IAI1B,MAAM,IAAK,MAAM,CAAC,KAAK,CAAC,UAAU;CAInC;;;;;;;AAED,cAAM,cAAe,SAAQ,mBAAuD;CAAI;AACxF,UAAU,mBAAoB,SAAQ,cAAc;CAAI;AAExD,aAAK,qBAAqB,GAAG,WAAW,CACtC,mBAAmB,EACnB,OAAO,cAAc,CACtB,CAAA;AAED,YAAY,EACV,qBAAqB,EACrB,mBAAmB,GACpB,CAAA;AACD,OAAO,EACL,cAAc,GACf,CAAA"}
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,295 @@
1
1
  import * as PUPPET from '@juzi/wechaty-puppet';
2
2
  import { log } from '../config.js';
3
3
  import { validationMixin } from '../user-mixins/validation.js';
4
- import { wechatifyMixinBase, } from '../user-mixins/wechatify.js';
4
+ import { wechatifyMixin, wechatifyMixinBase, } from '../user-mixins/wechatify.js';
5
+ import { CallEventEmitter } from '../schemas/call-events.js';
6
+ const CallMixinBase = wechatifyMixin(CallEventEmitter);
7
+ /**
8
+ * Call – a live, stateful call-control session abstraction.
9
+ *
10
+ * A Call is a first-class citizen alongside Message and Contact.
11
+ * It models the signaling lifecycle of a call (not the media connection itself;
12
+ * media runs through a direct gateway link addressed by callId).
13
+ *
14
+ * Outgoing: obtain via `bot.call([contact, ...])` or `contact.call()`.
15
+ * Incoming: received as the argument of the `bot.on('call', …)` event.
16
+ *
17
+ * State (media, roster, lifecycle timestamps) is hydrated from the puppet via
18
+ * `ready()` / `sync()`. The dirty stream (`Dirty.Call`) drives cache invalidation.
19
+ */
20
+ class CallMixin extends CallMixinBase {
21
+ id;
22
+ __direction;
23
+ __status;
24
+ __payload;
25
+ __endedEmitted = false;
26
+ constructor(options) {
27
+ super();
28
+ this.id = options.id;
29
+ this.__direction = options.direction;
30
+ this.__status = options.status ?? (options.direction === 'outgoing' ? 'calling' : 'ringing');
31
+ log.verbose('Call', 'constructor(%s, dir=%s, status=%s)', this.id, this.__direction, this.__status);
32
+ }
33
+ direction() { return this.__direction; }
34
+ status() { return this.__status; }
35
+ /**
36
+ * The media type of the call (audio | video).
37
+ * Requires the payload to be hydrated; throws otherwise.
38
+ */
39
+ media() {
40
+ if (!this.__payload) {
41
+ throw new Error(`Call ${this.id} not ready: call ready() first`);
42
+ }
43
+ return this.__payload.media;
44
+ }
45
+ /**
46
+ * When the call was initiated (protocol-side clock).
47
+ * Requires the payload to be hydrated; throws otherwise.
48
+ */
49
+ startTime() {
50
+ if (!this.__payload) {
51
+ throw new Error(`Call ${this.id} not ready: call ready() first`);
52
+ }
53
+ return new Date(this.__payload.startTime);
54
+ }
55
+ /**
56
+ * When the call terminated. Becomes defined once a dirty refresh observes
57
+ * the protocol-side endTime; returns undefined while the call is live.
58
+ */
59
+ endTime() {
60
+ if (!this.__payload?.endTime) {
61
+ return undefined;
62
+ }
63
+ return new Date(this.__payload.endTime);
64
+ }
65
+ /**
66
+ * The participant who started the call. Returns undefined when the protocol
67
+ * payload does not identify a starter (rare; defensive).
68
+ */
69
+ async starter() {
70
+ if (!this.__payload) {
71
+ await this.ready();
72
+ }
73
+ const starterId = this.__payload.starter;
74
+ if (!starterId) {
75
+ return undefined;
76
+ }
77
+ return this.wechaty.Contact.find({ id: starterId });
78
+ }
79
+ /**
80
+ * Current participant roster. The list is maintained server-side and refreshed
81
+ * via the dirty mechanism; consumers should expect this to change between calls.
82
+ */
83
+ async participants() {
84
+ if (!this.__payload) {
85
+ await this.ready();
86
+ }
87
+ const found = await Promise.all(this.__payload.participants.map(id => this.wechaty.Contact.find({ id })));
88
+ return found.filter((c) => !!c);
89
+ }
90
+ /**
91
+ * Hydrate the call payload from the puppet. A no-op if already hydrated
92
+ * unless `forceSync` is true.
93
+ */
94
+ async ready(forceSync = false) {
95
+ if (!forceSync && this.__payload) {
96
+ return;
97
+ }
98
+ this.__payload = await this.wechaty.puppet.callPayload(this.id);
99
+ }
100
+ /**
101
+ * Force-invalidate the cached payload and re-pull it. Used after a dirty
102
+ * signal or when the local view is suspected to be stale.
103
+ */
104
+ async sync() {
105
+ await this.wechaty.puppet.callPayloadDirty(this.id);
106
+ await this.ready(true);
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Control methods
110
+ // ---------------------------------------------------------------------------
111
+ /**
112
+ * Accept an incoming call. Only valid when direction=incoming, status=ringing.
113
+ */
114
+ async accept() {
115
+ if (this.__direction !== 'incoming' || this.__status !== 'ringing') {
116
+ throw new Error(`Call.accept() invalid: direction=${this.__direction}, status=${this.__status}. `
117
+ + 'Only valid for incoming calls in ringing state.');
118
+ }
119
+ await this.wechaty.puppet.callAccept(this.id);
120
+ this.__transitionTo('connected');
121
+ }
122
+ /**
123
+ * Reject an incoming call. Only valid when direction=incoming, status=ringing.
124
+ * Local state transitions to 'ended' regardless of whether the protocol
125
+ * acknowledgement reaches the peer.
126
+ */
127
+ async reject(reason) {
128
+ if (this.__direction !== 'incoming' || this.__status !== 'ringing') {
129
+ throw new Error(`Call.reject() invalid: direction=${this.__direction}, status=${this.__status}. `
130
+ + 'Only valid for incoming calls in ringing state.');
131
+ }
132
+ try {
133
+ await this.wechaty.puppet.callReject(this.id, reason);
134
+ }
135
+ finally {
136
+ this.__finalize();
137
+ }
138
+ }
139
+ /**
140
+ * Cancel an outgoing call before it is connected.
141
+ * Only valid when direction=outgoing and status is calling or ringing.
142
+ */
143
+ async cancel() {
144
+ if (this.__direction !== 'outgoing') {
145
+ throw new Error(`Call.cancel() invalid: direction=${this.__direction}. `
146
+ + 'Only valid for outgoing calls.');
147
+ }
148
+ if (this.__status !== 'calling' && this.__status !== 'ringing') {
149
+ throw new Error(`Call.cancel() invalid: status=${this.__status}. `
150
+ + 'Only valid when status is calling or ringing.');
151
+ }
152
+ try {
153
+ await this.wechaty.puppet.callCancel(this.id);
154
+ }
155
+ finally {
156
+ this.__finalize();
157
+ }
158
+ }
159
+ /**
160
+ * Hang up a connected call. Only valid when status=connected.
161
+ */
162
+ async hangup(reason) {
163
+ if (this.__status !== 'connected') {
164
+ throw new Error(`Call.hangup() invalid: status=${this.__status}. `
165
+ + 'Only valid for connected calls.');
166
+ }
167
+ try {
168
+ await this.wechaty.puppet.callHangup(this.id, reason);
169
+ }
170
+ finally {
171
+ this.__finalize();
172
+ }
173
+ }
174
+ /**
175
+ * Invite additional contacts to a live call (group-call growth).
176
+ */
177
+ async add(contacts) {
178
+ if (this.__status === 'ended') {
179
+ throw new Error('Call.add() invalid: status=ended. Cannot add to a finished call.');
180
+ }
181
+ if (contacts.length === 0) {
182
+ throw new Error('Call.add() requires at least one contact.');
183
+ }
184
+ await this.wechaty.puppet.callAdd(this.id, contacts.map(c => c.id));
185
+ }
186
+ /**
187
+ * Pull a fresh admission ticket to the direct-to-gateway media path.
188
+ * Not cached: the credential is short-lived and may pre-allocate a session.
189
+ */
190
+ async mediaEndpoint() {
191
+ return this.wechaty.puppet.callMediaEndpoint(this.id);
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Framework-internal — must not be called from user code.
195
+ // ---------------------------------------------------------------------------
196
+ /**
197
+ * Process an inbound call signal from the puppet layer.
198
+ * Drives state transitions and emits the corresponding object-level event.
199
+ * Terminal lifecycle (ended) is owned by the puppet-mixin which calls
200
+ * `__markEnded()` after observing the protocol-side endTime.
201
+ */
202
+ __handleSignal(signal, actor, reason) {
203
+ if (this.__status === 'ended') {
204
+ log.warn('Call', '__handleSignal(%s) ignored in ended state for callId=%s', signal, this.id);
205
+ return;
206
+ }
207
+ switch (signal) {
208
+ case PUPPET.types.CallSignal.Ringing:
209
+ if (this.__direction === 'outgoing' && this.__status === 'calling') {
210
+ this.__transitionTo('ringing');
211
+ this.emit('ringing');
212
+ }
213
+ break;
214
+ case PUPPET.types.CallSignal.Accept:
215
+ if (this.__status === 'calling' || this.__status === 'ringing') {
216
+ this.__transitionTo('connected');
217
+ }
218
+ this.emit('accept', actor);
219
+ break;
220
+ // Reject/Hangup emit BEFORE puppet-mixin's post-handler finalize, so
221
+ // consumers' handlers observe pre-terminal status. This is safe here
222
+ // because the callable terminal actions throw under their own guards at
223
+ // this moment (accept needs ringing, cancel needs calling/ringing,
224
+ // hangup needs connected). The Cancel case below is the asymmetric
225
+ // outlier: it MUST finalize first to close a media-acquisition race
226
+ // window on the receiving side.
227
+ case PUPPET.types.CallSignal.Reject:
228
+ this.emit('reject', actor, reason);
229
+ break;
230
+ case PUPPET.types.CallSignal.Hangup:
231
+ this.emit('hangup', actor, reason);
232
+ break;
233
+ case PUPPET.types.CallSignal.Cancel:
234
+ // Intentionally finalizes before emitting 'cancel' so consumers'
235
+ // cancel handler observes status === 'ended' synchronously. Cancel
236
+ // signals are always terminal on the receiving side (the caller has
237
+ // withdrawn), so the status flip should be visible to listeners
238
+ // before the descriptor event fires. The reverse order would let a
239
+ // cancel handler observe status === 'ringing' and, worse, call
240
+ // .accept() through the ringing guard before the puppet-mixin's
241
+ // post-emit finalize runs.
242
+ this.__finalize();
243
+ this.emit('cancel', reason);
244
+ break;
245
+ default:
246
+ log.warn('Call', '__handleSignal() unhandled signal: %s', signal);
247
+ break;
248
+ }
249
+ }
250
+ /**
251
+ * Force the call into the ended terminal state and emit 'ended'.
252
+ * Called by puppet-mixin after the protocol-side endTime is observed.
253
+ * Kept as a named entry point distinct from {@link __finalize} so the
254
+ * puppet-mixin surface reads as intent ("the protocol says this is over").
255
+ * Idempotent via __finalize.
256
+ */
257
+ __markEnded() {
258
+ this.__finalize();
259
+ }
260
+ /**
261
+ * Single chokepoint for ending a call: flip the status to ended, emit
262
+ * the object-level 'ended' event, emit the bot-level 'call-ended' lifecycle
263
+ * event, and evict the call from the wechaty pool. Guarded by
264
+ * `__endedEmitted` so that overlapping local-control and puppet-echo paths
265
+ * cannot double-emit or double-evict.
266
+ *
267
+ * Why both event tiers fire here: 'call-ended' is a terminal lifecycle event
268
+ * (not an action event like 'call-reject'/'call-hangup'), and is independent
269
+ * of who initiated the termination. Local control paths (reject/cancel/
270
+ * hangup) and remote-driven paths (puppet signal echo via __finalizeIfEnded)
271
+ * must both surface it.
272
+ */
273
+ __finalize() {
274
+ if (this.__endedEmitted) {
275
+ return;
276
+ }
277
+ this.__endedEmitted = true;
278
+ this.__transitionTo('ended');
279
+ this.emit('ended');
280
+ this.wechaty.emit('call-ended', this);
281
+ this.wechaty.__callPool?.delete(this.id);
282
+ }
283
+ __transitionTo(nextStatus) {
284
+ log.verbose('Call', '__transitionTo(%s) from %s', nextStatus, this.__status);
285
+ this.__status = nextStatus;
286
+ }
287
+ }
288
+ class CallImplBase extends validationMixin(CallMixin)() {
289
+ }
290
+ class CallImpl extends validationMixin(CallImplBase)() {
291
+ }
292
+ export { CallImpl, };
5
293
  class CallRecordMixin extends wechatifyMixinBase() {
6
294
  payload;
7
295
  static async create() {
@@ -1 +1 @@
1
- {"version":3,"file":"call.js","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AAGpC,MAAM,eAAgB,SAAQ,kBAAkB,EAAE;IAoB5B;IAlBpB,MAAM,CAAC,KAAK,CAAC,MAAM;QACjB,GAAG,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,GAAG,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,eAAe,CAAC,eAAe,CAAC,EAAuB;CAAI;AAYxF,OAAO,EACL,cAAc,GACf,CAAA"}
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../../../src/user-modules/call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ /**
3
+ * Tests for the Call first-class object and its lifecycle state machine
4
+ * against the @juzi/wechaty-puppet@^1.0.138 contract.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=call.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.spec.d.ts","sourceRoot":"","sources":["../../../../src/user-modules/call.spec.ts"],"names":[],"mappings":";AACA;;;GAGG"}