@juzi/wechaty-puppet-service 1.0.22 → 1.0.24

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 (43) hide show
  1. package/dist/cjs/src/client/puppet-service.d.ts +11 -0
  2. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  3. package/dist/cjs/src/client/puppet-service.js +167 -0
  4. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  5. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
  6. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js +3 -0
  7. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -1
  8. package/dist/cjs/src/package-json.js +3 -3
  9. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
  10. package/dist/cjs/src/server/puppet-implementation.js +233 -5
  11. package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
  12. package/dist/cjs/src/server/puppet-server.d.ts.map +1 -1
  13. package/dist/cjs/src/server/puppet-server.js +3 -1
  14. package/dist/cjs/src/server/puppet-server.js.map +1 -1
  15. package/dist/cjs/src/utils/pb-payload-helper.d.ts +8 -0
  16. package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -0
  17. package/dist/cjs/src/utils/pb-payload-helper.js +94 -0
  18. package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -0
  19. package/dist/esm/src/client/puppet-service.d.ts +11 -0
  20. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  21. package/dist/esm/src/client/puppet-service.js +167 -0
  22. package/dist/esm/src/client/puppet-service.js.map +1 -1
  23. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
  24. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js +3 -0
  25. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -1
  26. package/dist/esm/src/package-json.js +3 -3
  27. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
  28. package/dist/esm/src/server/puppet-implementation.js +233 -5
  29. package/dist/esm/src/server/puppet-implementation.js.map +1 -1
  30. package/dist/esm/src/server/puppet-server.d.ts.map +1 -1
  31. package/dist/esm/src/server/puppet-server.js +3 -1
  32. package/dist/esm/src/server/puppet-server.js.map +1 -1
  33. package/dist/esm/src/utils/pb-payload-helper.d.ts +8 -0
  34. package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -0
  35. package/dist/esm/src/utils/pb-payload-helper.js +86 -0
  36. package/dist/esm/src/utils/pb-payload-helper.js.map +1 -0
  37. package/package.json +3 -3
  38. package/src/client/puppet-service.ts +201 -0
  39. package/src/file-box-helper/uuidify-file-box-grpc.ts +4 -0
  40. package/src/package-json.ts +3 -3
  41. package/src/server/puppet-implementation.ts +241 -5
  42. package/src/server/puppet-server.ts +3 -1
  43. package/src/utils/pb-payload-helper.ts +60 -0
