@juzi/wechaty-puppet-service 1.0.129 → 1.0.131
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/auth/call-cred.d.ts +2 -2
- package/dist/cjs/src/auth/call-cred.d.ts.map +1 -1
- package/dist/cjs/src/auth/call-cred.js.map +1 -1
- package/dist/cjs/src/client/puppet-service.d.ts +27 -2
- package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
- package/dist/cjs/src/client/puppet-service.js +431 -124
- package/dist/cjs/src/client/puppet-service.js.map +1 -1
- package/dist/cjs/src/client/puppet-service.spec.js +107 -0
- package/dist/cjs/src/client/puppet-service.spec.js.map +1 -1
- package/dist/cjs/src/client/room-cache-coordinator.d.ts +14 -0
- package/dist/cjs/src/client/room-cache-coordinator.d.ts.map +1 -0
- package/dist/cjs/src/client/room-cache-coordinator.js +53 -0
- package/dist/cjs/src/client/room-cache-coordinator.js.map +1 -0
- package/dist/cjs/src/client/room-member-cache.spec.d.ts +2 -0
- package/dist/cjs/src/client/room-member-cache.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/room-member-cache.spec.js +417 -0
- package/dist/cjs/src/client/room-member-cache.spec.js.map +1 -0
- package/dist/cjs/src/client/room-member-load.spec.d.ts +2 -0
- package/dist/cjs/src/client/room-member-load.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/room-member-load.spec.js +324 -0
- package/dist/cjs/src/client/room-member-load.spec.js.map +1 -0
- package/dist/cjs/src/package-json.js +4 -4
- package/dist/cjs/src/server/event-stream-manager.d.ts.map +1 -1
- package/dist/cjs/src/server/event-stream-manager.js +30 -0
- package/dist/cjs/src/server/event-stream-manager.js.map +1 -1
- package/dist/cjs/src/server/event-stream-manager.spec.d.ts +3 -0
- package/dist/cjs/src/server/event-stream-manager.spec.d.ts.map +1 -0
- package/dist/cjs/src/server/event-stream-manager.spec.js +22 -0
- package/dist/cjs/src/server/event-stream-manager.spec.js.map +1 -0
- package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
- package/dist/cjs/src/server/puppet-implementation.js +135 -28
- package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
- package/dist/cjs/src/server/puppet-implementation.spec.js +98 -0
- package/dist/cjs/src/server/puppet-implementation.spec.js.map +1 -1
- package/dist/cjs/src/utils/pb-payload-helper.d.ts +10 -0
- package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -1
- package/dist/cjs/src/utils/pb-payload-helper.js +180 -1
- package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -1
- package/dist/cjs/src/utils/room-member-load.spec.d.ts +2 -0
- package/dist/cjs/src/utils/room-member-load.spec.d.ts.map +1 -0
- package/dist/cjs/src/utils/room-member-load.spec.js +83 -0
- package/dist/cjs/src/utils/room-member-load.spec.js.map +1 -0
- package/dist/esm/src/auth/call-cred.d.ts +2 -2
- package/dist/esm/src/auth/call-cred.d.ts.map +1 -1
- package/dist/esm/src/auth/call-cred.js.map +1 -1
- package/dist/esm/src/client/puppet-service.d.ts +27 -2
- package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
- package/dist/esm/src/client/puppet-service.js +432 -125
- package/dist/esm/src/client/puppet-service.js.map +1 -1
- package/dist/esm/src/client/puppet-service.spec.js +107 -0
- package/dist/esm/src/client/puppet-service.spec.js.map +1 -1
- package/dist/esm/src/client/room-cache-coordinator.d.ts +14 -0
- package/dist/esm/src/client/room-cache-coordinator.d.ts.map +1 -0
- package/dist/esm/src/client/room-cache-coordinator.js +49 -0
- package/dist/esm/src/client/room-cache-coordinator.js.map +1 -0
- package/dist/esm/src/client/room-member-cache.spec.d.ts +2 -0
- package/dist/esm/src/client/room-member-cache.spec.d.ts.map +1 -0
- package/dist/esm/src/client/room-member-cache.spec.js +415 -0
- package/dist/esm/src/client/room-member-cache.spec.js.map +1 -0
- package/dist/esm/src/client/room-member-load.spec.d.ts +2 -0
- package/dist/esm/src/client/room-member-load.spec.d.ts.map +1 -0
- package/dist/esm/src/client/room-member-load.spec.js +296 -0
- package/dist/esm/src/client/room-member-load.spec.js.map +1 -0
- package/dist/esm/src/package-json.js +4 -4
- package/dist/esm/src/server/event-stream-manager.d.ts.map +1 -1
- package/dist/esm/src/server/event-stream-manager.js +30 -0
- package/dist/esm/src/server/event-stream-manager.js.map +1 -1
- package/dist/esm/src/server/event-stream-manager.spec.d.ts +3 -0
- package/dist/esm/src/server/event-stream-manager.spec.d.ts.map +1 -0
- package/dist/esm/src/server/event-stream-manager.spec.js +20 -0
- package/dist/esm/src/server/event-stream-manager.spec.js.map +1 -0
- package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
- package/dist/esm/src/server/puppet-implementation.js +136 -29
- package/dist/esm/src/server/puppet-implementation.js.map +1 -1
- package/dist/esm/src/server/puppet-implementation.spec.js +98 -0
- package/dist/esm/src/server/puppet-implementation.spec.js.map +1 -1
- package/dist/esm/src/utils/pb-payload-helper.d.ts +10 -0
- package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -1
- package/dist/esm/src/utils/pb-payload-helper.js +169 -0
- package/dist/esm/src/utils/pb-payload-helper.js.map +1 -1
- package/dist/esm/src/utils/room-member-load.spec.d.ts +2 -0
- package/dist/esm/src/utils/room-member-load.spec.d.ts.map +1 -0
- package/dist/esm/src/utils/room-member-load.spec.js +58 -0
- package/dist/esm/src/utils/room-member-load.spec.js.map +1 -0
- package/package.json +4 -4
- package/src/auth/call-cred.ts +1 -1
- package/src/client/puppet-service.spec.ts +147 -0
- package/src/client/puppet-service.ts +378 -138
- package/src/client/room-cache-coordinator.ts +50 -0
- package/src/client/room-member-cache.spec.ts +448 -0
- package/src/client/room-member-load.spec.ts +319 -0
- package/src/package-json.ts +4 -4
- package/src/server/event-stream-manager.spec.ts +30 -0
- package/src/server/event-stream-manager.ts +29 -0
- package/src/server/puppet-implementation.spec.ts +127 -0
- package/src/server/puppet-implementation.ts +144 -29
- package/src/utils/pb-payload-helper.ts +150 -0
- package/src/utils/room-member-load.spec.ts +67 -0
|
@@ -94,6 +94,113 @@ function createCallInviteWithMediaPuppet(callId) {
|
|
|
94
94
|
const { puppet } = createCallInviteWithMediaPuppet('');
|
|
95
95
|
await t.rejects(puppet.callInviteWithMedia(['contact-1'], undefined, { hangupOnFinish: true }), /empty call_id/, 'does not hand back an unusable empty call_id');
|
|
96
96
|
});
|
|
97
|
+
let orgBroadcastTestId = 0;
|
|
98
|
+
function createOrgBroadcastPuppet(payloadResponse) {
|
|
99
|
+
const puppet = new puppet_service_js_1.PuppetService({
|
|
100
|
+
token: `org-broadcast-test-${orgBroadcastTestId++}`,
|
|
101
|
+
});
|
|
102
|
+
const executeRequestList = [];
|
|
103
|
+
puppet._grpcManager = {
|
|
104
|
+
client: {
|
|
105
|
+
orgBroadcastExecute: (request, callback) => {
|
|
106
|
+
executeRequestList.push(request);
|
|
107
|
+
callback(null, new wechaty_grpc_1.puppet.OrgBroadcastExecuteResponse());
|
|
108
|
+
},
|
|
109
|
+
orgBroadcastPayload: (request, callback) => {
|
|
110
|
+
void request;
|
|
111
|
+
callback(null, payloadResponse);
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
return { puppet, executeRequestList };
|
|
116
|
+
}
|
|
117
|
+
(0, tstest_1.test)('orgBroadcastPayload maps every response field onto OrgBroadcastPayload', async (t) => {
|
|
118
|
+
const roomTarget = new wechaty_grpc_1.puppet.OrgBroadcastTarget();
|
|
119
|
+
roomTarget.setRoomId('R:room-1');
|
|
120
|
+
roomTarget.setStatus(wechaty_grpc_1.puppet.OrgBroadcastTargetStatus.ORG_BROADCAST_TARGET_STATUS_UNCONFIRMED);
|
|
121
|
+
const sentRoomTarget = new wechaty_grpc_1.puppet.OrgBroadcastTarget();
|
|
122
|
+
sentRoomTarget.setRoomId('R:room-2');
|
|
123
|
+
sentRoomTarget.setStatus(wechaty_grpc_1.puppet.OrgBroadcastTargetStatus.ORG_BROADCAST_TARGET_STATUS_SENT);
|
|
124
|
+
const response = new wechaty_grpc_1.puppet.OrgBroadcastPayloadResponse();
|
|
125
|
+
response.setId('4728994241730369413');
|
|
126
|
+
response.setSendType(2);
|
|
127
|
+
response.setConversationType(1);
|
|
128
|
+
response.setCreatorId('creator-1');
|
|
129
|
+
response.setExecTime(1758600000000);
|
|
130
|
+
response.setStatus(3);
|
|
131
|
+
response.setCanCancel(true);
|
|
132
|
+
response.setAllowSelect(true);
|
|
133
|
+
response.setSent(false);
|
|
134
|
+
response.setTotalCount(7);
|
|
135
|
+
response.setSentCount(5);
|
|
136
|
+
response.setContentListJson('[{"contentType":2}]');
|
|
137
|
+
response.setTargetsList([roomTarget, sentRoomTarget]);
|
|
138
|
+
const { puppet } = createOrgBroadcastPuppet(response);
|
|
139
|
+
const payload = await puppet.orgBroadcastPayload('4728994241730369413');
|
|
140
|
+
t.same(payload, {
|
|
141
|
+
id: '4728994241730369413',
|
|
142
|
+
sendType: 2,
|
|
143
|
+
conversationType: 1,
|
|
144
|
+
creatorId: 'creator-1',
|
|
145
|
+
execTime: 1758600000000,
|
|
146
|
+
status: 3,
|
|
147
|
+
canCancel: true,
|
|
148
|
+
allowSelect: true,
|
|
149
|
+
sent: false,
|
|
150
|
+
totalCount: 7,
|
|
151
|
+
sentCount: 5,
|
|
152
|
+
contentListJson: '[{"contentType":2}]',
|
|
153
|
+
targets: [
|
|
154
|
+
{ contactId: undefined, roomId: 'R:room-1', status: 4 },
|
|
155
|
+
{ contactId: undefined, roomId: 'R:room-2', status: 1 },
|
|
156
|
+
],
|
|
157
|
+
}, 'maps every field and drops the empty contact_id of room targets');
|
|
158
|
+
});
|
|
159
|
+
(0, tstest_1.test)('orgBroadcastPayload maps empty creator_id and contact targets', async (t) => {
|
|
160
|
+
const contactTarget = new wechaty_grpc_1.puppet.OrgBroadcastTarget();
|
|
161
|
+
contactTarget.setContactId('contact-1');
|
|
162
|
+
const response = new wechaty_grpc_1.puppet.OrgBroadcastPayloadResponse();
|
|
163
|
+
response.setId('org-broadcast-2');
|
|
164
|
+
response.setTargetsList([contactTarget]);
|
|
165
|
+
const { puppet } = createOrgBroadcastPuppet(response);
|
|
166
|
+
const payload = await puppet.orgBroadcastPayload('org-broadcast-2');
|
|
167
|
+
t.equal(payload.creatorId, undefined, 'maps an empty creator_id to undefined');
|
|
168
|
+
t.same(payload.targets, [{ contactId: 'contact-1', roomId: undefined, status: 0 }], 'drops the empty room_id of contact targets');
|
|
169
|
+
});
|
|
170
|
+
(0, tstest_1.test)('orgBroadcastExecute sends all targets as an empty target_ids when targetIds is omitted', async (t) => {
|
|
171
|
+
const { puppet, executeRequestList } = createOrgBroadcastPuppet();
|
|
172
|
+
await puppet.orgBroadcastExecute('org-broadcast-1');
|
|
173
|
+
t.equal(executeRequestList.length, 1, 'sends exactly one request');
|
|
174
|
+
t.equal(executeRequestList[0].getId(), 'org-broadcast-1', 'maps orgBroadcastId onto id');
|
|
175
|
+
t.same(executeRequestList[0].getTargetIdsList(), [], 'leaves target_ids empty');
|
|
176
|
+
});
|
|
177
|
+
(0, tstest_1.test)('orgBroadcastExecute forwards the selected targets', async (t) => {
|
|
178
|
+
const { puppet, executeRequestList } = createOrgBroadcastPuppet();
|
|
179
|
+
await puppet.orgBroadcastExecute('org-broadcast-1', ['contact-1', 'contact-2']);
|
|
180
|
+
t.same(executeRequestList[0].getTargetIdsList(), ['contact-1', 'contact-2'], 'maps targetIds onto target_ids');
|
|
181
|
+
});
|
|
182
|
+
(0, tstest_1.test)('orgBroadcastExecute rejects an explicit empty targetIds instead of sending to all targets', async (t) => {
|
|
183
|
+
const { puppet, executeRequestList } = createOrgBroadcastPuppet();
|
|
184
|
+
await t.rejects(puppet.orgBroadcastExecute('org-broadcast-1', []), /targetIds is empty/, 'does not turn an empty selection into sending to all targets');
|
|
185
|
+
t.equal(executeRequestList.length, 0, 'never reaches the server');
|
|
186
|
+
});
|
|
187
|
+
(0, tstest_1.test)('org broadcast grpc events are emitted as puppet events', async (t) => {
|
|
188
|
+
const { puppet } = createOrgBroadcastPuppet();
|
|
189
|
+
const createdSpy = tstest_1.sinon.spy();
|
|
190
|
+
const sentSpy = tstest_1.sinon.spy();
|
|
191
|
+
puppet.on('org-broadcast-created', createdSpy);
|
|
192
|
+
puppet.on('org-broadcast-sent', sentSpy);
|
|
193
|
+
const createdEvent = new wechaty_grpc_1.puppet.EventResponse();
|
|
194
|
+
createdEvent.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_ORG_BROADCAST_CREATED);
|
|
195
|
+
createdEvent.setPayload(JSON.stringify({ orgBroadcastId: 'org-broadcast-1', messageId: 'message-1' }));
|
|
196
|
+
const sentEvent = new wechaty_grpc_1.puppet.EventResponse();
|
|
197
|
+
sentEvent.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_ORG_BROADCAST_SENT);
|
|
198
|
+
sentEvent.setPayload(JSON.stringify({ orgBroadcastId: 'org-broadcast-1' }));
|
|
199
|
+
await puppet.onGrpcStreamEvent(createdEvent);
|
|
200
|
+
await puppet.onGrpcStreamEvent(sentEvent);
|
|
201
|
+
t.same(createdSpy.args[0], [{ orgBroadcastId: 'org-broadcast-1', messageId: 'message-1' }], 'emits org-broadcast-created');
|
|
202
|
+
t.same(sentSpy.args[0], [{ orgBroadcastId: 'org-broadcast-1' }], 'emits org-broadcast-sent');
|
|
203
|
+
});
|
|
97
204
|
(0, tstest_1.test)('version()', async (t) => {
|
|
98
205
|
const puppet = new puppet_service_js_1.PuppetService({
|
|
99
206
|
token: 'test',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppet-service.spec.js","sourceRoot":"","sources":["../../../../src/client/puppet-service.spec.ts"],"names":[],"mappings":";;;;;;AAEA,mCAGgB;AAChB,wDAA8B;AAE9B,uCAAkC;AAClC,qDAAyD;AAEzD,mEAAsD;AAEtD,2DAAmD;AACnD,sCAAwC;AAExC,IAAI,uBAAuB,GAAG,CAAC,CAAA;AAE/B,SAAS,6BAA6B,CACpC,cAA2D;IAE3D,MAAM,MAAM,GAAG,IAAI,iCAAa,CAAC;QAC/B,KAAK,EAAE,4BAA4B,uBAAuB,EAAE,EAAE;KAC/D,CAAC,CAED;IAAC,MAAc,CAAC,aAAa,CAAC,IAAI,GAAG;QACpC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC1B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KAC3B,CACA;IAAC,MAAc,CAAC,YAAY,GAAG;QAC9B,MAAM,EAAE;YACN,gBAAgB,EAAE,CAAC,QAAiB,EAAE,QAAgC,EAAE,EAAE;gBACxE,QAAQ,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAA;YACvD,CAAC;SACF;KACF,CAAA;IACD,cAAK,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,SAAS,CAAC,cAAqB,CAAC,CAAA;IAErE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,IAAA,aAAI,EAAC,wEAAwE,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACvF,MAAM,MAAM,GAAG,6BAA6B,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QAC1D,IAAI,MAAM,KAAK,OAAO,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;SACzC;QACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC;QAC9C,mBAAmB;QACnB,OAAO;QACP,kBAAkB;KACnB,CAAC,CAAA;IAEF,CAAC,CAAC,IAAI,CACJ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EACzB,CAAE,mBAAmB,EAAE,kBAAkB,CAAE,EAC3C,0DAA0D,CAC3D,CAAA;IACD,CAAC,CAAC,KAAK,CACJ,MAAM,CAAC,cAAsB,CAAC,SAAS,EACxC,CAAC,EACD,kDAAkD,CACnD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,sEAAsE,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrF,MAAM,MAAM,GAAG,6BAA6B,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QAC1D,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,CAAC,OAAO,CACb,MAAM,CAAC,mBAAmB,CAAC,CAAE,OAAO,EAAE,OAAO,CAAE,CAAC,EAChD,gCAAgC,EAChC,wEAAwE,CACzE,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,yBAAyB,GAAG,CAAC,CAAA;AAEjC,SAAS,+BAA+B,CACtC,MAAc;IAEd,MAAM,MAAM,GAAG,IAAI,iCAAa,CAAC;QAC/B,KAAK,EAAE,+BAA+B,yBAAyB,EAAE,EAAE;KACpE,CAAC,CAAA;IAEF,MAAM,WAAW,GAA4C,EAAE,CAE9D;IAAC,MAAc,CAAC,YAAY,GAAG;QAC9B,MAAM,EAAE;YACN,mBAAmB,EAAE,CACnB,OAAgD,EAChD,QAA0F,EAC1F,EAAE;gBACF,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAEzB,MAAM,QAAQ,GAAG,IAAI,qBAAU,CAAC,2BAA2B,EAAE,CAAA;gBAC7D,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;gBAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAC1B,CAAC;SACF;KACF,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AAChC,CAAC;AAED,IAAA,aAAI,EAAC,kFAAkF,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACjG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,+BAA+B,CAAC,mBAAmB,CAAC,CAAA;IAEpF,MAAM,IAAI,GAAG,kBAAO,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;IAEtF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAC7C,CAAE,WAAW,EAAE,WAAW,CAAE,EAC5B,IAAI,EACJ,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,CAC7C,CAAA;IAED,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,EAAE,8CAA8C,CAAC,CAAA;IACpF,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAA;IAE3D,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAE,CAAA;IAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAE,WAAW,EAAE,WAAW,CAAE,EAAE,kCAAkC,CAAC,CAAA;IACrG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,2CAA2C,CAAC,CAAA;IACvF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,yCAAyC,CAAC,CAAA;IACnF,CAAC,CAAC,KAAK,CACL,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EACrC,YAAY,EACZ,sCAAsC,CACvC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,0FAA0F,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACzG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,CAAA;IAElF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAE,WAAW,CAAE,CAAC,CAAA;IAEhE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,8CAA8C,CAAC,CAAA;IAElF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAE,CAAA;IAC/B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,6CAA6C,CAAC,CAAA;IAChF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,oCAAoC,CAAC,CAAA;IACjF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAA;AACzE,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,sEAAsE,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrF,MAAM,EAAE,MAAM,EAAE,GAAG,+BAA+B,CAAC,EAAE,CAAC,CAAA;IAEtD,MAAM,CAAC,CAAC,OAAO,CACb,MAAM,CAAC,mBAAmB,CAAC,CAAE,WAAW,CAAE,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAChF,eAAe,EACf,8CAA8C,CAC/C,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,WAAW,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC1B,MAAM,MAAM,GAAG,IAAI,iCAAa,CAAC;QAC/B,KAAK,EAAE,MAAM;KACd,CAAC,CAAA;IACF,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,IAAA,aAAI,EAAC,uCAAuC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACtD,MAAM,KAAK,GAAS,gBAAgB,CAAA;IACpC,MAAM,IAAI,GAAU,MAAM,IAAA,kBAAO,GAAE,CAAA;IACnC,MAAM,QAAQ,GAAM,UAAU,GAAG,IAAI,CAAA;IAErC,MAAM,MAAM,GAAG,IAAI,gCAAU,EAAS,CAAA;IACtC,MAAM,aAAa,GAAG;QACpB,QAAQ,EAAE,QAAQ;QAClB,MAAM;QACN,KAAK,EAAE,KAAK;KACJ,CAAA;IAEV,MAAM,YAAY,GAAG,IAAI,qBAAY,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;IAE1B;;OAEG;IACH,MAAM,aAAa,GAAG;QACpB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,KAAK;KACJ,CAAA;IAEV,MAAM,aAAa,GAAG,IAAI,iCAAa,CAAC,aAAa,CAAC,CAAA;IAEtD,IAAI;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,aAAa,CAAC,KAAK,EAAE,CAAA;YAC3B,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;YAC1B,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAA;SACjC;QACD,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;KACnD;IAAC,OAAO,CAAC,EAAE;QACV,CAAC,CAAC,IAAI,CAAC,CAAQ,CAAC,CAAA;KACjB;IAED,MAAM,YAAY,CAAC,IAAI,EAAE,CAAA;AAC3B,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"puppet-service.spec.js","sourceRoot":"","sources":["../../../../src/client/puppet-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare class RoomCacheOperationError extends Error {
|
|
2
|
+
readonly original: unknown;
|
|
3
|
+
constructor(roomId: string, original: unknown);
|
|
4
|
+
}
|
|
5
|
+
declare class RoomCacheCoordinator {
|
|
6
|
+
private readonly generations;
|
|
7
|
+
private readonly pending;
|
|
8
|
+
generation(roomId: string): number;
|
|
9
|
+
invalidate(roomId: string): void;
|
|
10
|
+
run<Result>(roomId: string, operation: () => Promise<Result>): Promise<Result>;
|
|
11
|
+
commit(roomId: string, generation: number, operation: () => Promise<unknown>): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export { RoomCacheCoordinator, RoomCacheOperationError };
|
|
14
|
+
//# sourceMappingURL=room-cache-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-cache-coordinator.d.ts","sourceRoot":"","sources":["../../../../src/client/room-cache-coordinator.ts"],"names":[],"mappings":"AAAA,cAAM,uBAAwB,SAAQ,KAAK;IAEZ,QAAQ,CAAC,QAAQ,EAAE,OAAO;gBAA1C,MAAM,EAAE,MAAM,EAAW,QAAQ,EAAE,OAAO;CAKxD;AAED,cAAM,oBAAoB;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,UAAU,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAInC,UAAU,CAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI3B,GAAG,CAAC,MAAM,EAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB/E,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpG;AAED,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoomCacheOperationError = exports.RoomCacheCoordinator = void 0;
|
|
4
|
+
class RoomCacheOperationError extends Error {
|
|
5
|
+
original;
|
|
6
|
+
constructor(roomId, original) {
|
|
7
|
+
super(`Room cache ${roomId} failed: ${original instanceof Error ? original.message : String(original)}`);
|
|
8
|
+
this.original = original;
|
|
9
|
+
this.name = 'RoomCacheOperationError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.RoomCacheOperationError = RoomCacheOperationError;
|
|
13
|
+
class RoomCacheCoordinator {
|
|
14
|
+
generations = new Map();
|
|
15
|
+
pending = new Map();
|
|
16
|
+
generation(roomId) {
|
|
17
|
+
return this.generations.get(roomId) ?? 0;
|
|
18
|
+
}
|
|
19
|
+
invalidate(roomId) {
|
|
20
|
+
this.generations.set(roomId, this.generation(roomId) + 1);
|
|
21
|
+
}
|
|
22
|
+
async run(roomId, operation) {
|
|
23
|
+
const preceding = this.pending.get(roomId) ?? Promise.resolve();
|
|
24
|
+
const result = (async () => {
|
|
25
|
+
await preceding;
|
|
26
|
+
return operation();
|
|
27
|
+
})();
|
|
28
|
+
// Only the queue barrier settles errors; the caller still receives the rejected result.
|
|
29
|
+
const barrier = result.then(() => undefined, () => undefined);
|
|
30
|
+
this.pending.set(roomId, barrier);
|
|
31
|
+
try {
|
|
32
|
+
return await result;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw error instanceof RoomCacheOperationError ? error : new RoomCacheOperationError(roomId, error);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
if (this.pending.get(roomId) === barrier) {
|
|
39
|
+
this.pending.delete(roomId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async commit(roomId, generation, operation) {
|
|
44
|
+
await this.run(roomId, async () => {
|
|
45
|
+
if (this.generation(roomId) !== generation) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await operation();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.RoomCacheCoordinator = RoomCacheCoordinator;
|
|
53
|
+
//# sourceMappingURL=room-cache-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-cache-coordinator.js","sourceRoot":"","sources":["../../../../src/client/room-cache-coordinator.ts"],"names":[],"mappings":";;;AAAA,MAAM,uBAAwB,SAAQ,KAAK;IAEH;IAAtC,YAAa,MAAc,EAAW,QAAiB;QACrD,KAAK,CAAC,cAAc,MAAM,YAAY,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QADpE,aAAQ,GAAR,QAAQ,CAAS;QAErD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CAEF;AA0C8B,0DAAuB;AAxCtD,MAAM,oBAAoB;IAEP,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAA;IAE3D,UAAU,CAAE,MAAc;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CAAE,MAAc;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,GAAG,CAAU,MAAc,EAAE,SAAgC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAA;QAC/D,MAAM,MAAM,GAAG,CAAC,KAAK,IAAqB,EAAE;YAC1C,MAAM,SAAS,CAAA;YACf,OAAO,SAAS,EAAE,CAAA;QACpB,CAAC,CAAC,EAAE,CAAA;QACJ,wFAAwF;QACxF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAc,EAAE,CAAC,SAAS,EAAE,GAAc,EAAE,CAAC,SAAS,CAAC,CAAA;QACnF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,IAAI;YACF,OAAO,MAAM,MAAM,CAAA;SACpB;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,YAAY,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;SACpG;gBAAS;YACR,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;aAAE;SAC1E;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,MAAc,EAAE,UAAkB,EAAE,SAAiC;QACjF,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAmB,EAAE;YAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE;gBAAE,OAAM;aAAE;YACtD,MAAM,SAAS,EAAE,CAAA;QACnB,CAAC,CAAC,CAAA;IACJ,CAAC;CAEF;AAEQ,oDAAoB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-member-cache.spec.d.ts","sourceRoot":"","sources":["../../../../src/client/room-member-cache.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tstest_1 = require("tstest");
|
|
4
|
+
const wechaty_grpc_1 = require("@juzi/wechaty-grpc");
|
|
5
|
+
const puppet_service_js_1 = require("./puppet-service.js");
|
|
6
|
+
const grpc_manager_js_1 = require("./grpc-manager.js");
|
|
7
|
+
const pb_payload_helper_js_1 = require("../utils/pb-payload-helper.js");
|
|
8
|
+
function deferred() {
|
|
9
|
+
let finish = () => { throw new Error('Uninitialized resolver'); };
|
|
10
|
+
let fail = () => { throw new Error('Uninitialized rejection'); };
|
|
11
|
+
const promise = new Promise((resolve, reject) => { finish = resolve; fail = reject; });
|
|
12
|
+
return { promise, resolve: finish, reject: fail };
|
|
13
|
+
}
|
|
14
|
+
class BridgedService extends puppet_service_js_1.PuppetService {
|
|
15
|
+
connect(manager) { this._grpcManager = manager; this.bridgeGrpcEventStream(manager); }
|
|
16
|
+
}
|
|
17
|
+
let fixtureId = 0;
|
|
18
|
+
function serviceFixture() {
|
|
19
|
+
return new BridgedService({ token: `insecure_cache-${process.pid}-${fixtureId++}` });
|
|
20
|
+
}
|
|
21
|
+
function event(payload, seq = 2) {
|
|
22
|
+
const response = new wechaty_grpc_1.puppet.EventResponse();
|
|
23
|
+
response.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_ROOM_MEMBER_LOAD);
|
|
24
|
+
response.setSeq(seq);
|
|
25
|
+
response.setPayload(JSON.stringify(payload));
|
|
26
|
+
return response;
|
|
27
|
+
}
|
|
28
|
+
const state = { roomId: 'room', taskId: 'task', status: 3, revision: '1' };
|
|
29
|
+
async function drain() {
|
|
30
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
31
|
+
}
|
|
32
|
+
function resetFixture(remove = async () => { }) {
|
|
33
|
+
const service = serviceFixture();
|
|
34
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
35
|
+
const metadata = new Map([['lastEventSeq', '1'], ['lastEventTimestamp', String(Date.now())], ['accountId', 'account']]);
|
|
36
|
+
Object.defineProperty(service, '_payloadStore', {
|
|
37
|
+
value: {
|
|
38
|
+
room: { delete: remove },
|
|
39
|
+
roomMember: { delete: async () => { } },
|
|
40
|
+
miscellaneous: {
|
|
41
|
+
get: async (key) => metadata.get(key),
|
|
42
|
+
set: async (key, value) => { metadata.set(key, value); },
|
|
43
|
+
delete: async (key) => { metadata.delete(key); },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(service, 'isLoggedIn', { get: () => true });
|
|
48
|
+
tstest_1.sinon.stub(service, 'login').resolves();
|
|
49
|
+
const stop = tstest_1.sinon.stub(manager, 'stopStream');
|
|
50
|
+
const started = deferred();
|
|
51
|
+
const release = deferred();
|
|
52
|
+
const start = tstest_1.sinon.stub(manager, 'startStream').callsFake(async () => {
|
|
53
|
+
started.resolve();
|
|
54
|
+
await release.promise;
|
|
55
|
+
});
|
|
56
|
+
service.connect(manager);
|
|
57
|
+
return { service, manager, metadata, stop, start, started, release };
|
|
58
|
+
}
|
|
59
|
+
async function finishResetHandshake(fixture) {
|
|
60
|
+
fixture.release.resolve();
|
|
61
|
+
await drain();
|
|
62
|
+
const login = new wechaty_grpc_1.puppet.EventResponse();
|
|
63
|
+
login.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_LOGIN);
|
|
64
|
+
login.setPayload(JSON.stringify({ contactId: 'account' }));
|
|
65
|
+
fixture.manager.emit('data', login);
|
|
66
|
+
const ready = new wechaty_grpc_1.puppet.EventResponse();
|
|
67
|
+
ready.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_READY);
|
|
68
|
+
ready.setPayload(JSON.stringify({ data: 'ready' }));
|
|
69
|
+
fixture.manager.emit('data', ready);
|
|
70
|
+
await drain();
|
|
71
|
+
}
|
|
72
|
+
(0, tstest_1.test)('bridge cache failure stops the stream and fences later seq until explicit reset', async (t) => {
|
|
73
|
+
const service = serviceFixture();
|
|
74
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
75
|
+
const metadata = new Map([['lastEventSeq', '1'], ['lastEventTimestamp', String(Date.now())]]);
|
|
76
|
+
const deleteRoom = tstest_1.sinon.stub().rejects(new Error('persistent cache unavailable'));
|
|
77
|
+
Object.defineProperty(service, '_payloadStore', {
|
|
78
|
+
value: {
|
|
79
|
+
room: { delete: deleteRoom },
|
|
80
|
+
roomMember: { delete: tstest_1.sinon.stub().resolves() },
|
|
81
|
+
miscellaneous: {
|
|
82
|
+
get: async (key) => metadata.get(key),
|
|
83
|
+
set: async (key, value) => { metadata.set(key, value); },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const stop = tstest_1.sinon.stub(manager, 'stopStream');
|
|
88
|
+
const start = tstest_1.sinon.stub(manager, 'startStream').resolves();
|
|
89
|
+
const errors = tstest_1.sinon.spy();
|
|
90
|
+
const completed = tstest_1.sinon.spy();
|
|
91
|
+
const unhandled = tstest_1.sinon.spy();
|
|
92
|
+
process.on('unhandledRejection', unhandled);
|
|
93
|
+
t.teardown(() => { process.off('unhandledRejection', unhandled); });
|
|
94
|
+
service.on('error', errors);
|
|
95
|
+
service.on('room-member-load', completed);
|
|
96
|
+
service.connect(manager);
|
|
97
|
+
manager.emit('data', event(state));
|
|
98
|
+
manager.emit('data', event({ ...state, revision: '2' }, 3));
|
|
99
|
+
await drain();
|
|
100
|
+
t.equal(unhandled.callCount, 0);
|
|
101
|
+
t.equal(errors.callCount, 1);
|
|
102
|
+
t.equal(completed.callCount, 0);
|
|
103
|
+
t.equal(metadata.get('lastEventSeq'), '1');
|
|
104
|
+
t.equal(stop.callCount, 1);
|
|
105
|
+
t.equal(start.callCount, 0);
|
|
106
|
+
deleteRoom.resolves();
|
|
107
|
+
manager.emit('data', event(state));
|
|
108
|
+
await drain();
|
|
109
|
+
t.equal(completed.callCount, 0);
|
|
110
|
+
t.equal(metadata.get('lastEventSeq'), '1');
|
|
111
|
+
});
|
|
112
|
+
(0, tstest_1.test)('invalid event payloads never reach persistent cache or emit completion', async (t) => {
|
|
113
|
+
for (const payload of [
|
|
114
|
+
{ ...state, revision: 1 }, { ...state, revision: '01' }, { ...state, status: 99 },
|
|
115
|
+
{ ...state, roomId: '' }, { ...state, roomId: undefined }, { ...state, taskId: 1 },
|
|
116
|
+
]) {
|
|
117
|
+
const service = serviceFixture();
|
|
118
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
119
|
+
const remove = tstest_1.sinon.stub().resolves();
|
|
120
|
+
Object.defineProperty(service, '_payloadStore', { value: { room: { delete: remove }, roomMember: { delete: remove } } });
|
|
121
|
+
tstest_1.sinon.stub(manager, 'stopStream');
|
|
122
|
+
tstest_1.sinon.stub(manager, 'startStream').resolves();
|
|
123
|
+
const errors = tstest_1.sinon.spy();
|
|
124
|
+
const completed = tstest_1.sinon.spy();
|
|
125
|
+
service.on('error', errors);
|
|
126
|
+
service.on('room-member-load', completed);
|
|
127
|
+
service.connect(manager);
|
|
128
|
+
manager.emit('data', event(payload));
|
|
129
|
+
await drain();
|
|
130
|
+
t.equal(remove.callCount, 0);
|
|
131
|
+
t.equal(completed.callCount, 0);
|
|
132
|
+
t.equal(errors.callCount, 1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
(0, tstest_1.test)('all four raw RPC reads begun before invalidation cannot refill persistent caches', async (t) => {
|
|
136
|
+
const room = { id: 'room', topic: 'old', adminIdList: [], memberIdList: [] };
|
|
137
|
+
const member = { id: 'member', name: 'old', avatar: '' };
|
|
138
|
+
for (const method of ['room', 'batchRoom', 'member', 'batchMember']) {
|
|
139
|
+
const responseReady = deferred();
|
|
140
|
+
const requested = deferred();
|
|
141
|
+
const service = serviceFixture();
|
|
142
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
143
|
+
const rooms = new Map();
|
|
144
|
+
const members = new Map();
|
|
145
|
+
Object.defineProperty(service, '_payloadStore', {
|
|
146
|
+
value: {
|
|
147
|
+
room: {
|
|
148
|
+
get: async (id) => rooms.get(id),
|
|
149
|
+
set: async (id, value) => { rooms.set(id, value); },
|
|
150
|
+
delete: async (id) => { rooms.delete(id); },
|
|
151
|
+
},
|
|
152
|
+
roomMember: {
|
|
153
|
+
get: async (id) => members.get(id),
|
|
154
|
+
set: async (id, value) => { members.set(id, value); },
|
|
155
|
+
delete: async (id) => { members.delete(id); },
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
const wait = async () => { requested.resolve(); await responseReady.promise; };
|
|
160
|
+
const respond = async (response, callback) => {
|
|
161
|
+
await wait();
|
|
162
|
+
callback(null, response);
|
|
163
|
+
};
|
|
164
|
+
const client = {
|
|
165
|
+
roomPayload: (_request, callback) => {
|
|
166
|
+
void respond((0, pb_payload_helper_js_1.roomPayloadToPb)(room), callback);
|
|
167
|
+
},
|
|
168
|
+
batchRoomPayload: (_request, callback) => {
|
|
169
|
+
const response = new wechaty_grpc_1.puppet.BatchRoomPayloadResponse();
|
|
170
|
+
response.setRoomPayloadsList([(0, pb_payload_helper_js_1.roomPayloadToPb)(room)]);
|
|
171
|
+
void respond(response, callback);
|
|
172
|
+
},
|
|
173
|
+
roomMemberPayload: (_request, callback) => {
|
|
174
|
+
void respond((0, pb_payload_helper_js_1.roomMemberPayloadToPb)(member), callback);
|
|
175
|
+
},
|
|
176
|
+
batchRoomMemberPayload: (_request, callback) => {
|
|
177
|
+
const response = new wechaty_grpc_1.puppet.BatchRoomMemberPayloadResponse();
|
|
178
|
+
response.setMemberPayloadsList([(0, pb_payload_helper_js_1.roomMemberPayloadToPb)(member)]);
|
|
179
|
+
void respond(response, callback);
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
Object.defineProperty(service, 'grpcManager', { value: { client } });
|
|
183
|
+
service.on('error', (error) => { t.fail(String(error)); });
|
|
184
|
+
service.connect(manager);
|
|
185
|
+
const pending = method === 'room' ? service.roomRawPayload('room')
|
|
186
|
+
: method === 'batchRoom' ? service.batchRoomRawPayload(['room'])
|
|
187
|
+
: method === 'member' ? service.roomMemberRawPayload('room', 'member')
|
|
188
|
+
: service.batchRoomMemberRawPayload('room', ['member']);
|
|
189
|
+
await requested.promise;
|
|
190
|
+
manager.emit('data', event(state, 0));
|
|
191
|
+
await drain();
|
|
192
|
+
responseReady.resolve();
|
|
193
|
+
await pending;
|
|
194
|
+
t.equal(rooms.size, 0, method);
|
|
195
|
+
t.equal(members.size, 0, method);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
(0, tstest_1.test)('invalidation waits for an already-started asynchronous cache write', async (t) => {
|
|
199
|
+
const service = serviceFixture();
|
|
200
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
201
|
+
const writing = deferred();
|
|
202
|
+
const finishWrite = deferred();
|
|
203
|
+
let stored;
|
|
204
|
+
const room = { id: 'room', topic: 'old', adminIdList: [], memberIdList: [] };
|
|
205
|
+
const remove = tstest_1.sinon.stub().callsFake(async () => { stored = undefined; });
|
|
206
|
+
Object.defineProperty(service, '_payloadStore', {
|
|
207
|
+
value: {
|
|
208
|
+
room: {
|
|
209
|
+
get: async () => stored,
|
|
210
|
+
set: async (_id, value) => {
|
|
211
|
+
writing.resolve();
|
|
212
|
+
await finishWrite.promise;
|
|
213
|
+
stored = value;
|
|
214
|
+
},
|
|
215
|
+
delete: remove,
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
Object.defineProperty(service, 'grpcManager', {
|
|
220
|
+
value: {
|
|
221
|
+
client: {
|
|
222
|
+
roomPayload: (_request, callback) => callback(null, (0, pb_payload_helper_js_1.roomPayloadToPb)(room)),
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
service.connect(manager);
|
|
227
|
+
const loaded = tstest_1.sinon.spy();
|
|
228
|
+
service.on('room-member-load', loaded);
|
|
229
|
+
const pending = service.roomRawPayload('room');
|
|
230
|
+
await writing.promise;
|
|
231
|
+
manager.emit('data', event(state, 0));
|
|
232
|
+
await drain();
|
|
233
|
+
t.equal(remove.callCount, 0);
|
|
234
|
+
t.equal(loaded.callCount, 0);
|
|
235
|
+
finishWrite.resolve();
|
|
236
|
+
await pending;
|
|
237
|
+
await drain();
|
|
238
|
+
t.equal(stored, undefined);
|
|
239
|
+
t.equal(loaded.callCount, 1);
|
|
240
|
+
});
|
|
241
|
+
(0, tstest_1.test)('later events cannot bypass a halted failure and never cause automatic restart', async (t) => {
|
|
242
|
+
for (const skipped of [false, true]) {
|
|
243
|
+
const service = serviceFixture();
|
|
244
|
+
const manager = new grpc_manager_js_1.GrpcManager({ token: 'insecure_token' });
|
|
245
|
+
const metadata = new Map([['lastEventSeq', '1']]);
|
|
246
|
+
Object.defineProperty(service, '_payloadStore', {
|
|
247
|
+
value: {
|
|
248
|
+
room: { delete: tstest_1.sinon.stub().rejects(new Error('persistent cache unavailable')) },
|
|
249
|
+
miscellaneous: {
|
|
250
|
+
get: async (key) => metadata.get(key),
|
|
251
|
+
set: async (key, value) => { metadata.set(key, value); },
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
tstest_1.sinon.stub(manager, 'stopStream');
|
|
256
|
+
const start = tstest_1.sinon.stub(manager, 'startStream').resolves();
|
|
257
|
+
const errors = tstest_1.sinon.spy();
|
|
258
|
+
const completed = tstest_1.sinon.spy();
|
|
259
|
+
service.on('error', errors);
|
|
260
|
+
service.on('room-member-load', completed);
|
|
261
|
+
service.connect(manager);
|
|
262
|
+
manager.emit('data', event(state));
|
|
263
|
+
await drain();
|
|
264
|
+
manager.emit('data', event(state, skipped ? 3 : 2));
|
|
265
|
+
manager.emit('data', event(state, 4));
|
|
266
|
+
await drain();
|
|
267
|
+
t.equal(start.callCount, 0);
|
|
268
|
+
t.equal(errors.callCount, 1);
|
|
269
|
+
t.equal(completed.callCount, 0);
|
|
270
|
+
t.equal(metadata.get('lastEventSeq'), '1');
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
(0, tstest_1.test)('duplicate reset does not invalidate events queued by the owner reset', async (t) => {
|
|
274
|
+
const fixture = resetFixture();
|
|
275
|
+
const completed = tstest_1.sinon.spy();
|
|
276
|
+
fixture.service.on('room-member-load', completed);
|
|
277
|
+
const resetting = fixture.service.reset();
|
|
278
|
+
await fixture.started.promise;
|
|
279
|
+
fixture.release.resolve();
|
|
280
|
+
await drain();
|
|
281
|
+
const login = new wechaty_grpc_1.puppet.EventResponse();
|
|
282
|
+
login.setType(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_LOGIN);
|
|
283
|
+
login.setPayload(JSON.stringify({ contactId: 'account' }));
|
|
284
|
+
fixture.manager.emit('data', login);
|
|
285
|
+
await drain();
|
|
286
|
+
fixture.manager.emit('data', event(state));
|
|
287
|
+
await fixture.service.reset();
|
|
288
|
+
await drain();
|
|
289
|
+
t.equal(completed.callCount, 1);
|
|
290
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '2');
|
|
291
|
+
t.equal(fixture.start.callCount, 1);
|
|
292
|
+
await finishResetHandshake(fixture);
|
|
293
|
+
await resetting;
|
|
294
|
+
});
|
|
295
|
+
(0, tstest_1.test)('superseded delete rejection cannot stop the stream established by reset', async (t) => {
|
|
296
|
+
const removing = deferred();
|
|
297
|
+
const began = deferred();
|
|
298
|
+
const remove = tstest_1.sinon.stub().onFirstCall().callsFake(async () => { began.resolve(); await removing.promise; });
|
|
299
|
+
remove.onSecondCall().resolves();
|
|
300
|
+
const fixture = resetFixture(remove);
|
|
301
|
+
const errors = tstest_1.sinon.spy();
|
|
302
|
+
const completed = tstest_1.sinon.spy();
|
|
303
|
+
fixture.service.on('error', errors);
|
|
304
|
+
fixture.service.on('room-member-load', completed);
|
|
305
|
+
fixture.manager.emit('data', event(state));
|
|
306
|
+
await began.promise;
|
|
307
|
+
const resetting = fixture.service.reset();
|
|
308
|
+
await fixture.started.promise;
|
|
309
|
+
await finishResetHandshake(fixture);
|
|
310
|
+
await resetting;
|
|
311
|
+
removing.reject(new Error('old delete rejected after reset'));
|
|
312
|
+
await drain();
|
|
313
|
+
t.equal(fixture.stop.callCount, 1);
|
|
314
|
+
t.equal(fixture.start.callCount, 1);
|
|
315
|
+
t.equal(errors.callCount, 0);
|
|
316
|
+
t.equal(completed.callCount, 0);
|
|
317
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '1');
|
|
318
|
+
fixture.manager.emit('data', event(state));
|
|
319
|
+
await drain();
|
|
320
|
+
t.equal(completed.callCount, 1);
|
|
321
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '2');
|
|
322
|
+
});
|
|
323
|
+
(0, tstest_1.test)('failure stops before notifying an error listener that immediately performs actual reset', async (t) => {
|
|
324
|
+
const remove = tstest_1.sinon.stub().onFirstCall().rejects(new Error('persistent cache unavailable'));
|
|
325
|
+
remove.onSecondCall().resolves();
|
|
326
|
+
const fixture = resetFixture(remove);
|
|
327
|
+
const resetting = deferred();
|
|
328
|
+
const stopsAtError = [];
|
|
329
|
+
fixture.service.on('error', () => {
|
|
330
|
+
stopsAtError.push(fixture.stop.callCount);
|
|
331
|
+
resetting.resolve(fixture.service.reset());
|
|
332
|
+
});
|
|
333
|
+
fixture.manager.emit('data', event(state));
|
|
334
|
+
await fixture.started.promise;
|
|
335
|
+
t.same(stopsAtError, [1]);
|
|
336
|
+
t.equal(fixture.start.callCount, 1);
|
|
337
|
+
t.same(fixture.start.args[0], ['1', 'account']);
|
|
338
|
+
await finishResetHandshake(fixture);
|
|
339
|
+
await resetting.promise;
|
|
340
|
+
await drain();
|
|
341
|
+
t.equal(fixture.stop.callCount, 2);
|
|
342
|
+
t.equal(fixture.start.callCount, 1);
|
|
343
|
+
fixture.manager.emit('data', event(state));
|
|
344
|
+
await drain();
|
|
345
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '2');
|
|
346
|
+
});
|
|
347
|
+
(0, tstest_1.test)('reset waits for and rolls back a superseded asynchronous cursor commit before resuming', async (t) => {
|
|
348
|
+
const fixture = resetFixture();
|
|
349
|
+
const writing = deferred();
|
|
350
|
+
const finishWrite = deferred();
|
|
351
|
+
Object.defineProperty(fixture.service, '_payloadStore', {
|
|
352
|
+
value: {
|
|
353
|
+
room: { delete: async () => { } },
|
|
354
|
+
roomMember: { delete: async () => { } },
|
|
355
|
+
miscellaneous: {
|
|
356
|
+
get: async (key) => fixture.metadata.get(key),
|
|
357
|
+
set: async (key, value) => {
|
|
358
|
+
if (key === 'lastEventSeq' && value === '2') {
|
|
359
|
+
writing.resolve();
|
|
360
|
+
await finishWrite.promise;
|
|
361
|
+
}
|
|
362
|
+
fixture.metadata.set(key, value);
|
|
363
|
+
},
|
|
364
|
+
delete: async (key) => { fixture.metadata.delete(key); },
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
fixture.manager.emit('data', event(state));
|
|
369
|
+
await writing.promise;
|
|
370
|
+
const resetting = fixture.service.reset();
|
|
371
|
+
await drain();
|
|
372
|
+
t.equal(fixture.start.callCount, 0);
|
|
373
|
+
finishWrite.resolve();
|
|
374
|
+
await fixture.started.promise;
|
|
375
|
+
t.same(fixture.start.args[0], ['1', 'account']);
|
|
376
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '1');
|
|
377
|
+
await finishResetHandshake(fixture);
|
|
378
|
+
await resetting;
|
|
379
|
+
});
|
|
380
|
+
(0, tstest_1.test)('explicit reset preserves the failed seq barrier if the new stream skips that event', async (t) => {
|
|
381
|
+
const remove = tstest_1.sinon.stub().onFirstCall().rejects(new Error('persistent cache unavailable'));
|
|
382
|
+
remove.onSecondCall().resolves();
|
|
383
|
+
const fixture = resetFixture(remove);
|
|
384
|
+
const errors = tstest_1.sinon.spy();
|
|
385
|
+
const completed = tstest_1.sinon.spy();
|
|
386
|
+
fixture.service.on('error', errors);
|
|
387
|
+
fixture.service.on('room-member-load', completed);
|
|
388
|
+
fixture.manager.emit('data', event(state));
|
|
389
|
+
await drain();
|
|
390
|
+
t.equal(fixture.start.callCount, 0);
|
|
391
|
+
const resetting = fixture.service.reset();
|
|
392
|
+
await fixture.started.promise;
|
|
393
|
+
await finishResetHandshake(fixture);
|
|
394
|
+
await resetting;
|
|
395
|
+
fixture.manager.emit('data', event(state, 3));
|
|
396
|
+
await drain();
|
|
397
|
+
t.equal(errors.callCount, 2);
|
|
398
|
+
t.equal(completed.callCount, 0);
|
|
399
|
+
t.equal(fixture.metadata.get('lastEventSeq'), '1');
|
|
400
|
+
t.equal(fixture.start.callCount, 1);
|
|
401
|
+
});
|
|
402
|
+
(0, tstest_1.test)('explicit reset uses the actual durable cursor without age fallback or invented zero', async (t) => {
|
|
403
|
+
for (const absent of [false, true]) {
|
|
404
|
+
const fixture = resetFixture();
|
|
405
|
+
fixture.metadata.set('lastEventTimestamp', '0');
|
|
406
|
+
if (absent) {
|
|
407
|
+
fixture.metadata.delete('lastEventSeq');
|
|
408
|
+
}
|
|
409
|
+
const resetting = fixture.service.reset();
|
|
410
|
+
await fixture.started.promise;
|
|
411
|
+
t.same(fixture.start.args[0], [absent ? undefined : '1', 'account']);
|
|
412
|
+
await finishResetHandshake(fixture);
|
|
413
|
+
await resetting;
|
|
414
|
+
t.equal(fixture.metadata.get('lastEventSeq'), absent ? undefined : '1');
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
//# sourceMappingURL=room-member-cache.spec.js.map
|