@juzi/wechaty-puppet-service 1.0.44 → 1.0.45

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 (33) hide show
  1. package/dist/cjs/src/client/puppet-service.d.ts +3 -0
  2. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  3. package/dist/cjs/src/client/puppet-service.js +41 -69
  4. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  5. package/dist/cjs/src/package-json.d.ts.map +1 -1
  6. package/dist/cjs/src/package-json.js +4 -3
  7. package/dist/cjs/src/package-json.js.map +1 -1
  8. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
  9. package/dist/cjs/src/server/puppet-implementation.js +39 -61
  10. package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
  11. package/dist/cjs/src/utils/pb-payload-helper.d.ts +5 -2
  12. package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -1
  13. package/dist/cjs/src/utils/pb-payload-helper.js +146 -1
  14. package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -1
  15. package/dist/esm/src/client/puppet-service.d.ts +3 -0
  16. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  17. package/dist/esm/src/client/puppet-service.js +42 -70
  18. package/dist/esm/src/client/puppet-service.js.map +1 -1
  19. package/dist/esm/src/package-json.d.ts.map +1 -1
  20. package/dist/esm/src/package-json.js +4 -3
  21. package/dist/esm/src/package-json.js.map +1 -1
  22. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
  23. package/dist/esm/src/server/puppet-implementation.js +40 -62
  24. package/dist/esm/src/server/puppet-implementation.js.map +1 -1
  25. package/dist/esm/src/utils/pb-payload-helper.d.ts +5 -2
  26. package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -1
  27. package/dist/esm/src/utils/pb-payload-helper.js +120 -0
  28. package/dist/esm/src/utils/pb-payload-helper.js.map +1 -1
  29. package/package.json +4 -3
  30. package/src/client/puppet-service.ts +56 -66
  31. package/src/package-json.ts +4 -3
  32. package/src/server/puppet-implementation.ts +50 -62
  33. package/src/utils/pb-payload-helper.ts +119 -2
@@ -58,7 +58,8 @@ import { packageJson } from '../package-json.js'
58
58
 
59
59
  import { GrpcManager } from './grpc-manager.js'
60
60
  import { PayloadStore } from './payload-store.js'