@@ -0,0 +1,86 @@
1
+ export const miniProgramPayloadToPb = (grpcPuppet, miniProgramPayload) => {
2
+ const pbMiniProgramPayload = new grpcPuppet.MiniProgramPayload();
3
+ if (miniProgramPayload.appid) {
4
+ pbMiniProgramPayload.setAppid(miniProgramPayload.appid);
5
+ }
6
+ if (miniProgramPayload.description) {
7
+ pbMiniProgramPayload.setDescription(miniProgramPayload.description);
8
+ }
9
+ if (miniProgramPayload.iconUrl) {
10
+ pbMiniProgramPayload.setIconUrl(miniProgramPayload.iconUrl);
11
+ }
12
+ if (miniProgramPayload.pagePath) {
13
+ pbMiniProgramPayload.setPagePath(miniProgramPayload.pagePath);
14
+ }
15
+ if (miniProgramPayload.shareId) {
16
+ pbMiniProgramPayload.setShareId(miniProgramPayload.shareId);
17
+ }
18
+ if (miniProgramPayload.thumbKey) {
19
+ pbMiniProgramPayload.setThumbKey(miniProgramPayload.thumbKey);
20
+ }
21
+ if (miniProgramPayload.thumbUrl) {
22
+ pbMiniProgramPayload.setThumbUrl(miniProgramPayload.thumbUrl);
23
+ }
24
+ if (miniProgramPayload.title) {
25
+ pbMiniProgramPayload.setTitle(miniProgramPayload.title);
26
+ }
27
+ if (miniProgramPayload.username) {
28
+ pbMiniProgramPayload.setUsername(miniProgramPayload.username);
29
+ }
30
+ return pbMiniProgramPayload;
31
+ };
32
+ export const urlLinkPayloadToPb = (grpcPuppet, urlLinkPayload) => {
33
+ const pbUrlLinkPayload = new grpcPuppet.UrlLinkPayload();
34
+ pbUrlLinkPayload.setUrl(urlLinkPayload.url);
35
+ pbUrlLinkPayload.setTitle(urlLinkPayload.title);
36
+ if (urlLinkPayload.description) {
37
+ pbUrlLinkPayload.setDescription(urlLinkPayload.description);
38
+ }
39
+ if (urlLinkPayload.thumbnailUrl) {
40
+ pbUrlLinkPayload.setThumbnailUrl(urlLinkPayload.thumbnailUrl);
41
+ }
42
+ return pbUrlLinkPayload;
43
+ };
44
+ export const urlLinkPbToPayload = (urlLinkPayloadPb) => {
45
+ const _urlLinkPayloadPb = urlLinkPayloadPb.toObject();
46
+ const urlLinkPayload = {
47
+ ..._urlLinkPayloadPb,
48
+ };
49
+ return urlLinkPayload;
50
+ };
51
+ export const channelPayloadToPb = (grpcPuppet, channelPayload) => {
52
+ const pbChannelPayload = new grpcPuppet.ChannelPayload();
53
+ if (channelPayload.avatar) {
54
+ pbChannelPayload.setAvatar(channelPayload.avatar);
55
+ }
56
+ if (channelPayload.coverUrl) {
57
+ pbChannelPayload.setCoverUrl(channelPayload.coverUrl);
58
+ }
59
+ if (channelPayload.desc) {
60
+ pbChannelPayload.setDesc(channelPayload.desc);
61
+ }
62
+ if (channelPayload.extras) {
63
+ pbChannelPayload.setExtras(channelPayload.extras);
64
+ }
65
+ if (channelPayload.feedType) {
66
+ pbChannelPayload.setFeedType(channelPayload.feedType);
67
+ }
68
+ if (channelPayload.nickname) {
69
+ pbChannelPayload.setNickname(channelPayload.nickname);
70
+ }
71
+ if (channelPayload.thumbUrl) {
72
+ pbChannelPayload.setThumbUrl(channelPayload.thumbUrl);
73
+ }
74
+ if (channelPayload.url) {
75
+ pbChannelPayload.setUrl(channelPayload.url);
76
+ }
77
+ return pbChannelPayload;
78
+ };
79
+ export const channelPbToPayload = (channelPayloadPb) => {
80
+ const _channelPayloadPb = channelPayloadPb.toObject();
81
+ const channelPayload = {
82
+ ..._channelPayloadPb,
83
+ };
84
+ return channelPayload;
85
+ };
86
+ //# sourceMappingURL=pb-payload-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pb-payload-helper.js","sourceRoot":"","sources":["../../../../src/utils/pb-payload-helper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/wechaty-puppet-service",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "description": "Puppet Service for Wechaty",
5
5
  "type": "module",
6
6
  "exports": {
@@ -65,10 +65,10 @@
65
65
  "why-is-node-running": "^2.2.1"
66
66
  },
67
67
  "peerDependencies": {
68
- "@juzi/wechaty-puppet": "^1.0.30"
68
+ "@juzi/wechaty-puppet": "^1.0.32"
69
69
  },
