@enbox/dwn-sdk-js 0.4.17 → 0.4.18

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 (77) hide show
  1. package/dist/browser.mjs +1 -1
  2. package/dist/browser.mjs.map +4 -4
  3. package/dist/esm/generated/precompiled-validators.js +349 -198
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/handlers/records-collection.js +200 -0
  6. package/dist/esm/src/handlers/records-collection.js.map +1 -0
  7. package/dist/esm/src/handlers/records-count.js +19 -196
  8. package/dist/esm/src/handlers/records-count.js.map +1 -1
  9. package/dist/esm/src/handlers/records-query.js +19 -376
  10. package/dist/esm/src/handlers/records-query.js.map +1 -1
  11. package/dist/esm/src/handlers/records-subscribe.js +21 -341
  12. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  13. package/dist/esm/src/interfaces/records-count.js +1 -1
  14. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  15. package/dist/esm/src/interfaces/records-query.js +1 -1
  16. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  17. package/dist/esm/src/interfaces/records-subscribe.js +3 -1
  18. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  19. package/dist/esm/src/store/index-level.js +84 -32
  20. package/dist/esm/src/store/index-level.js.map +1 -1
  21. package/dist/esm/src/store/message-store-level.js +45 -11
  22. package/dist/esm/src/store/message-store-level.js.map +1 -1
  23. package/dist/esm/src/utils/record-limit-occupancy.js +5 -2
  24. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -1
  25. package/dist/esm/src/utils/records.js +14 -47
  26. package/dist/esm/src/utils/records.js.map +1 -1
  27. package/dist/esm/tests/features/records-nested-query-scope.spec.js +15 -1
  28. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -1
  29. package/dist/esm/tests/features/records-record-limit.spec.js +116 -0
  30. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  31. package/dist/esm/tests/handlers/records-count.spec.js +52 -1
  32. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  33. package/dist/esm/tests/handlers/records-subscribe.spec.js +76 -1
  34. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  35. package/dist/esm/tests/store/index-level.spec.js +95 -1
  36. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  37. package/dist/esm/tests/store/message-store-level.spec.js +70 -1
  38. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  39. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  40. package/dist/types/src/handlers/records-collection.d.ts +32 -0
  41. package/dist/types/src/handlers/records-collection.d.ts.map +1 -0
  42. package/dist/types/src/handlers/records-count.d.ts +0 -35
  43. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  44. package/dist/types/src/handlers/records-query.d.ts +0 -61
  45. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  46. package/dist/types/src/handlers/records-subscribe.d.ts +1 -37
  47. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  48. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  49. package/dist/types/src/store/index-level.d.ts +27 -3
  50. package/dist/types/src/store/index-level.d.ts.map +1 -1
  51. package/dist/types/src/store/message-store-level.d.ts +1 -0
  52. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  53. package/dist/types/src/types/message-store.d.ts +6 -1
  54. package/dist/types/src/types/message-store.d.ts.map +1 -1
  55. package/dist/types/src/types/records-types.d.ts +1 -1
  56. package/dist/types/src/types/records-types.d.ts.map +1 -1
  57. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
  58. package/dist/types/src/utils/records.d.ts +6 -25
  59. package/dist/types/src/utils/records.d.ts.map +1 -1
  60. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -1
  61. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  62. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  63. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/src/handlers/records-collection.ts +269 -0
  66. package/src/handlers/records-count.ts +21 -236
  67. package/src/handlers/records-query.ts +22 -447
  68. package/src/handlers/records-subscribe.ts +26 -404
  69. package/src/interfaces/records-count.ts +1 -1
  70. package/src/interfaces/records-query.ts +1 -1
  71. package/src/interfaces/records-subscribe.ts +5 -2
  72. package/src/store/index-level.ts +145 -37
  73. package/src/store/message-store-level.ts +46 -11
  74. package/src/types/message-store.ts +6 -1
  75. package/src/types/records-types.ts +1 -1
  76. package/src/utils/record-limit-occupancy.ts +5 -2
  77. package/src/utils/records.ts +17 -52
