@messenger-box/platform-client 10.0.3-alpha.36 → 10.0.3-alpha.38
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/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.0.3-alpha.38](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.37...v10.0.3-alpha.38) (2025-04-25)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @messenger-box/platform-client
|
|
9
|
+
|
|
10
|
+
## [10.0.3-alpha.37](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.36...v10.0.3-alpha.37) (2025-04-25)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @messenger-box/platform-client
|
|
13
|
+
|
|
6
14
|
## [10.0.3-alpha.36](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.35...v10.0.3-alpha.36) (2025-04-23)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @messenger-box/platform-client
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-policies.d.ts","sourceRoot":"","sources":["../../../src/graphql/policies/messages-policies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"messages-policies.d.ts","sourceRoot":"","sources":["../../../src/graphql/policies/messages-policies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,gBAAgB,EAAE,YA8T9B,CAAC"}
|
|
@@ -27,29 +27,50 @@ const messagesPolicies = {
|
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
data: {
|
|
30
|
-
keyArgs:
|
|
30
|
+
keyArgs: ['channelId', 'parentId'],
|
|
31
31
|
merge: (existing = [], incoming = [], {
|
|
32
|
-
readField
|
|
33
|
-
mergeObjects
|
|
32
|
+
readField
|
|
34
33
|
}) => {
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
// Use a Map for O(1) lookups instead of array iterations
|
|
35
|
+
const existingMap = new Map();
|
|
36
|
+
// Populate map with existing messages
|
|
37
|
+
if (existing && existing.length > 0) {
|
|
38
|
+
for (let i = 0; i < existing.length; i++) {
|
|
39
|
+
const id = readField('id', existing[i]);
|
|
40
|
+
if (id) {
|
|
41
|
+
existingMap.set(id, existing[i]);
|
|
42
|
+
}
|
|
44
43
|
}
|
|
45
|
-
}
|
|
46
|
-
|
|
44
|
+
}
|
|
45
|
+
// Create result array with same capacity as total items
|
|
46
|
+
const result = [];
|
|
47
|
+
// Add incoming items, overwriting existing ones
|
|
48
|
+
if (incoming && incoming.length > 0) {
|
|
49
|
+
for (let i = 0; i < incoming.length; i++) {
|
|
50
|
+
const item = incoming[i];
|
|
51
|
+
const id = readField('id', item);
|
|
52
|
+
if (id) {
|
|
53
|
+
existingMap.set(id, item);
|
|
54
|
+
}
|
|
55
|
+
result.push(item);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Add remaining existing items not in incoming
|
|
59
|
+
if (existing && existing.length > 0) {
|
|
60
|
+
for (let i = 0; i < existing.length; i++) {
|
|
61
|
+
const id = readField('id', existing[i]);
|
|
62
|
+
if (id && !result.some(item => readField('id', item) === id)) {
|
|
63
|
+
result.push(existing[i]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
47
68
|
}
|
|
48
69
|
},
|
|
49
70
|
totalCount: {
|
|
50
|
-
keyArgs:
|
|
71
|
+
keyArgs: ['channelId', 'parentId'],
|
|
51
72
|
merge(existing, incoming) {
|
|
52
|
-
return
|
|
73
|
+
return incoming !== undefined ? incoming : existing;
|
|
53
74
|
}
|
|
54
75
|
}
|
|
55
76
|
// data: {
|
|
@@ -96,32 +117,203 @@ const messagesPolicies = {
|
|
|
96
117
|
Query: {
|
|
97
118
|
fields: {
|
|
98
119
|
messages: {
|
|
99
|
-
|
|
100
|
-
|
|
120
|
+
keyArgs: ['channelId', 'parentId'],
|
|
121
|
+
merge(existing, incoming, {
|
|
122
|
+
args,
|
|
123
|
+
readField
|
|
124
|
+
}) {
|
|
125
|
+
if (!incoming) return existing;
|
|
126
|
+
if (!existing) return incoming;
|
|
127
|
+
// Fast return if incoming has no data
|
|
128
|
+
if (!incoming.data || incoming.data.length === 0) {
|
|
129
|
+
return {
|
|
130
|
+
...existing,
|
|
131
|
+
totalCount: incoming.totalCount ?? existing.totalCount
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Fast return if existing has no data
|
|
135
|
+
if (!existing.data || existing.data.length === 0) {
|
|
136
|
+
return incoming;
|
|
137
|
+
}
|
|
138
|
+
// Determine if this is likely a new message or pagination
|
|
139
|
+
const isNewMessage = args && args.skip === 0;
|
|
140
|
+
// Create a map for existing messages for fast lookups
|
|
141
|
+
const idSet = new Set();
|
|
142
|
+
const mergedData = [...existing.data];
|
|
143
|
+
// Mark all existing IDs
|
|
144
|
+
for (let i = 0; i < mergedData.length; i++) {
|
|
145
|
+
const id = readField('id', mergedData[i]);
|
|
146
|
+
if (id) idSet.add(id);
|
|
147
|
+
}
|
|
148
|
+
// Process incoming messages
|
|
149
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
150
|
+
const incomingMsg = incoming.data[i];
|
|
151
|
+
const id = readField('id', incomingMsg);
|
|
152
|
+
if (!id) continue;
|
|
153
|
+
if (idSet.has(id)) {
|
|
154
|
+
// Replace existing message with same ID
|
|
155
|
+
const existingIndex = mergedData.findIndex(msg => readField('id', msg) === id);
|
|
156
|
+
if (existingIndex >= 0) {
|
|
157
|
+
mergedData[existingIndex] = incomingMsg;
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
// Add new message
|
|
161
|
+
if (isNewMessage) {
|
|
162
|
+
// Add to beginning for new messages
|
|
163
|
+
mergedData.unshift(incomingMsg);
|
|
164
|
+
} else {
|
|
165
|
+
// Add to end for pagination
|
|
166
|
+
mergedData.push(incomingMsg);
|
|
167
|
+
}
|
|
168
|
+
idSet.add(id);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
...existing,
|
|
173
|
+
totalCount: incoming.totalCount ?? existing.totalCount,
|
|
174
|
+
data: mergedData
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
FilesInfo: {
|
|
181
|
+
merge: true,
|
|
182
|
+
// Use default merging behavior for FilesInfo
|
|
183
|
+
fields: {
|
|
184
|
+
data: {
|
|
185
|
+
merge(existing = [], incoming = [], {
|
|
186
|
+
readField
|
|
187
|
+
}) {
|
|
188
|
+
// If no existing data, just return incoming
|
|
189
|
+
if (!existing || existing.length === 0) {
|
|
190
|
+
return incoming;
|
|
191
|
+
}
|
|
192
|
+
// If no incoming data, keep existing
|
|
193
|
+
if (!incoming || incoming.length === 0) {
|
|
194
|
+
return existing;
|
|
195
|
+
}
|
|
196
|
+
// Create a map for efficient lookup
|
|
197
|
+
const fileMap = new Map();
|
|
198
|
+
// Add existing files to map
|
|
199
|
+
for (let i = 0; i < existing.length; i++) {
|
|
200
|
+
const file = existing[i];
|
|
201
|
+
if (file) {
|
|
202
|
+
const id = readField('id', file);
|
|
203
|
+
if (id) {
|
|
204
|
+
fileMap.set(id, file);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Merge in incoming files, overwriting existing ones
|
|
209
|
+
for (let i = 0; i < incoming.length; i++) {
|
|
210
|
+
const file = incoming[i];
|
|
211
|
+
if (file) {
|
|
212
|
+
const id = readField('id', file);
|
|
213
|
+
if (id) {
|
|
214
|
+
fileMap.set(id, file);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Convert map values back to array
|
|
219
|
+
return Array.from(fileMap.values());
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
FileInfo: {
|
|
225
|
+
// Use ID as key field
|
|
226
|
+
keyFields: ['id'],
|
|
227
|
+
fields: {
|
|
228
|
+
url: {
|
|
229
|
+
// Ensure URL is always preserved and not normalized
|
|
101
230
|
merge(existing, incoming) {
|
|
231
|
+
return incoming ?? existing;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
Post: {
|
|
237
|
+
fields: {
|
|
238
|
+
replies: {
|
|
239
|
+
merge(existing, incoming) {
|
|
240
|
+
if (!incoming) return existing;
|
|
241
|
+
if (!existing) return incoming;
|
|
242
|
+
// Use a Set for fast duplicate checking
|
|
243
|
+
const uniqueIds = new Set();
|
|
244
|
+
const mergedData = [];
|
|
245
|
+
// Add all existing items to the result and track IDs
|
|
246
|
+
if (existing.data && existing.data.length > 0) {
|
|
247
|
+
for (let i = 0; i < existing.data.length; i++) {
|
|
248
|
+
const item = existing.data[i];
|
|
249
|
+
if (item && item.id && !uniqueIds.has(item.id)) {
|
|
250
|
+
uniqueIds.add(item.id);
|
|
251
|
+
mergedData.push(item);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Add incoming items that don't exist yet
|
|
256
|
+
if (incoming.data && incoming.data.length > 0) {
|
|
257
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
258
|
+
const item = incoming.data[i];
|
|
259
|
+
if (item && item.id && !uniqueIds.has(item.id)) {
|
|
260
|
+
uniqueIds.add(item.id);
|
|
261
|
+
mergedData.push(item);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
102
265
|
return {
|
|
103
266
|
...incoming,
|
|
104
|
-
data:
|
|
267
|
+
data: mergedData
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
files: {
|
|
272
|
+
merge(existing, incoming, {
|
|
273
|
+
readField
|
|
274
|
+
}) {
|
|
275
|
+
if (!incoming) return existing;
|
|
276
|
+
if (!existing) return incoming;
|
|
277
|
+
// If either has no data or totalCount is 0, prefer the one with data
|
|
278
|
+
if (!existing.data || existing.data.length === 0) {
|
|
279
|
+
return incoming;
|
|
280
|
+
}
|
|
281
|
+
if (!incoming.data || incoming.data.length === 0) {
|
|
282
|
+
return existing;
|
|
283
|
+
}
|
|
284
|
+
// Create a map for efficient lookup
|
|
285
|
+
const fileMap = new Map();
|
|
286
|
+
// Add existing files to map
|
|
287
|
+
if (existing.data) {
|
|
288
|
+
for (let i = 0; i < existing.data.length; i++) {
|
|
289
|
+
const file = existing.data[i];
|
|
290
|
+
if (file) {
|
|
291
|
+
const id = readField('id', file);
|
|
292
|
+
if (id) {
|
|
293
|
+
fileMap.set(id, file);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Merge in incoming files, overwriting existing ones
|
|
299
|
+
if (incoming.data) {
|
|
300
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
301
|
+
const file = incoming.data[i];
|
|
302
|
+
if (file) {
|
|
303
|
+
const id = readField('id', file);
|
|
304
|
+
if (id) {
|
|
305
|
+
fileMap.set(id, file);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Create merged result
|
|
311
|
+
return {
|
|
312
|
+
__typename: 'FilesInfo',
|
|
313
|
+
totalCount: Math.max(existing.totalCount || 0, incoming.totalCount || 0, fileMap.size),
|
|
314
|
+
data: Array.from(fileMap.values())
|
|
105
315
|
};
|
|
106
316
|
}
|
|
107
|
-
// merge(existing, incoming, { args, mergeObjects }) {
|
|
108
|
-
// console.log('existing length', existing?.data?.length);
|
|
109
|
-
// console.log('incoming length', incoming?.data?.length);
|
|
110
|
-
// // console.log('existing', JSON.stringify(existing), 'incoming', JSON.stringify(incoming));
|
|
111
|
-
// if (!incoming || incoming?.data?.length) return existing;
|
|
112
|
-
// if (!existing || existing?.data?.length) return incoming;
|
|
113
|
-
// //console.log('existing', JSON.stringify(existing), 'incoming', JSON.stringify(incoming));
|
|
114
|
-
// const mergedData = existing ? existing?.data?.slice(0) : [];
|
|
115
|
-
// // Insert the incoming elements in the right places, according to args.
|
|
116
|
-
// const end = args?.skip + Math.min(args?.limit, incoming?.data?.length);
|
|
117
|
-
// for (let i = args?.skip; i < end; ++i) {
|
|
118
|
-
// mergedData[i] = incoming?.data[i - args?.skip];
|
|
119
|
-
// }
|
|
120
|
-
// const merged = { ...incoming, data: mergedData };
|
|
121
|
-
// return merged;
|
|
122
|
-
// // return mergeObjects(existing, incoming);
|
|
123
|
-
// //return existing ? { ...existing, ...incoming } : incoming;
|
|
124
|
-
// },
|
|
125
317
|
}
|
|
126
318
|
}
|
|
127
319
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-policies.js","sources":["../../../src/graphql/policies/messages-policies.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEa,MAAA,gBAAgB,GAAiB;AAC1C,EAAA,QAAA,EAAQ;;;;AAIJ,IAAA,MAAA,EAAA;AACI,MAAA,EAAA,EAAA;AACI,QAAA,IAAA,CAAA,QAAK,EAAA;AACD,UAAA;AACA,SAAA,EAAA;gBACJ;AACH,YAAA,SAAA;AACD,YAAA;AACI,WAAA,GAAA,SAAK;AACD,UAAA,OAAA,QAAA,GAAQ,CAAS,EAAA,qBAAoB,iBAAU,CAAA,CAAA;AAC/C;;AAEP,MAAA,aAAA,EAAA;AACD,QAAA,IAAA,CAAA,QAAM,EAAA;AACF,UAAA;AACA,SAAA,EAAA;;
|
|
1
|
+
{"version":3,"file":"messages-policies.js","sources":["../../../src/graphql/policies/messages-policies.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEa,MAAA,gBAAgB,GAAiB;AAC1C,EAAA,QAAA,EAAQ;;;;AAIJ,IAAA,MAAA,EAAA;AACI,MAAA,EAAA,EAAA;AACI,QAAA,IAAA,CAAA,QAAK,EAAA;AACD,UAAA;AACA,SAAA,EAAA;gBACJ;AACH,YAAA,SAAA;AACD,YAAA;AACI,WAAA,GAAA,SAAK;AACD,UAAA,OAAA,QAAA,GAAQ,CAAS,EAAA,qBAAoB,iBAAU,CAAA,CAAA;AAC/C;;AAEP,MAAA,aAAA,EAAA;AACD,QAAA,IAAA,CAAA,QAAM,EAAA;AACF,UAAA;AACA,SAAA,EAAA;;AAEI,YAAA,SAAA;;uBAGI;AACA,UAAA,OAAA,QAAA,GAAA,CAAK,EAAI,SAAO,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAM,GAAA,CAAA,EAAA,SAAQ,CAAA,CAAA;;;;6BAItC,EAAA,UAAA,CAAA;wBACL,GAAC,EAAA,EAAA,QAAA,GAAA,EAAA,EAAA;;;;2BAM2C,GAAA,IAAA,GAAA,EAAA;;AAE5C,UAAA,IAAA,QAAA,IAAA,QAAU,CAAG,MAAI,GAAG,CAAQ,EAAA;AACxB,YAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAa,CAAA,MAAA,EAAQ,CAAC,EAAE,EAAC;kCACnB,CAAA,IAAK,EAAS,QAAC,IAAI;;AAErB,gBAAA,WAAA,CAAA,GAAA,CAAA,EAAA,EAAA,QAAY,CAAG,CAAA,CAAA,CAAC;;AAEpB;;;sBAIuC,GAAA,EAAA;;AAE3C,UAAA,IAAA,QAAA,IAAA,QAAU,CAAG,MAAI,GAAG,CAAQ,EAAA;4BACxB,CAAM,GAAA,QAAK,CAAA,MAAA,EAAU,CAAA,EAAA,EAAM;sCACjB;kCACA,CAAA,IAAC,MAAK,CAAA;;2BAEnB,CAAA,GAAA,CAAA,EAAA,EAAA,IAAA,CAAA;;AAGL,cAAA,MAAA,CAAA,IAAA,CAAA;;AAEP;AACD;AACI,UAAA,IAAA,QAAA,IAAU,QAAW,CAAA;iBAChB,IAAA,CAAC,GAAQ,CAAA,EAAA,CAAA,GAAE,QAAQ,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;oBACpB,EAAO,GAAA,SAAA,CAAQ,IAAK,EAAA,QAAS,CAAC,CAAC,CAAC,CAAA;kBACnC,EAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,IAAA,IAAA,SAAA,CAAA,IAAA,EAAA,IAAA,CAAA,KAAA,EAAA,CAAA,EAAA;AACJ,gBAAA,MAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CAAA,CAAA,CAAA;;;;iBAI2D,MAAA;;;gBAGT,EAAA;eACC,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA;aACxC,CAAA,QAAA,EAAA,QAAA,EAAA;iBACa,QAAA,KAAA,SAAA,GAAA,QAAA,GAAA,QAAA;;;AAG5B;AACJ;AACD;;AAEI;AACI;AACI;AACI;AACA;;AAEP;AACD;AACI;AACI,GAAA;AACA,EAAA,kBAAA,EAAA;;AAEP,IAAA,MAAA,EAAA;AACJ,MAAA,mBAAA,EAAA;AACJ,QAAA,IAAA,CAAA,QAAA,EAAA;AACD,UAAO;AACH,SAAA,EAAA;AACI,UAAA,MAAA;AACI,YAAA,SAAA;;AAEI,WAAA,GAAA,SAAA;AAAe,UAAA,OAAA,QAAA,GAAA,CAAA,EAAO,SAAS,CAAA,CAAA,EAAA,QAAA,CAAA,CAAA,GAAA,CAAA,EAAA,SAAA,CAAA,CAAA;AAC/B;AAAe,OAAA;;AAGf,QAAA,IAAA,CAAA,QAAA,EAAA;;AAEQ,SAAA,EAAA;AACA,UAAA,MAAA;;;uBAI8B;AACtC,UAAA,OAAA,QAAK,GAAA,CAAA,EAAA,SAAiB,CAAA,CAAA,EAAA,QAAS,CAAA,CAAA,GAAK,CAAA,EAAA,UAAc,CAAC;AAC/C;;;;;AAOJ,IAAA,MAAA,EAAA;;6BAGwB,EAAA,UAAA,CAAA;AACxB,QAAA,KAAA,CAAA,QAAA,EAAA,QAAa,EAAC;;AAEV,UAAA;AAAQ,SAAA,EAAA;uBACX,EAAA,OAAA,QAAA;uBAE2B,EAAA,OAAA,QAAA;AAC5B;wBACI,IAAM,IAAA,QAAA,CAAW,IAAW,CAAA,MAAA,KAAK,CAAC,EAAE;;AAGpC,cAAA,GAAA,QAAA;kCAAkB,CAAA,UAAA,IAAA,QAAA,CAAA;AAElB,aAAA;;;AAGI,UAAA,IAAA,CAAA,QAAA,CAAA,IAAA,IAAI,QAAa,CAAA,IAAA,CAAA,MAAO,KAAC,CAAA,EAAA;AACrB,YAAA,OAAA,QAAA;;;+BAEA,IAAA,IAAA,IAAA,CAAA,IAAA,KAAA,CAAA;;4BAEJ,GAAI,EAAA;iCACoC,QAAA,CAAA,IAAA,CAAA;AACpC;8BACH,UAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;iCAAM,IAAC,EAAA,UAAA,CAAA,CAAA,CAAA,CAAA;gCACJ,CAA4B;AAC5B;;AAEJ,UAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAU,CAAA,IAAI,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;6BACjB,GAAA,QAAA,CAAA,IAAA,CAAA,CAAA,CAAA;oBACL,GAAC,SAAA,CAAA,IAAA,EAAA,WAAA,CAAA;qBAEM;AACH,YAAA,IAAA,KAAA,CAAA,GAAA,CAAA,EAAW,CAAA,EAAA;AACX;AACA,cAAA,MAAA,aAAgB,GAAA,UAAA,CAAA,SAAA,CAAA,GAAA,IAAA,SAAA,CAAA,IAAA,EAAA,GAAA,CAAA,KAAA,EAAA,CAAA;+BAClB,IAAA,CAAA,EAAA;gBACN,UAAC,CAAA,aAAA,CAAA,GAAA,WAAA;AACJ;AACJ,aAAA,MAAA;AACJ;AACD,cAAW,IAAA,YAAA,EAAA;;AAEP,gBAAQ,UAAA,CAAA,OAAA,CAAA,WAAA,CAAA;AACJ,eAAA,MAAM;;0BAE8C,CAAA,IAAA,CAAA,WAAA,CAAA;;AAExC,cAAA,KAAA,CAAA,GAAA,CAAA,EAAA,CAAA;;;;AAKA,YAAA,GAAA,QAAA;sBACH,EAAA,QAAA,CAAA,UAAA,IAAA,QAAA,CAAA,UAAA;;AAGD,WAAA;;AAGA;AACI;;;;AAIQ;;;sBAGX,GAAA,EAAA,EAAA,QAAA,GAAA,EAAA,EAAA;;AAGD,SAAA,EAAA;AACI;2BACI,QAAO,CAAA,MAAA,KAAA,CAAA,EAAA;;;AAGH;mCACH,CAAA,MAAA,KAAA,CAAA,EAAA;2BACJ;;;uBAIE,GAAA,IAAA,GAAM,EAAI;;AAExB,UAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;AACJ,YAAA,MAAA,IAAA,GAAA,QAAA,CAAA,CAAA,CAAA;AACJ,YAAA,IAAA,IAAA,EAAA;AACD,cAAU,MAAA,EAAA,GAAA,SAAA,CAAA,IAAA,EAAA,IAAA,CAAA;cACgB,IAAA,EAAA,EAAA;gBACb,OAAG,CAAI,GAAC,CAAA,EAAA,EAAA,IAAA,CAAA;AACjB;AACI;;;oBAGQ,GAAO,CAAA,EAAA,CAAA,GAAA,QAAY,CAAA,MAAA,EAAQ,CAAC,EAAA,EAAA;kBAC/B,IAAA,GAAA,QAAA,CAAA,CAAA,CAAA;AACJ,YAAA,IAAA,IAAA,EAAA;AACJ,cAAA,MAAA,EAAA,GAAA,SAAA,CAAA,IAAA,EAAA,IAAA,CAAA;AACJ,cAAA,IAAA,EAAA,EAAA;AACD,gBAAM,OAAA,CAAA,GAAA,CAAA,EAAA,EAAA,IAAA,CAAA;AACF;AACI;;AAEQ;AAAe,UAAA,OAAA,KAAA,CAAA,IAAA,CAAA,cAAgB,EAAA,CAAA;AAC/B;AAAe;;AAGf,GAAA;;;AAIA,IAAA,SAAA,EAAA,CAAA,IAAA,CAAA;AACI,IAAA,MAAA,EAAA;;AAEI;AACI,QAAA,KAAA,CAAA,QAAA,EAAA,QAAA,EAAA;AACA,UAAA,OAAA,QAAA,IAAA,QAAA;;;;;AAMZ,EAAA,IAAA,EAAA;AACI,IAAA,MAAA,EAAA;;AAEI,QAAA,KAAA,CAAA,QAAA,EAAA,QAAI;AACA,UAAA,IAAA,CAAA,QAAA,EAAA,OAAA,QAAA;AACA,UAAA,IAAA,CAAA,QAAA,EAAA,OAAA,QAAA;;yBAEP,GAAA,IAAA,GAAA,EAAA;0BACJ,GAAA,EAAA;;AAGG,UAAA,IAAA,QAAA,CAAA,IAAG,IAAQ,QAAA,CAAA,IAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACX,YAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAI,IAAY,QAAA,CAAA,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;wBAClB,GAAA,QAAA,CAAA,IAAA,CAAA,CAAA,CAAA;kBACL,IAAA,IAAA,IAAA,CAAA,EAAA,IAAA,CAAA,SAAA,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA,CAAA,EAAA;AACJ,gBAAA,SAAA,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA,CAAA;AACD,gBAAA,UAAO,CAAA,IAAA,CAAA,IAAA,CAAA;AACH;AACI;AAAe;AACf;AAAe,UAAA,IAAA,QAAA,CAAA,IAAA,IAAO,QAAQ,CAAC,IAAA,CAAA,MAAA,GAAA,CAAA,EAAA;qBAEsC,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;AACrE,cAAA,MAAA,IAAI,GAAC,QAAS,CAAA,IAAQ,CAAA,CAAA,CAAA;AAClB,cAAA,IAAA,IAAA,IAAA,IAAA,CAAO,gBAAS,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA,CAAA,EAAA;yBACnB,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA,CAAA;AAED,gBAAA,UAAK,CAAA,IAAA,CAAA,IAAS,CAAA;AACV;;;AAIJ,UAAA,OAAA;uBAE4B;AAC5B,YAAA,IAAA,EAAA;AACI,WAAA;;;;gCAIQ,EAAI;AACA,UAAA;;gCAEP,QAAA;yBACJ,OAAA,QAAA;;uBAGgD,CAAA,IAAA,IAAA,QAAA,CAAA,IAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AACrD,YAAA,OAAA,QAAY;AACR;4BACI,IAAM,SAAO,IAAQ,CAAA,WAAQ,CAAC,EAAA;;;;AAItB,UAAA,MAAA,OAAA,GAAA,IAAA,GAAA,EAAA;;6BAEP;yBACJ,CAAA,EAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;oBACL,IAAC,GAAA,QAAA,CAAA,IAAA,CAAA,CAAA,CAAA;sBAEsB,EAAA;sBAChB,EAAA,GAAA,SAAA,CAAA,IAAA,EAAA,IAAA,CAAA;AACH,gBAAA,IAAA,EAAA,EAAA;yBACU,CAAA,GAAA,CAAA,EAAA,EAAA;;;;AAIrB;AACJ;AACJ,UAAA,IAAA,QAAA,CAAA,IAAA,EAAA;YACH,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@messenger-box/platform-client",
|
|
3
|
-
"version": "10.0.3-alpha.
|
|
3
|
+
"version": "10.0.3-alpha.38",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"typescript": {
|
|
36
36
|
"definition": "lib/index.d.ts"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "1b4c409ed6591e28e3b0d6d08c6ff55b6bca54ce"
|
|
39
39
|
}
|
|
@@ -19,27 +19,53 @@ export const messagesPolicies: TypePolicies = {
|
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
data: {
|
|
22
|
-
keyArgs:
|
|
23
|
-
merge: (existing = [], incoming = [], { readField
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
keyArgs: ['channelId', 'parentId'],
|
|
23
|
+
merge: (existing = [], incoming = [], { readField }) => {
|
|
24
|
+
// Use a Map for O(1) lookups instead of array iterations
|
|
25
|
+
const existingMap = new Map();
|
|
26
|
+
|
|
27
|
+
// Populate map with existing messages
|
|
28
|
+
if (existing && existing.length > 0) {
|
|
29
|
+
for (let i = 0; i < existing.length; i++) {
|
|
30
|
+
const id = readField('id', existing[i]);
|
|
31
|
+
if (id) {
|
|
32
|
+
existingMap.set(id, existing[i]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Create result array with same capacity as total items
|
|
38
|
+
const result = [];
|
|
39
|
+
|
|
40
|
+
// Add incoming items, overwriting existing ones
|
|
41
|
+
if (incoming && incoming.length > 0) {
|
|
42
|
+
for (let i = 0; i < incoming.length; i++) {
|
|
43
|
+
const item = incoming[i];
|
|
44
|
+
const id = readField('id', item);
|
|
45
|
+
if (id) {
|
|
46
|
+
existingMap.set(id, item);
|
|
47
|
+
}
|
|
48
|
+
result.push(item);
|
|
34
49
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Add remaining existing items not in incoming
|
|
53
|
+
if (existing && existing.length > 0) {
|
|
54
|
+
for (let i = 0; i < existing.length; i++) {
|
|
55
|
+
const id = readField('id', existing[i]);
|
|
56
|
+
if (id && !result.some((item) => readField('id', item) === id)) {
|
|
57
|
+
result.push(existing[i]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return result;
|
|
37
63
|
},
|
|
38
64
|
},
|
|
39
65
|
totalCount: {
|
|
40
|
-
keyArgs:
|
|
66
|
+
keyArgs: ['channelId', 'parentId'],
|
|
41
67
|
merge(existing, incoming) {
|
|
42
|
-
return
|
|
68
|
+
return incoming !== undefined ? incoming : existing;
|
|
43
69
|
},
|
|
44
70
|
},
|
|
45
71
|
// data: {
|
|
@@ -57,7 +83,7 @@ export const messagesPolicies: TypePolicies = {
|
|
|
57
83
|
},
|
|
58
84
|
},
|
|
59
85
|
PostThreadMessages: {
|
|
60
|
-
|
|
86
|
+
// keyFields: ['threadmessagesRefId'],
|
|
61
87
|
fields: {
|
|
62
88
|
threadmessagesRefId: {
|
|
63
89
|
read(existing, { variables }) {
|
|
@@ -76,33 +102,219 @@ export const messagesPolicies: TypePolicies = {
|
|
|
76
102
|
Query: {
|
|
77
103
|
fields: {
|
|
78
104
|
messages: {
|
|
79
|
-
|
|
80
|
-
|
|
105
|
+
keyArgs: ['channelId', 'parentId'],
|
|
106
|
+
merge(existing, incoming, { args, readField }) {
|
|
107
|
+
if (!incoming) return existing;
|
|
108
|
+
if (!existing) return incoming;
|
|
109
|
+
|
|
110
|
+
// Fast return if incoming has no data
|
|
111
|
+
if (!incoming.data || incoming.data.length === 0) {
|
|
112
|
+
return {
|
|
113
|
+
...existing,
|
|
114
|
+
totalCount: incoming.totalCount ?? existing.totalCount,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fast return if existing has no data
|
|
119
|
+
if (!existing.data || existing.data.length === 0) {
|
|
120
|
+
return incoming;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Determine if this is likely a new message or pagination
|
|
124
|
+
const isNewMessage = args && args.skip === 0;
|
|
125
|
+
|
|
126
|
+
// Create a map for existing messages for fast lookups
|
|
127
|
+
const idSet = new Set();
|
|
128
|
+
const mergedData = [...existing.data];
|
|
129
|
+
|
|
130
|
+
// Mark all existing IDs
|
|
131
|
+
for (let i = 0; i < mergedData.length; i++) {
|
|
132
|
+
const id = readField('id', mergedData[i]);
|
|
133
|
+
if (id) idSet.add(id);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Process incoming messages
|
|
137
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
138
|
+
const incomingMsg = incoming.data[i];
|
|
139
|
+
const id = readField('id', incomingMsg);
|
|
140
|
+
|
|
141
|
+
if (!id) continue;
|
|
142
|
+
|
|
143
|
+
if (idSet.has(id)) {
|
|
144
|
+
// Replace existing message with same ID
|
|
145
|
+
const existingIndex = mergedData.findIndex((msg) => readField('id', msg) === id);
|
|
146
|
+
if (existingIndex >= 0) {
|
|
147
|
+
mergedData[existingIndex] = incomingMsg;
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
// Add new message
|
|
151
|
+
if (isNewMessage) {
|
|
152
|
+
// Add to beginning for new messages
|
|
153
|
+
mergedData.unshift(incomingMsg);
|
|
154
|
+
} else {
|
|
155
|
+
// Add to end for pagination
|
|
156
|
+
mergedData.push(incomingMsg);
|
|
157
|
+
}
|
|
158
|
+
idSet.add(id);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
...existing,
|
|
164
|
+
totalCount: incoming.totalCount ?? existing.totalCount,
|
|
165
|
+
data: mergedData,
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
FilesInfo: {
|
|
172
|
+
merge: true, // Use default merging behavior for FilesInfo
|
|
173
|
+
fields: {
|
|
174
|
+
data: {
|
|
175
|
+
merge(existing = [], incoming = [], { readField }) {
|
|
176
|
+
// If no existing data, just return incoming
|
|
177
|
+
if (!existing || existing.length === 0) {
|
|
178
|
+
return incoming;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// If no incoming data, keep existing
|
|
182
|
+
if (!incoming || incoming.length === 0) {
|
|
183
|
+
return existing;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Create a map for efficient lookup
|
|
187
|
+
const fileMap = new Map();
|
|
188
|
+
|
|
189
|
+
// Add existing files to map
|
|
190
|
+
for (let i = 0; i < existing.length; i++) {
|
|
191
|
+
const file = existing[i];
|
|
192
|
+
if (file) {
|
|
193
|
+
const id = readField('id', file);
|
|
194
|
+
if (id) {
|
|
195
|
+
fileMap.set(id, file);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Merge in incoming files, overwriting existing ones
|
|
201
|
+
for (let i = 0; i < incoming.length; i++) {
|
|
202
|
+
const file = incoming[i];
|
|
203
|
+
if (file) {
|
|
204
|
+
const id = readField('id', file);
|
|
205
|
+
if (id) {
|
|
206
|
+
fileMap.set(id, file);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Convert map values back to array
|
|
212
|
+
return Array.from(fileMap.values());
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
FileInfo: {
|
|
218
|
+
// Use ID as key field
|
|
219
|
+
keyFields: ['id'],
|
|
220
|
+
fields: {
|
|
221
|
+
url: {
|
|
222
|
+
// Ensure URL is always preserved and not normalized
|
|
81
223
|
merge(existing, incoming) {
|
|
224
|
+
return incoming ?? existing;
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
Post: {
|
|
230
|
+
fields: {
|
|
231
|
+
replies: {
|
|
232
|
+
merge(existing, incoming) {
|
|
233
|
+
if (!incoming) return existing;
|
|
234
|
+
if (!existing) return incoming;
|
|
235
|
+
|
|
236
|
+
// Use a Set for fast duplicate checking
|
|
237
|
+
const uniqueIds = new Set();
|
|
238
|
+
const mergedData = [];
|
|
239
|
+
|
|
240
|
+
// Add all existing items to the result and track IDs
|
|
241
|
+
if (existing.data && existing.data.length > 0) {
|
|
242
|
+
for (let i = 0; i < existing.data.length; i++) {
|
|
243
|
+
const item = existing.data[i];
|
|
244
|
+
if (item && item.id && !uniqueIds.has(item.id)) {
|
|
245
|
+
uniqueIds.add(item.id);
|
|
246
|
+
mergedData.push(item);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Add incoming items that don't exist yet
|
|
252
|
+
if (incoming.data && incoming.data.length > 0) {
|
|
253
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
254
|
+
const item = incoming.data[i];
|
|
255
|
+
if (item && item.id && !uniqueIds.has(item.id)) {
|
|
256
|
+
uniqueIds.add(item.id);
|
|
257
|
+
mergedData.push(item);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
82
262
|
return {
|
|
83
263
|
...incoming,
|
|
84
|
-
data:
|
|
264
|
+
data: mergedData,
|
|
265
|
+
};
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
files: {
|
|
269
|
+
merge(existing, incoming, { readField }) {
|
|
270
|
+
if (!incoming) return existing;
|
|
271
|
+
if (!existing) return incoming;
|
|
272
|
+
|
|
273
|
+
// If either has no data or totalCount is 0, prefer the one with data
|
|
274
|
+
if (!existing.data || existing.data.length === 0) {
|
|
275
|
+
return incoming;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (!incoming.data || incoming.data.length === 0) {
|
|
279
|
+
return existing;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Create a map for efficient lookup
|
|
283
|
+
const fileMap = new Map();
|
|
284
|
+
|
|
285
|
+
// Add existing files to map
|
|
286
|
+
if (existing.data) {
|
|
287
|
+
for (let i = 0; i < existing.data.length; i++) {
|
|
288
|
+
const file = existing.data[i];
|
|
289
|
+
if (file) {
|
|
290
|
+
const id = readField('id', file);
|
|
291
|
+
if (id) {
|
|
292
|
+
fileMap.set(id, file);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Merge in incoming files, overwriting existing ones
|
|
299
|
+
if (incoming.data) {
|
|
300
|
+
for (let i = 0; i < incoming.data.length; i++) {
|
|
301
|
+
const file = incoming.data[i];
|
|
302
|
+
if (file) {
|
|
303
|
+
const id = readField('id', file);
|
|
304
|
+
if (id) {
|
|
305
|
+
fileMap.set(id, file);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Create merged result
|
|
312
|
+
return {
|
|
313
|
+
__typename: 'FilesInfo',
|
|
314
|
+
totalCount: Math.max(existing.totalCount || 0, incoming.totalCount || 0, fileMap.size),
|
|
315
|
+
data: Array.from(fileMap.values()),
|
|
85
316
|
};
|
|
86
317
|
},
|
|
87
|
-
// merge(existing, incoming, { args, mergeObjects }) {
|
|
88
|
-
// console.log('existing length', existing?.data?.length);
|
|
89
|
-
// console.log('incoming length', incoming?.data?.length);
|
|
90
|
-
// // console.log('existing', JSON.stringify(existing), 'incoming', JSON.stringify(incoming));
|
|
91
|
-
// if (!incoming || incoming?.data?.length) return existing;
|
|
92
|
-
// if (!existing || existing?.data?.length) return incoming;
|
|
93
|
-
// //console.log('existing', JSON.stringify(existing), 'incoming', JSON.stringify(incoming));
|
|
94
|
-
// const mergedData = existing ? existing?.data?.slice(0) : [];
|
|
95
|
-
// // Insert the incoming elements in the right places, according to args.
|
|
96
|
-
// const end = args?.skip + Math.min(args?.limit, incoming?.data?.length);
|
|
97
|
-
// for (let i = args?.skip; i < end; ++i) {
|
|
98
|
-
// mergedData[i] = incoming?.data[i - args?.skip];
|
|
99
|
-
// }
|
|
100
|
-
|
|
101
|
-
// const merged = { ...incoming, data: mergedData };
|
|
102
|
-
// return merged;
|
|
103
|
-
// // return mergeObjects(existing, incoming);
|
|
104
|
-
// //return existing ? { ...existing, ...incoming } : incoming;
|
|
105
|
-
// },
|
|
106
318
|
},
|
|
107
319
|
},
|
|
108
320
|
},
|