@talkpilot/core-db 1.3.46 → 1.3.48

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 (242) 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 +777 -747
  5. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +1 -0
  6. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  7. package/dist/websitalk/scanResources/scanResources.getters.d.ts.map +1 -1
  8. package/dist/websitalk/scanResources/scanResources.getters.js +3 -2
  9. package/dist/websitalk/scanResources/scanResources.getters.js.map +1 -1
  10. package/dist/websitalk/scanResources/scanResources.utils.d.ts +1 -0
  11. package/dist/websitalk/scanResources/scanResources.utils.d.ts.map +1 -1
  12. package/dist/websitalk/scanResources/scanResources.utils.js +3 -1
  13. package/dist/websitalk/scanResources/scanResources.utils.js.map +1 -1
  14. package/jest.config.js +20 -20
  15. package/package.json +46 -46
  16. package/src/__tests__/setup.ts +20 -20
  17. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  18. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  19. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  20. package/src/bulkWrite/index.ts +2 -2
  21. package/src/config.ts +9 -9
  22. package/src/configuration/index.ts +17 -17
  23. package/src/configuration/internalModels/index.ts +3 -3
  24. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  25. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  26. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  27. package/src/configuration/models/index.ts +25 -25
  28. package/src/configuration/models/models.constants.ts +13 -13
  29. package/src/configuration/models/models.getters.ts +53 -53
  30. package/src/configuration/models/models.types.ts +79 -79
  31. package/src/configuration/mongodb-client.ts +62 -62
  32. package/src/configuration/prompts/index.ts +2 -2
  33. package/src/configuration/prompts/prompts.getters.ts +49 -49
  34. package/src/configuration/prompts/prompts.types.ts +11 -11
  35. package/src/connection.ts +81 -81
  36. package/src/index.ts +46 -46
  37. package/src/municipal/__tests__/validation.spec.ts +62 -62
  38. package/src/municipal/cities/cities.getters.ts +50 -50
  39. package/src/municipal/cities/cities.types.ts +11 -11
  40. package/src/municipal/cities/index.ts +2 -2
  41. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  42. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  43. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  44. package/src/municipal/departmentsSubjects/index.ts +9 -9
  45. package/src/municipal/index.ts +22 -22
  46. package/src/municipal/mongodb-client.ts +61 -61
  47. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  48. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  49. package/src/municipal/muniIssues/index.ts +17 -17
  50. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  51. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  52. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  53. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  54. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  55. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  56. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  57. package/src/municipal/streets/index.ts +2 -2
  58. package/src/municipal/streets/streets.getters.ts +140 -140
  59. package/src/municipal/streets/streets.types.ts +19 -19
  60. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  61. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  62. package/src/municipal/systemInstructions/index.ts +7 -7
  63. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  64. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  65. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  66. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  67. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  68. package/src/municipal/tickets/index.ts +9 -9
  69. package/src/municipal/tickets/tickets.constants.ts +8 -8
  70. package/src/municipal/tickets/tickets.getters.ts +121 -121
  71. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  72. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  73. package/src/municipal/tickets/tickets.types.ts +54 -54
  74. package/src/municipal/utils/types.ts +11 -11
  75. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  76. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  77. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  78. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  79. package/src/talkpilot/agents/agents.getters.ts +34 -34
  80. package/src/talkpilot/agents/agents.types.ts +14 -14
  81. package/src/talkpilot/agents/index.ts +2 -2
  82. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  83. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  84. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  85. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  86. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  87. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  88. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  89. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  90. package/src/talkpilot/calls/calls.constants.ts +49 -49
  91. package/src/talkpilot/calls/calls.getters.ts +277 -277
  92. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  93. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  94. package/src/talkpilot/calls/calls.types.ts +149 -149
  95. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  96. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  97. package/src/talkpilot/calls/index.ts +6 -6
  98. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  99. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  100. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  101. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  102. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  103. package/src/talkpilot/clients/clients.getters.ts +16 -16
  104. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  105. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  106. package/src/talkpilot/clients/clients.types.ts +18 -18
  107. package/src/talkpilot/clients/index.ts +4 -4
  108. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  109. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  110. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  111. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  112. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -135
  113. package/src/talkpilot/clientsConfig/index.ts +3 -3
  114. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  115. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  116. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  117. package/src/talkpilot/contextNotes/index.ts +2 -2
  118. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  119. package/src/talkpilot/flows/flows.getter.ts +14 -14
  120. package/src/talkpilot/flows/flows.schema.ts +155 -155
  121. package/src/talkpilot/flows/flows.types.ts +189 -189
  122. package/src/talkpilot/flows/index.ts +2 -2
  123. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  124. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  125. package/src/talkpilot/groups/groups.getters.ts +30 -30
  126. package/src/talkpilot/groups/groups.types.ts +29 -29
  127. package/src/talkpilot/groups/index.ts +3 -3
  128. package/src/talkpilot/groups/phone.utils.ts +46 -46
  129. package/src/talkpilot/index.ts +31 -31
  130. package/src/talkpilot/leads/index.ts +2 -2
  131. package/src/talkpilot/leads/leads.getter.ts +6 -6
  132. package/src/talkpilot/leads/leads.schema.ts +33 -33
  133. package/src/talkpilot/leads/leads.types.ts +20 -20
  134. package/src/talkpilot/mongodb-client.ts +78 -78
  135. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  136. package/src/talkpilot/phone_numbers/index.ts +2 -2
  137. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  138. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  139. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  140. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  141. package/src/talkpilot/plans/index.ts +2 -2
  142. package/src/talkpilot/plans/plans.getters.ts +132 -132
  143. package/src/talkpilot/plans/plans.types.ts +89 -89
  144. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  145. package/src/talkpilot/products/index.ts +2 -2
  146. package/src/talkpilot/products/products.getters.ts +12 -12
  147. package/src/talkpilot/products/products.types.ts +9 -9
  148. package/src/talkpilot/results/index.ts +7 -7
  149. package/src/talkpilot/results/results.getter.ts +39 -39
  150. package/src/talkpilot/results/results.schema.ts +25 -25
  151. package/src/talkpilot/results/results.types.ts +34 -34
  152. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  153. package/src/talkpilot/retry_analyze/index.ts +2 -2
  154. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  155. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  156. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  157. package/src/talkpilot/sessions/index.ts +2 -2
  158. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  159. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  160. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  161. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  162. package/src/talkpilot/subscriptions/index.ts +3 -3
  163. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  164. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  165. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  166. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  167. package/src/talkpilot/utils/query.utils.ts +21 -21
  168. package/src/test-utils/db-utils.ts +33 -33
  169. package/src/test-utils/factories/index.ts +18 -18
  170. package/src/test-utils/factories/municipal/cities.ts +16 -16
  171. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  172. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  173. package/src/test-utils/factories/municipal/streets.ts +22 -22
  174. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  175. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  176. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  177. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  178. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  179. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  180. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  181. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  182. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  183. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  184. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  185. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  186. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  187. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  188. package/src/utils/date.utils.ts +126 -126
  189. package/src/utils/shared.types.ts +4 -4
  190. package/src/utils/validation.ts +23 -23
  191. package/src/websitalk/index.ts +18 -18
  192. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
  193. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  194. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
  195. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
  196. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
  197. package/src/websitalk/mongodb-client.ts +61 -61
  198. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +193 -136
  199. package/src/websitalk/scanResources/index.ts +4 -4
  200. package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
  201. package/src/websitalk/scanResources/scanResources.getters.ts +102 -94
  202. package/src/websitalk/scanResources/scanResources.types.ts +90 -90
  203. package/src/websitalk/scanResources/scanResources.utils.ts +31 -28
  204. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  205. package/src/websitalk/scans/index.ts +4 -4
  206. package/src/websitalk/scans/scans.constants.ts +15 -15
  207. package/src/websitalk/scans/scans.getters.ts +166 -166
  208. package/src/websitalk/scans/scans.types.ts +54 -54
  209. package/src/websitalk/scans/scans.utils.ts +5 -5
  210. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  211. package/src/websitalk/websiteUrls/index.ts +2 -2
  212. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  213. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  214. package/tsconfig.json +23 -23
  215. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  216. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  217. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  218. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  219. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  220. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  221. package/dist/municipal/streets/streets.setters.js +0 -15
  222. package/dist/municipal/streets/streets.setters.js.map +0 -1
  223. package/dist/reconcile/index.d.ts +0 -5
  224. package/dist/reconcile/index.d.ts.map +0 -1
  225. package/dist/reconcile/index.js +0 -21
  226. package/dist/reconcile/index.js.map +0 -1
  227. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  228. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  229. package/dist/reconcile/reconcile.diff.js +0 -36
  230. package/dist/reconcile/reconcile.diff.js.map +0 -1
  231. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  232. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  233. package/dist/reconcile/reconcile.execute.js +0 -20
  234. package/dist/reconcile/reconcile.execute.js.map +0 -1
  235. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  236. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  237. package/dist/reconcile/reconcile.ops.js +0 -24
  238. package/dist/reconcile/reconcile.ops.js.map +0 -1
  239. package/dist/reconcile/reconcile.types.d.ts +0 -32
  240. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  241. package/dist/reconcile/reconcile.types.js +0 -3
  242. package/dist/reconcile/reconcile.types.js.map +0 -1
@@ -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
+ });