@@ -0,0 +1,200 @@
1
+ import { authenticate } from '../core/auth.js';
2
+ import { DateSort } from '../types/records-types.js';
3
+ import { EncryptionControl } from '../core/encryption-control.js';
4
+ import { Message } from '../core/message.js';
5
+ import { ProtocolAuthorization } from '../core/protocol-authorization.js';
6
+ import { Records } from '../utils/records.js';
7
+ import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
8
+ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
9
+ import { queryRecordsWithRecordLimitOccupancy, resolveRecordLimitOccupancy } from '../utils/record-limit-occupancy.js';
10
+ /**
11
+ * Resolves the visible population for a Records collection request, authenticating and
12
+ * authorizing every request that is not an anonymous published-records read.
13
+ */
14
+ export async function resolveRecordsCollectionVisibility(tenant, request, deps) {
15
+ const recordsFilter = request.message.descriptor.filter;
16
+ if (Records.filterIncludesPublishedRecords(recordsFilter) && request.author === undefined) {
17
+ return 'published';
18
+ }
19
+ await authenticate(request.message.authorization, deps.didResolver);
20
+ if (Message.isSignedByAuthorDelegate(request.message) && !EncryptionControl.filterTargetsOnlyControlRecords(recordsFilter)) {
21
+ await request.authorizeDelegate(deps.validationStateReader);
22
+ }
23
+ else if (EncryptionControl.filterTargetsOnlyControlRecords(recordsFilter)) {
24
+ await EncryptionControl.authorizeControlReadRequest({
25
+ tenant,
26
+ incomingMessage: request.message,
27
+ requester: Message.getRequester(request.message),
28
+ validationStateReader: deps.validationStateReader,
29
+ });
30
+ }
31
+ const permissionGrantId = Message.getPermissionGrantId(request.signaturePayload);
32
+ if (permissionGrantId !== undefined) {
33
+ const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
34
+ await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
35
+ incomingMessage: request.message,
36
+ expectedGrantor: tenant,
37
+ expectedGrantee: request.author,
38
+ permissionGrant,
39
+ validationStateReader: deps.validationStateReader,
40
+ });
41
+ }
42
+ else if (invokesProtocolRole(request)) {
43
+ // A protocol filter alone does not require protocol authorization because unauthorized
44
+ // records are removed by the visibility filters. An invoked protocol role does.
45
+ await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, request, deps.validationStateReader);
46
+ }
47
+ return request.author === tenant ? 'owner' : 'nonOwner';
48
+ }
49
+ /** Builds latest-write filters shared by Records Query, Count, and Subscribe snapshots. */
50
+ export function buildRecordsSnapshotFilters(request, visibility) {
51
+ const descriptor = request.message.descriptor;
52
+ const dateSort = 'dateSort' in descriptor ? descriptor.dateSort : undefined;
53
+ return buildRecordsVisibilityFilters({
54
+ request,
55
+ visibility,
56
+ filter: descriptor.filter,
57
+ purpose: 'snapshot',
58
+ dateSort,
59
+ });
60
+ }
61
+ /** Builds Write-and-Delete filters for Records Subscribe event delivery. */
62
+ export function buildRecordsEventFilters(request, visibility) {
63
+ return buildRecordsVisibilityFilters({
64
+ request,
65
+ visibility,
66
+ filter: request.message.descriptor.filter,
67
+ purpose: 'event',
68
+ });
69
+ }
70
+ /**
71
+ * Queries one visible Records page after applying record-limit occupancy, current-audience
72
+ * projection, and encryption-control authorization in their required order.
73
+ */
74
+ export async function queryVisibleRecordsPage(input) {
75
+ const { deps, request, tenant, visibility } = input;
76
+ const { dateSort, filter, messageTimestamp, pagination } = request.message.descriptor;
77
+ const filters = buildRecordsSnapshotFilters(request, visibility);
78
+ const recordLimit = await resolveRecordLimitOccupancy({
79
+ validationStateReader: deps.validationStateReader,
80
+ tenant,
81
+ recordsFilter: filter,
82
+ messageTimestamp,
83
+ });
84
+ const controlFilters = Records.buildControlRecordsFilters(filters);
85
+ const currentAudienceRecordIdCache = new Map();
86
+ const requester = Message.getRequester(request.message);
87
+ const messageSort = Records.convertDateSort(dateSort ?? DateSort.CreatedAscending);
88
+ const queryProjectedPage = async (page = pagination) => {
89
+ const result = await queryRecordsWithRecordLimitOccupancy({
90
+ messageStore: deps.messageStore,
91
+ tenant,
92
+ filters,
93
+ recordLimit,
94
+ messageSort,
95
+ pagination: page,
96
+ });
97
+ return EncryptionControl.projectCurrentAudienceRecordPage({
98
+ messageStore: deps.messageStore,
99
+ tenant,
100
+ filters,
101
+ currentAudienceRecordIdCache,
102
+ result,
103
+ });
104
+ };
105
+ const filterVisibleControlRecords = (messages) => EncryptionControl.filterVisibleControlRecords({
106
+ tenant,
107
+ incomingMessage: request.message,
108
+ requester,
109
+ recordsWriteMessages: messages,
110
+ validationStateReader: deps.validationStateReader,
111
+ });
112
+ if (controlFilters.length === 0) {
113
+ return queryProjectedPage();
114
+ }
115
+ if (pagination?.limit === undefined || pagination.limit <= 0) {
116
+ const result = await queryProjectedPage();
117
+ return {
118
+ messages: await filterVisibleControlRecords(result.messages),
119
+ cursor: result.cursor,
120
+ };
121
+ }
122
+ const visibleMessages = [];
123
+ let cursor = pagination.cursor;
124
+ let nextCursor;
125
+ // Keeps visible-page pagination stable until #1100 moves control visibility into indexed store filters.
126
+ do {
127
+ const remainingLimit = pagination.limit - visibleMessages.length;
128
+ const result = await queryProjectedPage({ ...pagination, cursor, limit: remainingLimit });
129
+ visibleMessages.push(...await filterVisibleControlRecords(result.messages));
130
+ nextCursor = result.cursor;
131
+ cursor = result.cursor;
132
+ } while (visibleMessages.length < pagination.limit && cursor !== undefined);
133
+ return { messages: visibleMessages, cursor: nextCursor };
134
+ }
135
+ function buildRecordsVisibilityFilters(input) {
136
+ const { dateSort, filter, purpose, request, visibility } = input;
137
+ if (visibility === 'owner') {
138
+ return [buildRecordsFilter({ dateSort, filter, purpose })];
139
+ }
140
+ if (visibility === 'published') {
141
+ return [buildRecordsFilter({ dateSort, filter, purpose, published: true })];
142
+ }
143
+ const filters = [];
144
+ if (Records.filterIncludesPublishedRecords(filter)) {
145
+ filters.push(buildRecordsFilter({ dateSort, filter, purpose, published: true }));
146
+ }
147
+ if (!Records.filterIncludesUnpublishedRecords(filter)) {
148
+ return filters;
149
+ }
150
+ if (EncryptionControl.isExactAudienceFilter(filter)) {
151
+ filters.push(buildRecordsFilter({ dateSort, filter, purpose, published: false }));
152
+ }
153
+ if (shouldBuildUnpublishedAuthorFilter(filter, request.author)) {
154
+ filters.push(buildRecordsFilter({ author: request.author, dateSort, filter, purpose, published: false }));
155
+ }
156
+ if (invokesProtocolRole(request) || Message.getPermissionGrantId(request.signaturePayload) !== undefined) {
157
+ filters.push(buildRecordsFilter({ dateSort, filter, purpose, published: false }));
158
+ }
159
+ if (shouldBuildUnpublishedRecipientFilter(filter, request.author)) {
160
+ filters.push(buildRecordsFilter({ dateSort, filter, purpose, published: false, recipient: request.author }));
161
+ }
162
+ return filters;
163
+ }
164
+ function buildRecordsFilter(input) {
165
+ const { author, dateSort, filter, purpose, published, recipient } = input;
166
+ const result = {
167
+ ...Records.convertFilter(filter, purpose === 'snapshot' ? dateSort : undefined),
168
+ interface: DwnInterfaceName.Records,
169
+ method: purpose === 'snapshot' ? DwnMethodName.Write : [DwnMethodName.Write, DwnMethodName.Delete],
170
+ };
171
+ if (purpose === 'snapshot') {
172
+ result.isLatestBaseState = true;
173
+ }
174
+ if (author !== undefined) {
175
+ result.author = author;
176
+ }
177
+ if (published !== undefined) {
178
+ result.published = published;
179
+ }
180
+ if (recipient !== undefined) {
181
+ result.recipient = recipient;
182
+ }
183
+ return result;
184
+ }
185
+ function invokesProtocolRole(request) {
186
+ return request.signaturePayload?.protocolRole !== undefined;
187
+ }
188
+ function shouldBuildUnpublishedRecipientFilter(filter, recipient) {
189
+ const { recipient: recipientFilter } = filter;
190
+ return Array.isArray(recipientFilter)
191
+ ? recipientFilter.length === 0 || recipientFilter.includes(recipient)
192
+ : recipientFilter === undefined || recipientFilter === recipient;
193
+ }
194
+ function shouldBuildUnpublishedAuthorFilter(filter, author) {
195
+ const { author: authorFilter } = filter;
196
+ return Array.isArray(authorFilter)
197
+ ? authorFilter.length === 0 || authorFilter.includes(author)
198
+ : authorFilter === undefined || authorFilter === author;
199
+ }
200
+ //# sourceMappingURL=records-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-collection.js","sourceRoot":"","sources":["../../../../src/handlers/records-collection.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,10 @@
1
- import { authenticate } from '../core/auth.js';
2
1
  import { EncryptionControl } from '../core/encryption-control.js';