61
- import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
61
+ import { channelPayloadToPb, channelPbToPayload, postPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
62
+ import type { MessageBroadcastTargets, MessageBroadcastTargetType } from '@juzi/wechaty-puppet/dist/esm/src/schemas/message.js'
62
63
 
63
64
  export type PuppetServiceOptions = PUPPET.PuppetOptions & {
64
65
  authority? : string
@@ -715,24 +716,24 @@ class PuppetService extends PUPPET.Puppet {
715
716
  if (payload.id) {
716
717
  throw new Error('cannot modify contactId')
717
718
  }
718
- if (payload.gender) { request.setGender(payload.gender) }
719
- if (payload.type) { request.setType(payload.type) }
720
- if (payload.name) { request.setName(payload.name) }
721
- if (payload.avatar) { request.setAvatar(payload.avatar) }
722
- if (payload.address) { request.setAddress(payload.address) }
723
- if (payload.alias) { request.setAlias(payload.alias) }
724
- if (payload.city) { request.setCity(payload.city) }
725
- if (payload.friend) { request.setFriend(payload.friend) }
726
- if (payload.province) { request.setProvince(payload.province) }
727
- if (payload.star) { request.setStar(payload.star) }
728
- if (payload.weixin) { request.setWeixin(payload.weixin) }
729
- if (payload.corporation) { request.setCorporation(payload.corporation) }
730
- if (payload.title) { request.setTitle(payload.title) }
731
- if (payload.description) { request.setDescription(payload.description) }
732
- if (payload.coworker) { request.setCoworker(payload.coworker) }
733
- if (payload.phone) { request.setPhonesList(payload.phone) }
734
- if (payload.additionalInfo) { request.setAdditionalInfo(payload.additionalInfo) }
735
- if (payload.tags) { request.setTagIdsList(payload.tags) }
719
+ if (typeof payload.gender !== 'undefined') { request.setGender(payload.gender) }
720
+ if (typeof payload.type !== 'undefined') { request.setType(payload.type) }
721
+ if (typeof payload.name !== 'undefined') { request.setName(payload.name) }
722
+ if (typeof payload.avatar !== 'undefined') { request.setAvatar(payload.avatar) }
723
+ if (typeof payload.address !== 'undefined') { request.setAddress(payload.address) }
724
+ if (typeof payload.alias !== 'undefined') { request.setAlias(payload.alias) }
725
+ if (typeof payload.city !== 'undefined') { request.setCity(payload.city) }
726
+ if (typeof payload.friend !== 'undefined') { request.setFriend(payload.friend) }
727
+ if (typeof payload.province !== 'undefined') { request.setProvince(payload.province) }
728
+ if (typeof payload.star !== 'undefined') { request.setStar(payload.star) }
729
+ if (typeof payload.weixin !== 'undefined') { request.setWeixin(payload.weixin) }
730
+ if (typeof payload.corporation !== 'undefined') { request.setCorporation(payload.corporation) }
731
+ if (typeof payload.title !== 'undefined') { request.setTitle(payload.title) }
732
+ if (typeof payload.description !== 'undefined') { request.setDescription(payload.description) }
733
+ if (typeof payload.coworker !== 'undefined') { request.setCoworker(payload.coworker) }
734
+ if (typeof payload.phone !== 'undefined') { request.setPhonesList(payload.phone) }
735
+ if (typeof payload.additionalInfo !== 'undefined') { request.setAdditionalInfo(payload.additionalInfo) }
736
+ if (typeof payload.tags !== 'undefined') { request.setTagIdsList(payload.tags) }
736
737
 
737
738
  await util.promisify(
738
739
  this.grpcManager.client.contactPayloadModify
@@ -1364,6 +1365,41 @@ class PuppetService extends PUPPET.Puppet {
1364
1365
  return payload
1365
1366
  }
1366
1367
 
1368
+ override async getMessageBroadcastTarget (): Promise<MessageBroadcastTargets> {
1369
+ log.verbose('PuppetService', 'getMessageBroadcastTarget()')
1370
+
1371
+ const request = new grpcPuppet.GetMessageBroadcastTargetRequest()
1372
+
1373
+ const response = await util.promisify(
1374
+ this.grpcManager.client.getMessageBroadcastTarget.bind(this.grpcManager.client),
1375
+ )(request)
1376
+
1377
+ return {
1378
+ contactIds: response.getContactIdsList(),
1379
+ roomIds: response.getRoomIdsList(),
1380
+ }
1381
+ }
1382
+
1383
+ override async createMessageBroadcast (targets: string[], type: MessageBroadcastTargetType, content: PUPPET.payloads.Post): Promise<string | void> {
1384
+ log.verbose('PuppetService', 'createMessageBroadcast()')
1385
+
1386
+ if (!PUPPET.payloads.isPostClient(content)) {
1387
+ throw new Error('can only create broadcast with client post')
1388
+ }
1389
+
1390
+ const request = new grpcPuppet.CreateMessageBroadcastRequest()
1391
+ const post = await postPayloadToPb(grpcPuppet, content, this.serializeFileBox.bind(this))
1392
+ request.setContent(post)
1393
+ request.setTargetIdsList(targets)
1394
+ request.setType(type)
1395
+
1396
+ const response = await util.promisify(
1397
+ this.grpcManager.client.createMessageBroadcast.bind(this.grpcManager.client),
1398
+ )(request)
1399
+
1400
+ return response.getId()
1401
+ }
1402
+
1367
1403
  /**
1368
1404
  *
1369
1405
  * Room
@@ -2206,53 +2242,7 @@ class PuppetService extends PUPPET.Puppet {
2206
2242
  throw new Error('can only publish client post now')
2207
2243
  }
2208
2244
  const request = new grpcPuppet.MomentPublishRequest()
2209
- const post = new grpcPuppet.PostPayloadClient()
2210
- post.setType(grpcPuppet.PostType.POST_TYPE_MOMENT)
2211
- for (const item of payload.sayableList) {
2212
- const sayable = new grpcPuppet.PostSayable()
2213
- switch (item.type) {
2214
- case PUPPET.types.Sayable.Text:
2215
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
2216
- sayable.setText(item.payload.text)
2217
- sayable.setMentionIdListList(item.payload.mentions)
2218
- break
2219
- case PUPPET.types.Sayable.Attachment: {
2220
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
2221
- const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : await this.serializeFileBox(item.payload.filebox)
2222
- sayable.setFileBox(serializedFileBox)
2223
- break
2224
- }
2225
- case PUPPET.types.Sayable.Url: {
2226
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
2227
- const urlLinkPayload = item.payload
2228
- const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
2229
- sayable.setUrlLink(pbUrlLinkPayload)
2230
- break
2231
- }
2232
- case PUPPET.types.Sayable.Channel: {
2233
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
2234
- const channelPayload = item.payload
2235
- const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
2236
- sayable.setChannel(pbChannelPayload)
2237
- break
2238
- }
2239
- default:
2240
- throw new Error(`postPublish unsupported type ${item.type}`)
2241
- }
2242
- post.addSayableList(sayable)
2243
- }
2244
- if (payload.rootId) { post.setRootId(payload.rootId) }
2245
- if (payload.parentId) { post.setParentId(payload.parentId) }
2246
- if (payload.location) {
2247
- const location = new grpcPuppet.LocationPayload()
2248
- location.setAccuracy(payload.location.accuracy)
2249
- location.setAddress(payload.location.address)
2250
- location.setName(payload.location.name)
2251
- location.setLatitude(payload.location.latitude)
2252
- location.setLongitude(payload.location.longitude)
2253
- post.setLocation(location)
2254
- }
2255
- post.setVisibleListList(payload.visibleList || [])
2245
+ const post = await postPayloadToPb(grpcPuppet, payload, this.serializeFileBox.bind(this))
2256
2246
  request.setPost(post)
2257
2247
 
2258
2248
  const result = await util.promisify(
@@ -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.44",
7
+ "version": "1.0.45",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -55,7 +55,7 @@ export const packageJson: PackageJson = {
55
55
  "@chatie/eslint-config": "^1.0.4",
56
56
  "@chatie/semver": "^0.4.7",
57
57
  "@chatie/tsconfig": "^4.6.3",
58
- "@juzi/wechaty-puppet": "^1.0.49",
58
+ "@juzi/wechaty-puppet": "^1.0.50",
59
59
  "@juzi/wechaty-puppet-mock": "^1.0.1",
60
60
  "@types/google-protobuf": "^3.15.5",
61
61
  "@types/lru-cache": "^7.5.0",
@@ -63,6 +63,7 @@ export const packageJson: PackageJson = {
63
63
  "@types/temp": "^0.9.1",
64
64
  "@types/uuid": "^8.3.4",
65
65
  "@types/ws": "^8.5.3",
66
+ "esquery": "1.4.0",
66
67
  "get-port": "^6.1.2",
67
68
  "temp": "^0.9.4",
68
69
  "typed-emitter": "^1.5.0-from-event",
@@ -73,7 +74,7 @@ export const packageJson: PackageJson = {
73
74
  "@juzi/wechaty-puppet": "^1.0.46"
74
75
  },
75
76
  "dependencies": {
76
- "@juzi/wechaty-grpc": "^1.0.43",
77
+ "@juzi/wechaty-grpc": "^1.0.45",
77
78
  "@juzi/wechaty-redux": "^1.0.1",
78
79
  "clone-class": "^1.1.1",
79
80
  "ducks": "^1.0.2",
@@ -43,7 +43,7 @@ import {
43
43
  import { log } from '../config.js'
44
44
  import { grpcError } from './grpc-error.js'
45
45
  import { EventStreamManager } from './event-stream-manager.js'
46
- import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
46
+ import { channelPayloadToPb, postPbToPayload, urlLinkPayloadToPb } from '../utils/pb-payload-helper.js'
47
47
 
48
48
  function puppetImplementation (
49
49
  puppet : PUPPET.impls.PuppetInterface,
@@ -1100,6 +1100,54 @@ function puppetImplementation (
1100
1100
  }
1101
1101
  },
1102
1102
 
1103
+ getMessageBroadcastTarget: async (call, callback) => {
1104
+ log.verbose('PuppetServiceImpl', 'getMessageBroadcastTarget()')
1105
+
1106
+ void call
1107
+ try {
1108
+ const payload = await puppet.getMessageBroadcastTarget()
1109
+
1110
+ const response = new grpcPuppet.GetMessageBroadcastTargetResponse()
1111
+ response.setContactIdsList(payload.contactIds || [])
1112
+ response.setRoomIdsList(payload.roomIds || [])
1113
+
1114
+ return callback(null, response)
1115
+ } catch (e) {
1116
+ return grpcError('getMessageBroadcastTarget', e, callback)
1117
+ }
1118
+ },
1119
+
1120
+ createMessageBroadcast: async (call, callback) => {
1121
+ log.verbose('PuppetServiceImpl', 'createMessageBroadcast()')
1122
+
1123
+ try {
1124
+ const targets = call.request.getTargetIdsList()
1125
+ const type = call.request.getType()
1126
+ const post = call.request.getContent()
1127
+
1128
+ if (!post) {
1129
+ throw new Error('no post found')
1130
+ }
1131
+ if (post.getType() !== grpcPuppet.PostType.POST_TYPE_BROADCAST) {
1132
+ throw new Error('cannot create broadcast with non-broadcast post')
1133
+ }
1134
+
1135
+ const payload = postPbToPayload(post, FileBoxUuid)
1136
+
1137
+ const id = await puppet.createMessageBroadcast(targets, type, payload)
1138
+
1139
+ const response = new grpcPuppet.CreateMessageBroadcastResponse()
1140
+ if (id) {
1141
+ response.setId(id)
1142
+ }
1143
+
1144
+ return callback(null, response)
1145
+
1146
+ } catch (e) {
1147
+ return grpcError('createMessageBroadcast', e, callback)
1148
+ }
1149
+ },
1150
+
1103
1151
  roomAdd: async (call, callback) => {
1104
1152
  log.verbose('PuppetServiceImpl', 'roomAdd()')
1105
1153
 
@@ -1764,67 +1812,7 @@ function puppetImplementation (
1764
1812
  if (type !== grpcPuppet.PostType.POST_TYPE_MOMENT) {
1765
1813
  throw new Error('cannot publish non-moment post')
1766
1814
  }
1767
- const payload: PUPPET.payloads.PostClient = {
1768
- type: PUPPET.types.Post.Moment,
1769
- sayableList: [],
1770
- rootId: post.getRootId(),
1771
- parentId: post.getParentId(),
1772
- visibleList: post.getVisibleListList(),
1773
- }
1774
- const sayableList = post.getSayableListList()
1775
- for (const sayable of sayableList) {
1776
- let sayablePayload: PUPPET.payloads.Sayable | undefined
1777
- switch (sayable.getType()) {
1778
- case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
1779
- sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
1780
- break
1781
- case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
1782
- const fileJsonStr = sayable.getFileBox()
1783
- if (!fileJsonStr) {
1784
- break
1785
- }
1786
- const file = FileBoxUuid.fromJSON(fileJsonStr)
1787
- sayablePayload = PUPPET.payloads.sayable.attachment(file)
1788
- break
1789
- }
1790
- case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
1791
- const urlLinkPayloadPb = sayable.getUrlLink()
1792
- if (!urlLinkPayloadPb) {
1793
- break
1794
- }
1795
- const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
1796
- sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
1797
- break
1798
- }
1799
- case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
1800
- const channelPayloadPb = sayable.getChannel()
1801
- if (!channelPayloadPb) {
1802
- break
1803
- }
1804
- const channelPayload = channelPbToPayload(channelPayloadPb!)
1805
- sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
1806
- break
1807
- }
1808
- default:
1809
- throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
1810
- }
1811
- if (sayablePayload) {
1812
- payload.sayableList.push(sayablePayload)
1813
- } else {
1814
- throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
1815
- }
1816
- }
1817
-
1818
- const location = post.getLocation()
1819
- if (location) {
1820
- payload.location = {
1821
- name: location.getName() || '',
1822
- accuracy: location.getAccuracy() || 15,
1823
- address: location.getAddress() || '',
1824
- latitude: location.getLatitude(),
1825
- longitude: location.getLatitude(),
1826
- }
1827
- }
1815
+ const payload = postPbToPayload(post, FileBoxUuid)
1828
1816
 
1829
1817
  const momentId = await puppet.postPublish(payload)
1830
1818
  const response = new grpcPuppet.MomentPublishResponse()
@@ -1,8 +1,9 @@
1
- import type {
1
+ import {
2
2
  puppet,
3
3
  } from '@juzi/wechaty-grpc'
4
4
 
5
- import type * as PUPPET from '@juzi/wechaty-puppet'
5
+ import * as PUPPET from '@juzi/wechaty-puppet'
6
+ import type { FileBox, FileBoxInterface } from 'file-box'
6
7
 
7
8
  type grpcPuppet = typeof puppet
8
9
 
@@ -60,3 +61,119 @@ export const channelPbToPayload = (channelPayloadPb: puppet.ChannelPayload) => {
60
61
  }
61
62
  return channelPayload
62
63
  }
64
+
65
+ export const postPayloadToPb = async (grpcPuppet: grpcPuppet, payload: PUPPET.payloads.PostClient, serializeFileBox: (filebox: FileBoxInterface) => Promise<string>) => {
66
+ const pb = new grpcPuppet.PostPayloadClient()
67
+ pb.setType(payload.type || 0)
68
+ for (const item of payload.sayableList) {
69
+ const sayable = new grpcPuppet.PostSayable()
70
+ switch (item.type) {
71
+ case PUPPET.types.Sayable.Text:
72
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
73
+ sayable.setText(item.payload.text)
74
+ sayable.setMentionIdListList(item.payload.mentions)
75
+ break
76
+ case PUPPET.types.Sayable.Attachment: {
77
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
78
+ const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : (await serializeFileBox(item.payload.filebox))
79
+ sayable.setFileBox(serializedFileBox)
80
+ break
81
+ }
82
+ case PUPPET.types.Sayable.Url: {
83
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
84
+ const urlLinkPayload = item.payload
85
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
86
+ sayable.setUrlLink(pbUrlLinkPayload)
87
+ break
88
+ }
89
+ case PUPPET.types.Sayable.Channel: {
90
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
91
+ const channelPayload = item.payload
92
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
93
+ sayable.setChannel(pbChannelPayload)
94
+ break
95
+ }
96
+ default:
97
+ throw new Error(`postPublish unsupported type ${item.type}`)
98
+ }
99
+ pb.addSayableList(sayable)
100
+ }
101
+ if (payload.rootId) { pb.setRootId(payload.rootId) }
102
+ if (payload.parentId) { pb.setParentId(payload.parentId) }
103
+ if (payload.location) {
104
+ const location = new grpcPuppet.LocationPayload()
105
+ location.setAccuracy(payload.location.accuracy)
106
+ location.setAddress(payload.location.address)
107
+ location.setName(payload.location.name)
108
+ location.setLatitude(payload.location.latitude)
109
+ location.setLongitude(payload.location.longitude)
110
+ pb.setLocation(location)
111
+ }
112
+ pb.setVisibleListList(payload.visibleList || [])
113
+ return pb
114
+ }
115
+
116
+ export const postPbToPayload = (post: puppet.PostPayloadClient, FileBoxUuid: typeof FileBox) => {
117
+ const payload: PUPPET.payloads.PostClient = {
118
+ type: post.getType(),
119
+ sayableList: [],
120
+ rootId: post.getRootId(),
121
+ parentId: post.getParentId(),
122
+ visibleList: post.getVisibleListList(),
123
+ }
124
+
125
+ const sayableList = post.getSayableListList()
126
+ for (const sayable of sayableList) {
127
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
128
+ switch (sayable.getType()) {
129
+ case puppet.SayableType.SAYABLE_TYPE_TEXT:
130
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
131
+ break
132
+ case puppet.SayableType.SAYABLE_TYPE_FILE: {
133
+ const fileJsonStr = sayable.getFileBox()
134
+ if (!fileJsonStr) {
135
+ break
136
+ }
137
+ const file = FileBoxUuid.fromJSON(fileJsonStr)
138
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
139
+ break
140
+ }
141
+ case puppet.SayableType.SAYABLE_TYPE_URL: {
142
+ const urlLinkPayloadPb = sayable.getUrlLink()
143
+ if (!urlLinkPayloadPb) {
144
+ break
145
+ }
146
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
147
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
148
+ break
149
+ }
150
+ case puppet.SayableType.SAYABLE_TYPE_CHANNEL: {
151
+ const channelPayloadPb = sayable.getChannel()
152
+ if (!channelPayloadPb) {
153
+ break
154
+ }
155
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
156
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
157
+ break
158
+ }
159
+ default:
160
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
161
+ }
162
+ if (sayablePayload) {
163
+ payload.sayableList.push(sayablePayload)
164
+ } else {
165
+ throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
166
+ }
167
+ }
168
+ const location = post.getLocation()
169
+ if (location) {
170
+ payload.location = {
171
+ name: location.getName() || '',
172
+ accuracy: location.getAccuracy() || 15,
173
+ address: location.getAddress() || '',
174
+ latitude: location.getLatitude(),
175
+ longitude: location.getLatitude(),
176
+ }
177
+ }
178
+ return payload
179
+ }