@talkpilot/core-db 1.3.53 → 1.3.55

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 (258) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/AGENTS.md +49 -49
  3. package/DEVELOPMENT.md +141 -141
  4. package/README.md +778 -778
  5. package/dist/configuration/models/index.d.ts +2 -2
  6. package/dist/configuration/models/index.d.ts.map +1 -1
  7. package/dist/configuration/models/index.js +3 -1
  8. package/dist/configuration/models/index.js.map +1 -1
  9. package/dist/configuration/models/models.constants.d.ts +1 -0
  10. package/dist/configuration/models/models.constants.d.ts.map +1 -1
  11. package/dist/configuration/models/models.constants.js +2 -1
  12. package/dist/configuration/models/models.constants.js.map +1 -1
  13. package/dist/configuration/models/models.getters.d.ts +5 -0
  14. package/dist/configuration/models/models.getters.d.ts.map +1 -1
  15. package/dist/configuration/models/models.getters.js +14 -1
  16. package/dist/configuration/models/models.getters.js.map +1 -1
  17. package/dist/configuration/models/models.types.d.ts +2 -1
  18. package/dist/configuration/models/models.types.d.ts.map +1 -1
  19. package/dist/talkpilot/clients/clients.quota.constants.d.ts +2 -0
  20. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +1 -0
  21. package/dist/talkpilot/clients/clients.quota.constants.js +5 -0
  22. package/dist/talkpilot/clients/clients.quota.constants.js.map +1 -0
  23. package/dist/talkpilot/clients/clients.quota.utils.d.ts +8 -0
  24. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +1 -0
  25. package/dist/talkpilot/clients/clients.quota.utils.js +45 -0
  26. package/dist/talkpilot/clients/clients.quota.utils.js.map +1 -0
  27. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.d.ts +8 -0
  28. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.d.ts.map +1 -1
  29. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.js +9 -1
  30. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.constants.js.map +1 -1
  31. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.d.ts +2 -1
  32. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.d.ts.map +1 -1
  33. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.js +8 -1
  34. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.getters.js.map +1 -1
  35. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.d.ts +3 -1
  36. package/dist/websitalk/knowledgeDocuments/knowledgeDocuments.types.d.ts.map +1 -1
  37. package/dist/websitalk/scanResources/scanResources.constants.d.ts +9 -0
  38. package/dist/websitalk/scanResources/scanResources.constants.d.ts.map +1 -1
  39. package/dist/websitalk/scanResources/scanResources.constants.js +14 -2
  40. package/dist/websitalk/scanResources/scanResources.constants.js.map +1 -1
  41. package/dist/websitalk/scanResources/scanResources.getters.d.ts +2 -2
  42. package/dist/websitalk/scanResources/scanResources.getters.d.ts.map +1 -1
  43. package/dist/websitalk/scanResources/scanResources.getters.js +12 -6
  44. package/dist/websitalk/scanResources/scanResources.getters.js.map +1 -1
  45. package/dist/websitalk/scanResources/scanResources.types.d.ts +4 -0
  46. package/dist/websitalk/scanResources/scanResources.types.d.ts.map +1 -1
  47. package/dist/websitalk/scans/scans.constants.d.ts +1 -3
  48. package/dist/websitalk/scans/scans.constants.d.ts.map +1 -1
  49. package/dist/websitalk/scans/scans.constants.js +0 -3
  50. package/dist/websitalk/scans/scans.constants.js.map +1 -1
  51. package/dist/websitalk/scans/scans.getters.d.ts +0 -1
  52. package/dist/websitalk/scans/scans.getters.d.ts.map +1 -1
  53. package/dist/websitalk/scans/scans.getters.js +1 -6
  54. package/dist/websitalk/scans/scans.getters.js.map +1 -1
  55. package/dist/websitalk/scans/scans.types.d.ts +2 -0
  56. package/dist/websitalk/scans/scans.types.d.ts.map +1 -1
  57. package/jest.config.js +20 -20
  58. package/package.json +46 -46
  59. package/src/__tests__/setup.ts +20 -20
  60. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  61. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  62. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  63. package/src/bulkWrite/index.ts +2 -2
  64. package/src/config.ts +9 -9
  65. package/src/configuration/index.ts +17 -17
  66. package/src/configuration/internalModels/index.ts +3 -3
  67. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  68. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  69. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  70. package/src/configuration/models/__tests__/models.getters.spec.ts +67 -0
  71. package/src/configuration/models/index.ts +27 -25
  72. package/src/configuration/models/models.constants.ts +15 -13
  73. package/src/configuration/models/models.getters.ts +71 -53
  74. package/src/configuration/models/models.types.ts +80 -79
  75. package/src/configuration/mongodb-client.ts +62 -62
  76. package/src/configuration/prompts/index.ts +2 -2
  77. package/src/configuration/prompts/prompts.getters.ts +49 -49
  78. package/src/configuration/prompts/prompts.types.ts +11 -11
  79. package/src/connection.ts +81 -81
  80. package/src/index.ts +46 -46
  81. package/src/municipal/__tests__/validation.spec.ts +62 -62
  82. package/src/municipal/cities/cities.getters.ts +50 -50
  83. package/src/municipal/cities/cities.types.ts +11 -11
  84. package/src/municipal/cities/index.ts +2 -2
  85. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  86. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  87. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  88. package/src/municipal/departmentsSubjects/index.ts +9 -9
  89. package/src/municipal/index.ts +22 -22
  90. package/src/municipal/mongodb-client.ts +61 -61
  91. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  92. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  93. package/src/municipal/muniIssues/index.ts +17 -17
  94. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  95. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  96. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  97. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  98. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  99. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  100. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  101. package/src/municipal/streets/index.ts +2 -2
  102. package/src/municipal/streets/streets.getters.ts +140 -140
  103. package/src/municipal/streets/streets.types.ts +19 -19
  104. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  105. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  106. package/src/municipal/systemInstructions/index.ts +7 -7
  107. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  108. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  109. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  110. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  111. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  112. package/src/municipal/tickets/index.ts +9 -9
  113. package/src/municipal/tickets/tickets.constants.ts +8 -8
  114. package/src/municipal/tickets/tickets.getters.ts +121 -121
  115. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  116. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  117. package/src/municipal/tickets/tickets.types.ts +54 -54
  118. package/src/municipal/utils/types.ts +11 -11
  119. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  120. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  121. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  122. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  123. package/src/talkpilot/agents/agents.getters.ts +34 -34
  124. package/src/talkpilot/agents/agents.types.ts +14 -14
  125. package/src/talkpilot/agents/index.ts +2 -2
  126. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  127. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  128. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  129. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  130. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  131. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  132. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  133. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  134. package/src/talkpilot/calls/calls.constants.ts +49 -49
  135. package/src/talkpilot/calls/calls.getters.ts +277 -277
  136. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  137. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  138. package/src/talkpilot/calls/calls.types.ts +149 -149
  139. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  140. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  141. package/src/talkpilot/calls/index.ts +6 -6
  142. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  143. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  144. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  145. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  146. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  147. package/src/talkpilot/clients/clients.getters.ts +16 -16
  148. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  149. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  150. package/src/talkpilot/clients/clients.types.ts +18 -18
  151. package/src/talkpilot/clients/index.ts +4 -4
  152. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  153. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  154. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  155. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  156. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -136
  157. package/src/talkpilot/clientsConfig/index.ts +3 -3
  158. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  159. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  160. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  161. package/src/talkpilot/contextNotes/index.ts +2 -2
  162. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +124 -124
  163. package/src/talkpilot/flows/flows.getter.ts +34 -34
  164. package/src/talkpilot/flows/flows.schema.ts +180 -180
  165. package/src/talkpilot/flows/flows.types.ts +211 -211
  166. package/src/talkpilot/flows/index.ts +7 -7
  167. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  168. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  169. package/src/talkpilot/groups/groups.getters.ts +30 -30
  170. package/src/talkpilot/groups/groups.types.ts +29 -29
  171. package/src/talkpilot/groups/index.ts +3 -3
  172. package/src/talkpilot/groups/phone.utils.ts +46 -46
  173. package/src/talkpilot/index.ts +31 -31
  174. package/src/talkpilot/leads/index.ts +2 -2
  175. package/src/talkpilot/leads/leads.getter.ts +6 -6
  176. package/src/talkpilot/leads/leads.schema.ts +33 -33
  177. package/src/talkpilot/leads/leads.types.ts +20 -20
  178. package/src/talkpilot/mongodb-client.ts +78 -78
  179. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  180. package/src/talkpilot/phone_numbers/index.ts +2 -2
  181. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  182. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  183. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  184. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  185. package/src/talkpilot/plans/index.ts +2 -2
  186. package/src/talkpilot/plans/plans.getters.ts +132 -132
  187. package/src/talkpilot/plans/plans.types.ts +89 -89
  188. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  189. package/src/talkpilot/products/index.ts +2 -2
  190. package/src/talkpilot/products/products.getters.ts +12 -12
  191. package/src/talkpilot/products/products.types.ts +9 -9
  192. package/src/talkpilot/results/index.ts +7 -7
  193. package/src/talkpilot/results/results.getter.ts +39 -39
  194. package/src/talkpilot/results/results.schema.ts +25 -25
  195. package/src/talkpilot/results/results.types.ts +34 -34
  196. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  197. package/src/talkpilot/retry_analyze/index.ts +2 -2
  198. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  199. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  200. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  201. package/src/talkpilot/sessions/index.ts +2 -2
  202. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  203. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  204. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  205. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  206. package/src/talkpilot/subscriptions/index.ts +3 -3
  207. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  208. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  209. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  210. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  211. package/src/talkpilot/utils/query.utils.ts +21 -21
  212. package/src/test-utils/db-utils.ts +33 -33
  213. package/src/test-utils/factories/index.ts +18 -18
  214. package/src/test-utils/factories/municipal/cities.ts +16 -16
  215. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  216. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  217. package/src/test-utils/factories/municipal/streets.ts +22 -22
  218. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  219. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  220. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  221. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  222. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  223. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  224. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  225. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  226. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  227. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  228. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  229. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  230. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  231. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  232. package/src/utils/date.utils.ts +126 -126
  233. package/src/utils/shared.types.ts +4 -4
  234. package/src/utils/validation.ts +23 -23
  235. package/src/websitalk/index.ts +18 -18
  236. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +238 -186
  237. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  238. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +26 -17
  239. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +95 -78
  240. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +75 -62
  241. package/src/websitalk/mongodb-client.ts +61 -61
  242. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +248 -212
  243. package/src/websitalk/scanResources/index.ts +4 -4
  244. package/src/websitalk/scanResources/scanResources.constants.ts +60 -47
  245. package/src/websitalk/scanResources/scanResources.getters.ts +121 -109
  246. package/src/websitalk/scanResources/scanResources.types.ts +105 -90
  247. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  248. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -341
  249. package/src/websitalk/scans/index.ts +4 -4
  250. package/src/websitalk/scans/scans.constants.ts +15 -18
  251. package/src/websitalk/scans/scans.getters.ts +166 -171
  252. package/src/websitalk/scans/scans.types.ts +56 -54
  253. package/src/websitalk/scans/scans.utils.ts +5 -5
  254. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  255. package/src/websitalk/websiteUrls/index.ts +2 -2
  256. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  257. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  258. package/tsconfig.json +23 -23