70
70
  "dependencies": {
71
- "@juzi/wechaty-grpc": "^1.0.17",
71
+ "@juzi/wechaty-grpc": "^1.0.21",
72
72
  "@juzi/wechaty-redux": "^1.0.1",
73
73
  "clone-class": "^1.1.1",
74
74
  "ducks": "^1.0.2",
@@ -68,6 +68,7 @@ import { packageJson } from '../package-json.js'
68
68
 
69
69
  import { GrpcManager } from './grpc-manager.js'
70
70
  import { PayloadStore } from './payload-store.js'
71
+ import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
71
72
 
72
73
  export type PuppetServiceOptions = PUPPET.PuppetOptions & {
73
74
  authority? : string
@@ -2195,6 +2196,206 @@ class PuppetService extends PUPPET.Puppet {
2195
2196
  return payload
2196
2197
  }
2197
2198
 
2199
+ /**
2200
+ *
2201
+ * Post & Moment Section
2202
+ *
2203
+ */
2204
+
2205
+ override async postPublish (payload: PUPPET.payloads.Post): Promise<void | string> {
2206
+ log.verbose('PuppetService', 'postPublish(%s)', JSON.stringify(payload))
2207
+
2208
+ if (!PUPPET.payloads.isPostClient(payload)) {
2209
+ throw new Error('can only publish client post now')
2210
+ }
2211
+ const request = new grpcPuppet.MomentPublishRequest()
2212
+ const post = new grpcPuppet.PostPayloadClient()
2213
+ post.setType(grpcPuppet.PostType.POST_TYPE_MOMENT)
2214
+ for (const item of payload.sayableList) {
2215
+ const sayable = new grpcPuppet.PostSayable()
2216
+ switch (item.type) {
2217
+ case PUPPET.types.Sayable.Text:
2218
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
2219
+ sayable.setText(item.payload.text)
2220
+ break
2221
+ case PUPPET.types.Sayable.Attachment: {
2222
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
2223
+ const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : await this.serializeFileBox(item.payload.filebox)
2224
+ sayable.setFileBox(serializedFileBox)
2225
+ break
2226
+ }
2227
+ case PUPPET.types.Sayable.Url: {
2228
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
2229
+ const urlLinkPayload = item.payload
2230
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
2231
+ sayable.setUrlLink(pbUrlLinkPayload)
2232
+ break
2233
+ }
2234
+ case PUPPET.types.Sayable.Channel: {
2235
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
2236
+ const channelPayload = item.payload
2237
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
2238
+ sayable.setChannel(pbChannelPayload)
2239
+ break
2240
+ }
2241
+ default:
2242
+ throw new Error(`postPublish unsupported type ${item.type}`)
2243
+ }
2244
+ post.addSayableList(sayable)
2245
+ }
2246
+ request.setPost(post)
2247
+
2248
+ const result = await util.promisify(
2249
+ this.grpcManager.client.momentPublish
2250
+ .bind(this.grpcManager.client),
2251
+ )(request)
2252
+
2253
+ const momentId = result.getMomentId()
2254
+
2255
+ return momentId
2256
+ }
2257
+
2258
+ override async momentSignature (text?: string): Promise<void | string> {
2259
+ log.verbose('PuppetService', 'momentSignature(%s)', text)
2260
+
2261
+ const request = new grpcPuppet.MomentSignatureRequest()
2262
+ if (text) {
2263
+ request.setText(text)
2264
+ }
2265
+
2266
+ const response = await util.promisify(
2267
+ this.grpcManager.client.momentSignature
2268
+ .bind(this.grpcManager.client),
2269
+ )(request)
2270
+
2271
+ const signature = response.getText()
2272
+
2273
+ return signature
2274
+ }
2275
+
2276
+ override async momentCoverage (cover?: FileBoxInterface | undefined): Promise<void | FileBoxInterface> {
2277
+ log.verbose('PuppetService', 'momentCoverage(%s)', JSON.stringify(cover))
2278
+
2279
+ const request = new grpcPuppet.MomentCoverageRequest()
2280
+ if (cover) {
2281
+ const serializedFileBox = await this.serializeFileBox(cover)
2282
+ request.setFileBox(serializedFileBox)
2283
+ }
2284
+
2285
+ const response = await util.promisify(
2286
+ this.grpcManager.client.momentCoverage
2287
+ .bind(this.grpcManager.client),
2288
+ )(request)
2289
+
2290
+ const jsonText = response.getFileBox()
2291
+ if (jsonText) {
2292
+ return this.FileBoxUuid.fromJSON(jsonText)
2293
+ }
2294
+ }
2295
+
2296
+ override async postPayloadSayable (postId: string, sayableId: string): Promise<PUPPET.payloads.Sayable> {
2297
+ log.verbose('PuppetService', 'postPayloadSayable(%s, %s)', postId, sayableId)
2298
+
2299
+ const request = new grpcPuppet.PostPayloadSayableRequest()
2300
+ request.setPostId(postId)
2301
+ request.setSayableId(sayableId)
2302
+
2303
+ const response = await util.promisify(
2304
+ this.grpcManager.client.postPayloadSayable
2305
+ .bind(this.grpcManager.client),
2306
+ )(request)
2307
+
2308
+ const sayable = response.getSayable()
2309
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
2310
+
2311
+ if (sayable) {
2312
+ switch (sayable.getType()) {
2313
+ case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
2314
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '')
2315
+ break
2316
+ case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
2317
+ const fileJsonStr = sayable.getFileBox()
2318
+ if (!fileJsonStr) {
2319
+ break
2320
+ }
2321
+ const file = this.FileBoxUuid.fromJSON(JSON.stringify(fileJsonStr))
2322
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
2323
+ break
2324
+ }
2325
+ case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
2326
+ const urlLinkPayloadPb = sayable.getUrlLink()
2327
+ if (!urlLinkPayloadPb) {
2328
+ break
2329
+ }
2330
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
2331
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
2332
+ break
2333
+ }
2334
+ case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
2335
+ const channelPayloadPb = sayable.getChannel()
2336
+ if (!channelPayloadPb) {
2337
+ break
2338
+ }
2339
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
2340
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
2341
+ break
2342
+ }
2343
+ default:
2344
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
2345
+ }
2346
+ }
2347
+ if (!sayablePayload) {
2348
+ throw new Error(`cannot get sayable ${sayableId} from post ${postId}`)
2349
+ } else {
2350
+ return sayablePayload
2351
+ }
2352
+ }
2353
+
2354
+ override async postRawPayload (id: string): Promise<PUPPET.payloads.Post> {
2355
+ log.verbose('PuppetService', 'postRawPayload(%s)', id)
2356
+
2357
+ const request = new grpcPuppet.PostPayloadRequest()
2358
+ request.setPostId(id)
2359
+
2360
+ const response = await util.promisify(
2361
+ this.grpcManager.client.postPayload
2362
+ .bind(this.grpcManager.client),
2363
+ )(request)
2364
+
2365
+ const postPb = response.getPost()
2366
+ if (!postPb) {
2367
+ throw new Error(`failed to get post for id ${id}`)
2368
+ }
2369
+ const timestamp = postPb.getTimestamp()
2370
+ const payload: PUPPET.payloads.PostServer = {
2371
+ id,
2372
+ parentId: postPb.getParentId(),
2373
+ rootId: postPb.getRootId(),
2374
+ type: postPb.getType() || PUPPET.types.Post.Unspecified,
2375
+ sayableList: [],
2376
+ contactId: postPb.getContactId(),
2377
+ timestamp: timestamp ? millisecondsFromTimestamp(timestamp) : Date.now(),
2378
+ counter: {
2379
+ children: postPb.getChildren(),
2380
+ descendant: postPb.getDescendant(),
2381
+ taps: {
2382
+ [PUPPET.types.Tap.Like]: postPb.getLike(),
2383
+ },
2384
+ },
2385
+ }
2386
+ const sayablePbList = postPb.getSayableListList()
2387
+ for (const sayablePb of sayablePbList) {
2388
+ payload.sayableList.push(sayablePb.getId())
2389
+ }
2390
+ return payload
2391
+ }
2392
+
2393
+ override async postRawPayloadParser (payload: PUPPET.payloads.Post): Promise<PUPPET.payloads.Post> {
2394
+ // log.silly('PuppetService', 'postRawPayloadParser({id:%s})', payload.id)
2395
+ // passthrough
2396
+ return payload
2397
+ }
2398
+
2198
2399
  /**
2199
2400
  * @deprecated Will be removed in v2.0
2200
2401
  */