3
2
  import { Message } from '../core/message.js';
4
3
  import { messageReplyFromError } from '../core/message-reply.js';
5
- import { ProtocolAuthorization } from '../core/protocol-authorization.js';
6
4
  import { Records } from '../utils/records.js';
7
5
  import { RecordsCount } from '../interfaces/records-count.js';
8
- import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
6
+ import { buildRecordsSnapshotFilters, resolveRecordsCollectionVisibility } from './records-collection.js';
9
7
  import { countRecordsWithRecordLimitOccupancy, queryRecordsWithRecordLimitOccupancy, resolveRecordLimitOccupancy, } from '../utils/record-limit-occupancy.js';
10
- import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
11
8
  export class RecordsCountHandler {
12
9
  deps;
13
10
  constructor(deps) {
@@ -18,98 +15,32 @@ export class RecordsCountHandler {
18
15
  try {
19
16
  recordsCount = await RecordsCount.parse(message);
20
17
  }
21
- catch (e) {
22
- return messageReplyFromError(e, 400);
18
+ catch (error) {
19
+ return messageReplyFromError(error, 400);
23
20
  }
24
- let count;
25
21
  const requester = Message.getRequester(recordsCount.message);
26
- // if this is an anonymous count and the filter supports published records, count only published records
27
- if (Records.filterIncludesPublishedRecords(recordsCount.message.descriptor.filter) && recordsCount.author === undefined) {
28
- count = await this.countPublishedRecords(tenant, recordsCount, requester);
22
+ let visibility;
23
+ try {
24
+ visibility = await resolveRecordsCollectionVisibility(tenant, recordsCount, this.deps);
29
25
  }
30
- else {
31
- // authentication and authorization
32
- try {
33
- await authenticate(message.authorization, this.deps.didResolver);
34
- await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps);
35
- }
36
- catch (e) {
37
- return messageReplyFromError(e, 401);
38
- }
39
- if (recordsCount.author === tenant && requester === tenant) {
40
- count = await this.countRecordsAsOwner(tenant, recordsCount);
41
- }
42
- else if (recordsCount.author === tenant) {
43
- count = await this.countRecordsAsOwnerDelegate(tenant, recordsCount, requester);
44
- }
45
- else {
46
- count = await this.countRecordsAsNonOwner(tenant, recordsCount, requester);
47
- }
26
+ catch (error) {
27
+ return messageReplyFromError(error, 401);
48
28
  }
29
+ const filters = buildRecordsSnapshotFilters(recordsCount, visibility);
30
+ const recordLimit = await resolveRecordLimitOccupancy({
31
+ validationStateReader: this.deps.validationStateReader,
32
+ tenant,
33
+ recordsFilter: recordsCount.message.descriptor.filter,
34
+ messageTimestamp: recordsCount.message.descriptor.messageTimestamp,
35
+ });
36
+ const count = recordsCount.author === tenant && requester === tenant
37
+ ? await this.countProjectedRecords(tenant, filters, recordLimit)
38
+ : await this.countProjectedRecordsForRequester(tenant, recordsCount, requester, filters, recordLimit);
49
39
  return {
50
40
  status: { code: 200, detail: 'OK' },
51
41
  count,
52
42
  };
53
43
  }
54
- /**
55
- * Counts records as the owner of the DWN with no additional filtering.
56
- */
57
- async countRecordsAsOwner(tenant, recordsCount) {
58
- const { filter } = recordsCount.message.descriptor;
59
- const countFilter = {
60
- ...Records.convertFilter(filter),
61
- interface: DwnInterfaceName.Records,
62
- method: DwnMethodName.Write,
63
- isLatestBaseState: true
64
- };
65
- const recordLimit = await this.resolveRecordLimit(tenant, recordsCount);
66
- return this.countProjectedRecords(tenant, [countFilter], recordLimit);
67
- }
68
- async countRecordsAsOwnerDelegate(tenant, recordsCount, requester) {
69
- const { filter } = recordsCount.message.descriptor;
70
- const countFilter = {
71
- ...Records.convertFilter(filter),
72
- interface: DwnInterfaceName.Records,
73
- method: DwnMethodName.Write,
74
- isLatestBaseState: true
75
- };
76
- return this.countProjectedRecordsForRequester(tenant, recordsCount, requester, [countFilter]);
77
- }
78
- /**
79
- * Counts records as a non-owner, applying the same filter logic as RecordsQuery.
80
- */
81
- async countRecordsAsNonOwner(tenant, recordsCount, requester) {
82
- const { filter } = recordsCount.message.descriptor;
83
- const filters = [];
84
- if (Records.filterIncludesPublishedRecords(filter)) {
85
- filters.push(RecordsCountHandler.buildPublishedRecordsFilter(recordsCount));
86
- }
87
- if (Records.filterIncludesUnpublishedRecords(filter)) {
88
- if (EncryptionControl.isExactAudienceFilter(filter)) {
89
- filters.push(Records.buildUnpublishedControlRecordsFilter(filter));
90
- }
91
- if (Records.shouldBuildUnpublishedAuthorFilter(filter, recordsCount.author)) {
92
- filters.push(RecordsCountHandler.buildUnpublishedRecordsByCountAuthorFilter(recordsCount));
93
- }
94
- if (Records.shouldProtocolAuthorize(recordsCount.signaturePayload)) {
95
- filters.push(RecordsCountHandler.buildUnpublishedProtocolAuthorizedRecordsFilter(recordsCount));
96
- }
97
- if (Message.getPermissionGrantId(recordsCount.signaturePayload) !== undefined) {
98
- filters.push(RecordsCountHandler.buildUnpublishedPermissionGrantAuthorizedRecordsFilter(recordsCount));
99
- }
100
- if (Records.shouldBuildUnpublishedRecipientFilter(filter, recordsCount.author)) {
101
- filters.push(RecordsCountHandler.buildUnpublishedRecordsForCountAuthorFilter(recordsCount));
102
- }
103
- }
104
- return this.countProjectedRecordsForRequester(tenant, recordsCount, requester, filters);
105
- }
106
- /**
107
- * Counts only published records.
108
- */
109
- async countPublishedRecords(tenant, recordsCount, requester) {
110
- const filter = RecordsCountHandler.buildPublishedRecordsFilter(recordsCount);
111
- return this.countProjectedRecordsForRequester(tenant, recordsCount, requester, [filter]);
112
- }
113
44
  async countProjectedRecords(tenant, filters, recordLimit) {
114
45
  const totalCount = await countRecordsWithRecordLimitOccupancy({
115
46
  messageStore: this.deps.messageStore,
@@ -134,8 +65,7 @@ export class RecordsCountHandler {
134
65
  });
135
66
  return totalCount - storedAudienceCount + projectedAudienceMessages.length;
136
67
  }
137
- async countProjectedRecordsForRequester(tenant, recordsCount, requester, filters) {
138
- const recordLimit = await this.resolveRecordLimit(tenant, recordsCount);
68
+ async countProjectedRecordsForRequester(tenant, recordsCount, requester, filters, recordLimit) {
139
69
  const controlFilters = Records.buildControlRecordsFilters(filters);
140
70
  if (controlFilters.length === 0) {
141
71
  return this.countProjectedRecords(tenant, filters, recordLimit);
@@ -166,112 +96,5 @@ export class RecordsCountHandler {
166
96
  });
167
97
  return totalCount - controlCount + visibleMessages.length;
168
98
  }
169
- async resolveRecordLimit(tenant, recordsCount) {
170
- return resolveRecordLimitOccupancy({
171
- validationStateReader: this.deps.validationStateReader,
172
- tenant,
173
- recordsFilter: recordsCount.message.descriptor.filter,
174
- messageTimestamp: recordsCount.message.descriptor.messageTimestamp,
175
- });
176
- }
177
- static buildPublishedRecordsFilter(recordsCount) {
178
- const { filter } = recordsCount.message.descriptor;
179
- return {
180
- ...Records.convertFilter(filter),
181
- interface: DwnInterfaceName.Records,
182
- method: DwnMethodName.Write,
183
- published: true,
184
- isLatestBaseState: true
185
- };
186
- }
187
- /**
188
- * Creates a filter for unpublished records that are intended for the count author (where `recipient` is the author).
189
- */
190
- static buildUnpublishedRecordsForCountAuthorFilter(recordsCount) {
191
- const { filter } = recordsCount.message.descriptor;
192
- return {
193
- ...Records.convertFilter(filter),
194
- interface: DwnInterfaceName.Records,
195
- method: DwnMethodName.Write,
196
- recipient: recordsCount.author,
197
- isLatestBaseState: true,
198
- published: false
199
- };
200
- }
201
- /**
202
- * Creates a filter for unpublished records that are within the specified protocol.
203
- */
204
- static buildUnpublishedProtocolAuthorizedRecordsFilter(recordsCount) {
205
- const { filter } = recordsCount.message.descriptor;
206
- return {
207
- ...Records.convertFilter(filter),
208
- interface: DwnInterfaceName.Records,
209
- method: DwnMethodName.Write,
210
- isLatestBaseState: true,
211
- published: false
212
- };
213
- }
214
- /**
215
- * Creates a filter for unpublished records authorized by a permission grant.
216
- */
217
- static buildUnpublishedPermissionGrantAuthorizedRecordsFilter(recordsCount) {
218
- const { filter } = recordsCount.message.descriptor;
219
- return {
220
- ...Records.convertFilter(filter),
221
- interface: DwnInterfaceName.Records,
222
- method: DwnMethodName.Write,
223
- isLatestBaseState: true,
224
- published: false
225
- };
226
- }
227
- /**
228
- * Creates a filter for only unpublished records where the author is the same as the count author.
229
- */
230
- static buildUnpublishedRecordsByCountAuthorFilter(recordsCount) {
231
- const { filter } = recordsCount.message.descriptor;
232
- return {
233
- ...Records.convertFilter(filter),
234
- author: recordsCount.author,
235
- interface: DwnInterfaceName.Records,
236
- method: DwnMethodName.Write,
237
- isLatestBaseState: true,
238
- published: false
239
- };
240
- }
241
- /**
242
- * @param messageStore Used to check if the grant has been revoked.
243
- */
244
- static async authorizeRecordsCount(tenant, recordsCount, deps) {
245
- if (Message.isSignedByAuthorDelegate(recordsCount.message) &&
246
- !EncryptionControl.filterTargetsOnlyControlRecords(recordsCount.message.descriptor.filter)) {
247
- await recordsCount.authorizeDelegate(deps.validationStateReader);
248
- }
249
- else if (EncryptionControl.filterTargetsOnlyControlRecords(recordsCount.message.descriptor.filter)) {
250
- await EncryptionControl.authorizeControlReadRequest({
251
- tenant,
252
- incomingMessage: recordsCount.message,
253
- requester: Message.getRequester(recordsCount.message),
254
- validationStateReader: deps.validationStateReader,
255
- });
256
- }
257
- const permissionGrantId = Message.getPermissionGrantId(recordsCount.signaturePayload);
258
- if (permissionGrantId !== undefined) {
259
- const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
260
- await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
261
- incomingMessage: recordsCount.message,
262
- expectedGrantor: tenant,
263
- expectedGrantee: recordsCount.author,
264
- permissionGrant,
265
- validationStateReader: deps.validationStateReader,
266
- });
267
- return;
268
- }
269
- // NOTE: not all RecordsCount messages require protocol authorization even if the filter includes protocol-related fields,
270
- // this is because we dynamically filter out records that the caller is not authorized to see.
271
- // Currently only run protocol authorization if message deliberately invokes a protocol role.
272
- if (Records.shouldProtocolAuthorize(recordsCount.signaturePayload)) {
273
- await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, deps.validationStateReader);
274
- }
275
- }
276
99
  }
277
100
  //# sourceMappingURL=records-count.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"records-count.js","sourceRoot":"","sources":["../../../../src/handlers/records-count.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EACL,oCAAoC,EACpC,oCAAoC,EACpC,2BAA2B,GAC5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEnF,MAAM,OAAO,mBAAmB;IAED;IAA7B,YAA6B,IAAyB;QAAzB,SAAI,GAAJ,IAAI,CAAqB;IAAI,CAAC;IAEpD,KAAK,CAAC,MAAM,CAAC,EAClB,MAAM,EACN,OAAO,GACwC;QAC/C,IAAI,YAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,KAAa,CAAC;QAClB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE7D,wGAAwG;QACxG,IAAI,OAAO,CAAC,8BAA8B,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxH,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,OAAO,CAAC,aAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAElE,MAAM,mBAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAC3D,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1C,KAAK,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;YACnC,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,YAA0B;QAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,MAAM,WAAW,GAAG;YAClB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;SACzB,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,2BAA2B,CACvC,MAAc,EACd,YAA0B,EAC1B,SAA6B;QAE7B,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,MAAM,WAAW,GAAG;YAClB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;SACzB,CAAC;QAEF,OAAO,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAChG,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAClC,MAAc,EACd,YAA0B,EAC1B,SAA6B;QAE7B,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,CAAC,gCAAgC,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,OAAO,CAAC,kCAAkC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAO,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,0CAA0C,CAAC,YAAY,CAAC,CAAC,CAAC;YAC7F,CAAC;YAED,IAAI,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,gBAAiB,CAAC,EAAE,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,+CAA+C,CAAC,YAAY,CAAC,CAAC,CAAC;YAClG,CAAC;YAED,IAAI,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,gBAAiB,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,sDAAsD,CAAC,YAAY,CAAC,CAAC,CAAC;YACzG,CAAC;YAED,IAAI,OAAO,CAAC,qCAAqC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAO,CAAC,EAAE,CAAC;gBAChF,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,2CAA2C,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CACjC,MAAc,EACd,YAA0B,EAC1B,SAA6B;QAE7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,MAAc,EACd,OAAiB,EACjB,WAA6C;QAE7C,MAAM,UAAU,GAAG,MAAM,oCAAoC,CAAC;YAC5D,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;YACpC,MAAM;YACN,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,iBAAiB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACxF,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACjF,MAAM,yBAAyB,GAAG,MAAM,iBAAiB,CAAC,6BAA6B,CAAC;YACtF,YAAY,EAAW,IAAI,CAAC,IAAI,CAAC,YAAY;YAC7C,MAAM;YACN,oBAAoB,EAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;YAC9D,aAAa,EAAU,eAAe;SACvC,CAAC,CAAC;QAEH,OAAO,UAAU,GAAG,mBAAmB,GAAG,yBAAyB,CAAC,MAAM,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,iCAAiC,CAC7C,MAAc,EACd,YAA0B,EAC1B,SAA6B,EAC7B,OAAiB;QAEjB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAC3F,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oCAAoC,CAAC;YAC9D,YAAY,EAAG,IAAI,CAAC,IAAI,CAAC,YAAY;YACrC,MAAM;YACN,OAAO,EAAQ,cAAc;YAC7B,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,6BAA6B,CAAC;YAC9E,YAAY,EAAW,IAAI,CAAC,IAAI,CAAC,YAAY;YAC7C,MAAM;YACN,oBAAoB,EAAG,QAAQ;YAC/B,aAAa,EAAU,cAAc;SACtC,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,2BAA2B,CAAC;YAC1E,MAAM;YACN,eAAe,EAAS,YAAY,CAAC,OAAO;YAC5C,SAAS;YACT,oBAAoB,EAAI,iBAAiB;YACzC,qBAAqB,EAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB;SACxD,CAAC,CAAC;QACH,OAAO,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,MAAc,EACd,YAA0B;QAE1B,OAAO,2BAA2B,CAAC;YACjC,qBAAqB,EAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB;YACvD,MAAM;YACN,aAAa,EAAW,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;YAC9D,gBAAgB,EAAQ,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB;SACzE,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,2BAA2B,CAAC,YAA0B;QACnE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,SAAS,EAAW,IAAI;YACxB,iBAAiB,EAAG,IAAI;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,2CAA2C,CAAC,YAA0B;QACnF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,SAAS,EAAW,YAAY,CAAC,MAAO;YACxC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,+CAA+C,CAAC,YAA0B;QACvF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,sDAAsD,CAAC,YAA0B;QAC9F,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,0CAA0C,CAAC,YAA0B;QAClF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,MAAM,EAAc,YAAY,CAAC,MAAO;YACxC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,qBAAqB,CACxC,MAAc,EACd,YAA0B,EAC1B,IAAyB;QAGzB,IAAI,OAAO,CAAC,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC;YACtD,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/F,MAAM,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,iBAAiB,CAAC,+BAA+B,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACrG,MAAM,iBAAiB,CAAC,2BAA2B,CAAC;gBAClD,MAAM;gBACN,eAAe,EAAS,YAAY,CAAC,OAAO;gBAC5C,SAAS,EAAe,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC;gBAClE,qBAAqB,EAAG,IAAI,CAAC,qBAAqB;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,gBAAiB,CAAC,CAAC;QACvF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC/F,MAAM,yBAAyB,CAAC,yBAAyB,CAAC;gBACxD,eAAe,EAAS,YAAY,CAAC,OAAO;gBAC5C,eAAe,EAAS,MAAM;gBAC9B,eAAe,EAAS,YAAY,CAAC,MAAO;gBAC5C,eAAe;gBACf,qBAAqB,EAAG,IAAI,CAAC,qBAAqB;aACnD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,0HAA0H;QAC1H,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAI,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,gBAAiB,CAAC,EAAE,CAAC;YACpE,MAAM,qBAAqB,CAAC,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;CAEF"}
1
+ {"version":3,"file":"records-count.js","sourceRoot":"","sources":["../../../../src/handlers/records-count.ts"],"names":[],"mappings":"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"}