@@ -1,57 +1,57 @@
1
- export type DashboardHeatmapMetric = {
2
- hour: number;
3
- calls: number;
4
- };
5
-
6
- export type DashboardDailyTrendMetric = {
7
- date: string;
8
- completed: number;
9
- };
10
-
11
- export type DashboardVolumeGranularity =
12
- | "hour"
13
- | "day"
14
- | "week"
15
- | "month"
16
- | "quarter"
17
- | "year";
18
-
19
- export type DashboardSummaryMetrics = {
20
- totalCalls: number;
21
- avgDurationSeconds: number;
22
- timeSavedMinutes: number;
23
- completedCount: number;
24
- inCallCount: number;
25
- };
26
-
27
- export type DashboardVisualData = {
28
- volumeData: DashboardDailyTrendMetric[];
29
- volumeGranularity: DashboardVolumeGranularity;
30
- };
31
-
32
- export type DashboardReportQuery = {
33
- clientId: string;
34
- startDate: string;
35
- endDate: string;
36
- granularity?: DashboardVolumeGranularity;
37
- };
38
-
39
- export type DashboardReportResponse = {
40
- kpis: DashboardSummaryMetrics;
41
- charts: DashboardVisualData;
42
- };
43
- type RawKpiResult = {
44
- completedCount: number;
45
- inCallCount: number;
46
- answeredDuration: number | null;
47
- };
48
-
49
- export type RawVolumeAggregationResult = {
50
- _id: string;
51
- completed: number;
52
- };
53
-
54
- export interface DashboardAggregationResult {
55
- kpis: RawKpiResult[];
56
- volumeData: RawVolumeAggregationResult[];
57
- }
1
+ export type DashboardHeatmapMetric = {
2
+ hour: number;
3
+ calls: number;
4
+ };
5
+
6
+ export type DashboardDailyTrendMetric = {
7
+ date: string;
8
+ completed: number;
9
+ };
10
+
11
+ export type DashboardVolumeGranularity =
12
+ | "hour"
13
+ | "day"
14
+ | "week"
15
+ | "month"
16
+ | "quarter"
17
+ | "year";
18
+
19
+ export type DashboardSummaryMetrics = {
20
+ totalCalls: number;
21
+ avgDurationSeconds: number;
22
+ timeSavedMinutes: number;
23
+ completedCount: number;
24
+ inCallCount: number;
25
+ };
26
+
27
+ export type DashboardVisualData = {
28
+ volumeData: DashboardDailyTrendMetric[];
29
+ volumeGranularity: DashboardVolumeGranularity;
30
+ };
31
+
32
+ export type DashboardReportQuery = {
33
+ clientId: string;
34
+ startDate: string;
35
+ endDate: string;
36
+ granularity?: DashboardVolumeGranularity;
37
+ };
38
+
39
+ export type DashboardReportResponse = {
40
+ kpis: DashboardSummaryMetrics;
41
+ charts: DashboardVisualData;
42
+ };
43
+ type RawKpiResult = {
44
+ completedCount: number;
45
+ inCallCount: number;
46
+ answeredDuration: number | null;
47
+ };
48
+
49
+ export type RawVolumeAggregationResult = {
50
+ _id: string;
51
+ completed: number;
52
+ };
53
+
54
+ export interface DashboardAggregationResult {
55
+ kpis: RawKpiResult[];
56
+ volumeData: RawVolumeAggregationResult[];
57
+ }
@@ -1,6 +1,6 @@
1
- export * from "./calls.constants";
2
- export * from "./calls.types";
3
- export * from "./calls.getters";
4
- export * from "./calls.statistics.types";
5
- export * from "./calls.statistics.getters";
6
- export * from "./dashboard/calls.dashboard";
1
+ export * from "./calls.constants";
2
+ export * from "./calls.types";
3
+ export * from "./calls.getters";
4
+ export * from "./calls.statistics.types";
5
+ export * from "./calls.statistics.getters";
6
+ export * from "./dashboard/calls.dashboard";
@@ -1,160 +1,160 @@
1
- import {
2
- getClientAudioBuffersCollection,
3
- insertClientAudioBuffer,
4
- findClientAudioBuffersByCallSidAndRange,
5
- getMergedAudioByCallSid,
6
- getAudioChunksByCallSid,
7
- } from "../clientAudioBuffer.getters";
8
- import { ObjectId } from "../../index";
9
- import { createAudioBufferInput } from "../../../test-utils/factories";
10
-
11
- describe("clientAudioBuffers getters", () => {
12
- it('should return the "clientAudioBuffers" collection', () => {
13
- const collection = getClientAudioBuffersCollection();
14
- expect(collection.collectionName).toBe("clientAudioBuffers");
15
- });
16
-
17
- it("should insert a client audio buffer and return insertedId", async () => {
18
- const inputToCheck = createAudioBufferInput();
19
- const result = await insertClientAudioBuffer(inputToCheck);
20
- expect(result.insertedId).toBeInstanceOf(ObjectId);
21
-
22
- const savedDoc = await getClientAudioBuffersCollection().findOne({
23
- _id: result.insertedId,
24
- });
25
- expect(savedDoc).toBeDefined();
26
- expect(savedDoc?.createdAt).toBeInstanceOf(Date);
27
- expect(savedDoc?.expiresAt).toBeInstanceOf(Date);
28
- });
29
-
30
- it("should return only buffers in the specified bucketStartMs range", async () => {
31
- const callSid = "CA1234567890abcdef1234567890abcdef";
32
- await insertClientAudioBuffer(
33
- createAudioBufferInput({ callSid, bucketStartMs: 500 }),
34
- );
35
- await insertClientAudioBuffer(
36
- createAudioBufferInput({ callSid, bucketStartMs: 1000 }),
37
- );
38
- await insertClientAudioBuffer(
39
- createAudioBufferInput({ callSid, bucketStartMs: 3000 }),
40
- );
41
- await insertClientAudioBuffer(
42
- createAudioBufferInput({ callSid, bucketStartMs: 6000 }),
43
- );
44
-
45
- const result = await findClientAudioBuffersByCallSidAndRange(
46
- callSid,
47
- 500,
48
- 3000,
49
- );
50
- expect(result).toHaveLength(3);
51
- const bucketStartValues = result.map((doc) => doc.bucketStartMs);
52
- const bucketStartsSorted = bucketStartValues.sort((a, b) => a - b);
53
- expect(bucketStartsSorted).toEqual([500, 1000, 3000]);
54
- });
55
-
56
- it("should return all buffers when no range is provided", async () => {
57
- const callSid = "CA1234567890abcdef1234567890abcdeg";
58
- await insertClientAudioBuffer(
59
- createAudioBufferInput({ callSid, bucketStartMs: 500 }),
60
- );
61
- await insertClientAudioBuffer(
62
- createAudioBufferInput({ callSid, bucketStartMs: 1000 }),
63
- );
64
- await insertClientAudioBuffer(
65
- createAudioBufferInput({ callSid, bucketStartMs: 3000 }),
66
- );
67
-
68
- const result = await findClientAudioBuffersByCallSidAndRange(callSid);
69
- expect(result).toHaveLength(3);
70
- const bucketStartValues = result.map((doc) => doc.bucketStartMs);
71
- const bucketStartsSorted = bucketStartValues.sort((a, b) => a - b);
72
- expect(bucketStartsSorted).toEqual([500, 1000, 3000]);
73
- });
74
-
75
- it("should merge audio buffers by callSid in chronological order", async () => {
76
- const callSid = "CA1234567890abcdef1234567890abcdeh";
77
-
78
- const firstBuffer = Buffer.from([1, 2]);
79
- const secondBuffer = Buffer.from([3]);
80
- const thirdBuffer = Buffer.from([4, 5]);
81
-
82
- await insertClientAudioBuffer(
83
- createAudioBufferInput({
84
- callSid,
85
- bucketStartMs: 1000,
86
- data: secondBuffer,
87
- }),
88
- );
89
- await insertClientAudioBuffer(
90
- createAudioBufferInput({
91
- callSid,
92
- bucketStartMs: 500,
93
- data: firstBuffer,
94
- }),
95
- );
96
- await insertClientAudioBuffer(
97
- createAudioBufferInput({
98
- callSid,
99
- bucketStartMs: 3000,
100
- data: thirdBuffer,
101
- }),
102
- );
103
-
104
- const merged = await getMergedAudioByCallSid(callSid, 10);
105
- const expected = Buffer.concat([firstBuffer, secondBuffer, thirdBuffer]);
106
-
107
- expect(merged).toBeInstanceOf(Buffer);
108
- expect(merged.length).toBe(expected.length);
109
- expect(merged.equals(expected)).toBe(true);
110
- });
111
-
112
- it("should return all audio chunks when less than or equal to limit buffers exist", async () => {
113
- const callSid = "CA1234567890abcdef1234567890abclt";
114
-
115
- const limit = 30;
116
- const buffers: Buffer[] = [];
117
- for (let i = 0; i < limit; i++) {
118
- const buf = Buffer.from([i]);
119
- buffers.push(buf);
120
- await insertClientAudioBuffer(
121
- createAudioBufferInput({
122
- callSid,
123
- bucketStartMs: 1000 + i * 1000,
124
- data: buf,
125
- }),
126
- );
127
- }
128
-
129
- const chunks = await getAudioChunksByCallSid(callSid, limit);
130
-
131
- expect(chunks).toHaveLength(buffers.length);
132
- expect(chunks.every((chunk) => chunk instanceof Buffer)).toBe(true);
133
- expect(Buffer.concat(chunks).equals(Buffer.concat(buffers))).toBe(true);
134
- });
135
-
136
- it("should return only the last N audio chunks when more than limit buffers exist", async () => {
137
- const callSid = "CA1234567890abcdef1234567890abclm";
138
-
139
- const limit = 30;
140
- const buffers: Buffer[] = [];
141
- for (let i = 0; i < 35; i++) {
142
- const buf = Buffer.from([i]);
143
- buffers.push(buf);
144
- await insertClientAudioBuffer(
145
- createAudioBufferInput({
146
- callSid,
147
- bucketStartMs: 1000 + i * 1000,
148
- data: buf,
149
- }),
150
- );
151
- }
152
-
153
- const chunks = await getAudioChunksByCallSid(callSid, limit);
154
- const expectedBuffers = buffers.slice(-limit);
155
- expect(chunks).toHaveLength(expectedBuffers.length);
156
- expect(Buffer.concat(chunks).equals(Buffer.concat(expectedBuffers))).toBe(
157
- true,
158
- );
159
- });
160
- });
1
+ import {
2
+ getClientAudioBuffersCollection,
3
+ insertClientAudioBuffer,
4
+ findClientAudioBuffersByCallSidAndRange,
5
+ getMergedAudioByCallSid,
6
+ getAudioChunksByCallSid,
7
+ } from "../clientAudioBuffer.getters";
8
+ import { ObjectId } from "../../index";
9
+ import { createAudioBufferInput } from "../../../test-utils/factories";
10
+
11
+ describe("clientAudioBuffers getters", () => {
12
+ it('should return the "clientAudioBuffers" collection', () => {
13
+ const collection = getClientAudioBuffersCollection();
14
+ expect(collection.collectionName).toBe("clientAudioBuffers");
15
+ });
16
+
17
+ it("should insert a client audio buffer and return insertedId", async () => {
18
+ const inputToCheck = createAudioBufferInput();
19
+ const result = await insertClientAudioBuffer(inputToCheck);
20
+ expect(result.insertedId).toBeInstanceOf(ObjectId);
21
+
22
+ const savedDoc = await getClientAudioBuffersCollection().findOne({
23
+ _id: result.insertedId,
24
+ });
25
+ expect(savedDoc).toBeDefined();
26
+ expect(savedDoc?.createdAt).toBeInstanceOf(Date);
27
+ expect(savedDoc?.expiresAt).toBeInstanceOf(Date);
28
+ });
29
+
30
+ it("should return only buffers in the specified bucketStartMs range", async () => {
31
+ const callSid = "CA1234567890abcdef1234567890abcdef";
32
+ await insertClientAudioBuffer(
33
+ createAudioBufferInput({ callSid, bucketStartMs: 500 }),
34
+ );
35
+ await insertClientAudioBuffer(
36
+ createAudioBufferInput({ callSid, bucketStartMs: 1000 }),
37
+ );
38
+ await insertClientAudioBuffer(
39
+ createAudioBufferInput({ callSid, bucketStartMs: 3000 }),
40
+ );
41
+ await insertClientAudioBuffer(
42
+ createAudioBufferInput({ callSid, bucketStartMs: 6000 }),
43
+ );
44
+
45
+ const result = await findClientAudioBuffersByCallSidAndRange(
46
+ callSid,
47
+ 500,
48
+ 3000,
49
+ );
50
+ expect(result).toHaveLength(3);
51
+ const bucketStartValues = result.map((doc) => doc.bucketStartMs);
52
+ const bucketStartsSorted = bucketStartValues.sort((a, b) => a - b);
53
+ expect(bucketStartsSorted).toEqual([500, 1000, 3000]);
54
+ });
55
+
56
+ it("should return all buffers when no range is provided", async () => {
57
+ const callSid = "CA1234567890abcdef1234567890abcdeg";
58
+ await insertClientAudioBuffer(
59
+ createAudioBufferInput({ callSid, bucketStartMs: 500 }),
60
+ );
61
+ await insertClientAudioBuffer(
62
+ createAudioBufferInput({ callSid, bucketStartMs: 1000 }),
63
+ );
64
+ await insertClientAudioBuffer(
65
+ createAudioBufferInput({ callSid, bucketStartMs: 3000 }),
66
+ );
67
+
68
+ const result = await findClientAudioBuffersByCallSidAndRange(callSid);
69
+ expect(result).toHaveLength(3);
70
+ const bucketStartValues = result.map((doc) => doc.bucketStartMs);
71
+ const bucketStartsSorted = bucketStartValues.sort((a, b) => a - b);
72
+ expect(bucketStartsSorted).toEqual([500, 1000, 3000]);
73
+ });
74
+
75
+ it("should merge audio buffers by callSid in chronological order", async () => {
76
+ const callSid = "CA1234567890abcdef1234567890abcdeh";
77
+
78
+ const firstBuffer = Buffer.from([1, 2]);
79
+ const secondBuffer = Buffer.from([3]);
80
+ const thirdBuffer = Buffer.from([4, 5]);
81
+
82
+ await insertClientAudioBuffer(
83
+ createAudioBufferInput({
84
+ callSid,
85
+ bucketStartMs: 1000,
86
+ data: secondBuffer,
87
+ }),
88
+ );
89
+ await insertClientAudioBuffer(
90
+ createAudioBufferInput({
91
+ callSid,
92
+ bucketStartMs: 500,
93
+ data: firstBuffer,
94
+ }),
95
+ );
96
+ await insertClientAudioBuffer(
97
+ createAudioBufferInput({
98
+ callSid,
99
+ bucketStartMs: 3000,
100
+ data: thirdBuffer,
101
+ }),
102
+ );
103
+
104
+ const merged = await getMergedAudioByCallSid(callSid, 10);
105
+ const expected = Buffer.concat([firstBuffer, secondBuffer, thirdBuffer]);
106
+
107
+ expect(merged).toBeInstanceOf(Buffer);
108
+ expect(merged.length).toBe(expected.length);
109
+ expect(merged.equals(expected)).toBe(true);
110
+ });
111
+
112
+ it("should return all audio chunks when less than or equal to limit buffers exist", async () => {
113
+ const callSid = "CA1234567890abcdef1234567890abclt";
114
+
115
+ const limit = 30;
116
+ const buffers: Buffer[] = [];
117
+ for (let i = 0; i < limit; i++) {
118
+ const buf = Buffer.from([i]);
119
+ buffers.push(buf);
120
+ await insertClientAudioBuffer(
121
+ createAudioBufferInput({
122
+ callSid,
123
+ bucketStartMs: 1000 + i * 1000,
124
+ data: buf,
125
+ }),
126
+ );
127
+ }
128
+
129
+ const chunks = await getAudioChunksByCallSid(callSid, limit);
130
+
131
+ expect(chunks).toHaveLength(buffers.length);
132
+ expect(chunks.every((chunk) => chunk instanceof Buffer)).toBe(true);
133
+ expect(Buffer.concat(chunks).equals(Buffer.concat(buffers))).toBe(true);
134
+ });
135
+
136
+ it("should return only the last N audio chunks when more than limit buffers exist", async () => {
137
+ const callSid = "CA1234567890abcdef1234567890abclm";
138
+
139
+ const limit = 30;
140
+ const buffers: Buffer[] = [];
141
+ for (let i = 0; i < 35; i++) {
142
+ const buf = Buffer.from([i]);
143
+ buffers.push(buf);
144
+ await insertClientAudioBuffer(
145
+ createAudioBufferInput({
146
+ callSid,
147
+ bucketStartMs: 1000 + i * 1000,
148
+ data: buf,
149
+ }),
150
+ );
151
+ }
152
+
153
+ const chunks = await getAudioChunksByCallSid(callSid, limit);
154
+ const expectedBuffers = buffers.slice(-limit);
155
+ expect(chunks).toHaveLength(expectedBuffers.length);
156
+ expect(Buffer.concat(chunks).equals(Buffer.concat(expectedBuffers))).toBe(
157
+ true,
158
+ );
159
+ });
160
+ });