@@ -32,6 +32,10 @@ const uuidResolverGrpc: (grpcClient: () => pbPuppet.PuppetClient) => UuidLoader
32
32
  const stream = response
33
33
  .pipe(chunkDecoder())
34
34
 
35
+ response.on('error', e => {
36
+ stream.emit('error', e)
37
+ })
38
+
35
39
  return stream
36
40
  }
37
41
 
@@ -4,7 +4,7 @@
4
4
  import type { PackageJson } from 'type-fest'
5
5
  export const packageJson: PackageJson = {
6
6
  "name": "@juzi/wechaty-puppet-service",
7
- "version": "1.0.22",
7
+ "version": "1.0.24",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -69,10 +69,10 @@ export const packageJson: PackageJson = {
69
69
  "why-is-node-running": "^2.2.1"
70
70
  },
71
71
  "peerDependencies": {
72
- "@juzi/wechaty-puppet": "^1.0.30"
72
+ "@juzi/wechaty-puppet": "^1.0.32"
73
73
  },
74
74
  "dependencies": {
75
- "@juzi/wechaty-grpc": "^1.0.17",
75
+ "@juzi/wechaty-grpc": "^1.0.21",
76
76
  "@juzi/wechaty-redux": "^1.0.1",
77
77
  "clone-class": "^1.1.1",
78
78
  "ducks": "^1.0.2",
@@ -47,6 +47,7 @@ import {
47
47
  import { log } from '../config.js'
48
48
  import { grpcError } from './grpc-error.js'
49
49
  import { EventStreamManager } from './event-stream-manager.js'
50
+ import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
50
51
 
51
52
  function puppetImplementation (
52
53
  puppet : PUPPET.impls.PuppetInterface,
@@ -1746,15 +1747,250 @@ function puppetImplementation (
1746
1747
  }
1747
1748
  },
1748
1749
 
1750
+ /**
1751
+ *
1752
+ * Post & Moment
1753
+ *
1754
+ */
1755
+
1756
+ momentPublish: async (call, callback) => {
1757
+ log.verbose('PuppetServiceImpl', 'momentPublish()')
1758
+
1759
+ try {
1760
+ const post = call.request.getPost()
1761
+ if (!post) {
1762
+ throw new Error('no post found')
1763
+ }
1764
+ const type = post.getType()
1765
+ if (type !== grpcPuppet.PostType.POST_TYPE_MOMENT) {
1766
+ throw new Error('cannot publish non-moment post')
1767
+ }
1768
+ const payload: PUPPET.payloads.PostClient = {
1769
+ type: PUPPET.types.Post.Moment,
1770
+ sayableList: [],
1771
+ }
1772
+ const sayableList = post.getSayableListList()
1773
+ for (const sayable of sayableList) {
1774
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
1775
+ switch (sayable.getType()) {
1776
+ case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
1777
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '')
1778
+ break
1779
+ case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
1780
+ const fileJsonStr = sayable.getFileBox()
1781
+ if (!fileJsonStr) {
1782
+ break
1783
+ }
1784
+ const file = FileBoxUuid.fromJSON(JSON.stringify(fileJsonStr))
1785
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
1786
+ break
1787
+ }
1788
+ case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
1789
+ const urlLinkPayloadPb = sayable.getUrlLink()
1790
+ if (!urlLinkPayloadPb) {
1791
+ break
1792
+ }
1793
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
1794
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
1795
+ break
1796
+ }
1797
+ case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
1798
+ const channelPayloadPb = sayable.getChannel()
1799
+ if (!channelPayloadPb) {
1800
+ break
1801
+ }
1802
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
1803
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
1804
+ break
1805
+ }
1806
+ default:
1807
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
1808
+ }
1809
+ if (sayablePayload) {
1810
+ payload.sayableList.push(sayablePayload)
1811
+ } else {
1812
+ throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
1813
+ }
1814
+ }
1815
+
1816
+ const momentId = await puppet.postPublish(payload)
1817
+ const response = new grpcPuppet.MomentPublishResponse()
1818
+ if (momentId) {
1819
+ response.setMomentId(momentId)
1820
+ }
1821
+
1822
+ return callback(null, response)
1823
+
1824
+ } catch (e) {
1825
+ return grpcError('momentPublish', e, callback)
1826
+ }
1827
+
1828
+ },
1829
+
1830
+ postComment: async (call, callback) => {
1831
+ log.verbose('PuppetServiceImpl', 'postComment()')
1832
+ void call
1833
+
1834
+ try {
1835
+ throw new Error('postComment is not supported by puppet yet')
1836
+ } catch (e) {
1837
+ return grpcError('postComment', e, callback)
1838
+ }
1839
+ },
1840
+
1841
+ postLike: async (call, callback) => {
1842
+ log.verbose('PuppetServiceImpl', 'postLike()')
1843
+ void call
1844
+
1845
+ try {
1846
+ throw new Error('postLike is not supported by puppet yet')
1847
+ } catch (e) {
1848
+ return grpcError('postLike', e, callback)
1849
+ }
1850
+ },
1851
+
1852
+ momentSignature: async (call, callback) => {
1853
+ log.verbose('PuppetServiceImpl', 'momentSignature()')
1854
+
1855
+ try {
1856
+ const signature = call.request.getText()
1857
+ const result = await puppet.momentSignature(signature || undefined)
1858
+
1859
+ const response = new grpcPuppet.MomentSignatureResponse()
1860
+ if (result) {
1861
+ response.setText(result)
1862
+ }
1863
+
1864
+ return callback(null, response)
1865
+ } catch (e) {
1866
+ return grpcError('momentSignature', e, callback)
1867
+ }
1868
+ },
1869
+
1870
+ momentCoverage: async (call, callback) => {
1871
+ log.verbose('PuppetServiceImpl', 'momentCoverage()')
1872
+
1873
+ try {
1874
+ const fileJsonStr = call.request.getFileBox()
1875
+
1876
+ const response = new grpcPuppet.MomentCoverageResponse()
1877
+
1878
+ if (fileJsonStr) {
1879
+ const file = FileBoxUuid.fromJSON(JSON.stringify(fileJsonStr))
1880
+ await puppet.momentCoverage(file)
1881
+ } else {
1882
+ const file = await puppet.momentCoverage()
1883
+ if (file) {
1884
+ response.setFileBox(await serializeFileBox(file))
1885
+ } else {
1886
+ throw new Error('fail to get moment coverage')
1887
+ }
1888
+ }
1889
+
1890
+ return callback(null, response)
1891
+ } catch (e) {
1892
+ return grpcError('momentCoverage', e, callback)
1893
+ }
1894
+ },
1895
+
1896
+ postPayload: async (call, callback) => {
1897
+ log.verbose('PuppetServiceImpl', 'postPayloadSayable()')
1898
+
1899
+ try {
1900
+ const postId = call.request.getPostId()
1901
+ const postPayload = await puppet.postPayload(postId) as PUPPET.payloads.PostServer
1902
+
1903
+ const response = new grpcPuppet.PostPayloadResponse()
1904
+ const postPayloadPb = new grpcPuppet.PostPayloadServer()
1905
+ if (postPayload.parentId) { postPayloadPb.setParentId(postPayload.parentId) }
1906
+ if (postPayload.rootId) { postPayloadPb.setRootId(postPayload.rootId) }
1907
+ if (postPayload.type) {
1908
+ postPayloadPb.setType(postPayload.type)
1909
+ } else {
1910
+ postPayloadPb.setType(grpcPuppet.PostType.POST_TYPE_UNSPECIFIED)
1911
+ }
1912
+ if (postPayload.contactId) { postPayloadPb.setContactId(postPayload.contactId) }
1913
+ postPayloadPb.setTimestamp(timestampFromMilliseconds(postPayload.timestamp))
1914
+ if (postPayload.counter.children) { postPayloadPb.setChildren(postPayload.counter.children) }
1915
+ if (postPayload.counter.descendant) { postPayloadPb.setDescendant(postPayload.counter.descendant) }
1916
+ if (postPayload.counter.taps && postPayload.counter.taps[PUPPET.types.Tap.Like]) {
1917
+ postPayloadPb.setLike(postPayload.counter.taps[PUPPET.types.Tap.Like]!)
1918
+ }
1919
+ const sayablePbList = []
1920
+ for (const sayable of postPayload.sayableList) {
1921
+ const sayablePb = new grpcPuppet.PostSayable()
1922
+ sayablePb.setId(sayable)
1923
+ sayablePbList.push(sayablePb)
1924
+ }
1925
+ postPayloadPb.setSayableListList(sayablePbList)
1926
+ response.setPost(postPayloadPb)
1927
+
1928
+ return callback(null, response)
1929
+ } catch (e) {
1930
+ return grpcError('postPayloadSayable', e, callback)
1931
+ }
1932
+
1933
+ },
1934
+
1935
+ postPayloadSayable: async (call, callback) => {
1936
+ log.verbose('PuppetServiceImpl', 'postPayloadSayable()')
1937
+
1938
+ try {
1939
+ const postId = call.request.getPostId()
1940
+ const sayableId = call.request.getSayableId()
1941
+
1942
+ const result = await puppet.postPayloadSayable(postId, sayableId)
1943
+ const response = new grpcPuppet.PostPayloadSayableResponse()
1944
+ const sayablePb = new grpcPuppet.PostSayable()
1945
+ switch (result.type) {
1946
+ case PUPPET.types.Sayable.Text:
1947
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
1948
+ sayablePb.setText(result.payload.text)
1949
+ break
1950
+ case PUPPET.types.Sayable.Attachment: {
1951
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
1952
+ const serializedFileBox = typeof result.payload.filebox === 'string' ? result.payload.filebox : await serializeFileBox(result.payload.filebox)
1953
+ sayablePb.setFileBox(serializedFileBox)
1954
+ break
1955
+ }
1956
+ case PUPPET.types.Sayable.Url: {
1957
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
1958
+ const urlLinkPayload = result.payload
1959
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
1960
+ sayablePb.setUrlLink(pbUrlLinkPayload)
1961
+ break
1962
+ }
1963
+ case PUPPET.types.Sayable.Channel: {
1964
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
1965
+ const channelPayload = result.payload
1966
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
1967
+ sayablePb.setChannel(pbChannelPayload)
1968
+ break
1969
+ }
1970
+ default:
1971
+ throw new Error(`postPayloadSayable unsupported type ${result.type}`)
1972
+ }
1973
+
1974
+ return callback(null, response)
1975
+ } catch (e) {
1976
+ return grpcError('postPayloadSayable', e, callback)
1977
+ }
1978
+ },
1979
+
1749
1980
  download: async (call) => {
1750
1981
  log.verbose('PuppetServiceImpl', 'download()')
1751
1982
 
1752
- const uuid = call.request.getId()
1753
- const fileBox = FileBoxUuid.fromUuid(uuid, { name: 'uuid.dat' })
1983
+ try {
1984
+ const uuid = call.request.getId()
1985
+ const fileBox = FileBoxUuid.fromUuid(uuid, { name: 'uuid.dat' })
1986
+
1987
+ fileBox
1988
+ .pipe(chunkEncoder(grpcPuppet.DownloadResponse))
1989
+ .pipe(call as unknown as Writable) // Huan(202203) FIXME: as unknown as
1990
+ } catch (e) {
1991
+ call.destroy(e as Error)
1992
+ }
1754
1993
 
1755
- fileBox
1756
- .pipe(chunkEncoder(grpcPuppet.DownloadResponse))
1757
- .pipe(call as unknown as Writable) // Huan(202203) FIXME: as unknown as
1758
1994
  },
1759
1995
 
1760
1996
  upload: async (call, callback) => {
@@ -96,7 +96,9 @@ export class PuppetServer {
96
96
 
97
97
  if (!this.urnRegistry) {
98
98
  log.verbose('PuppetServer', 'start() initializing FileBox UUID URN Registry ...')
99
- this.urnRegistry = new UniformResourceNameRegistry()
99
+ this.urnRegistry = new UniformResourceNameRegistry({
100
+ expireMilliseconds: 2 * 60 * 60 * 1000, // 2h
101
+ })
100
102
  await this.urnRegistry.init()
101
103
  log.verbose('PuppetServer', 'start() initializing FileBox UUID URN Registry ... done')
102
104
  }