@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.
- package/dist/browser.mjs +1 -1
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +349 -198
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/handlers/records-collection.js +200 -0
- package/dist/esm/src/handlers/records-collection.js.map +1 -0
- package/dist/esm/src/handlers/records-count.js +19 -196
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +19 -376
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +21 -341
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +1 -1
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +1 -1
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +3 -1
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/store/index-level.js +84 -32
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +45 -11
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/utils/record-limit-occupancy.js +5 -2
- package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -1
- package/dist/esm/src/utils/records.js +14 -47
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/tests/features/records-nested-query-scope.spec.js +15 -1
- package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +116 -0
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +52 -1
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +76 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +95 -1
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +70 -1
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/handlers/records-collection.d.ts +32 -0
- package/dist/types/src/handlers/records-collection.d.ts.map +1 -0
- package/dist/types/src/handlers/records-count.d.ts +0 -35
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +0 -61
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +1 -37
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +27 -3
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +1 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +6 -1
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +1 -1
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +6 -25
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/handlers/records-collection.ts +269 -0
- package/src/handlers/records-count.ts +21 -236
- package/src/handlers/records-query.ts +22 -447
- package/src/handlers/records-subscribe.ts +26 -404
- package/src/interfaces/records-count.ts +1 -1
- package/src/interfaces/records-query.ts +1 -1
- package/src/interfaces/records-subscribe.ts +5 -2
- package/src/store/index-level.ts +145 -37
- package/src/store/message-store-level.ts +46 -11
- package/src/types/message-store.ts +6 -1
- package/src/types/records-types.ts +1 -1
- package/src/utils/record-limit-occupancy.ts +5 -2
- 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 {
|
|
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 (
|
|
22
|
-
return messageReplyFromError(
|
|
18
|
+
catch (error) {
|
|
19
|
+
return messageReplyFromError(error, 400);
|
|
23
20
|
}
|
|
24
|
-
let count;
|
|
25
21
|
const requester = Message.getRequester(recordsCount.message);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
let visibility;
|
|
23
|
+
try {
|
|
24
|
+
visibility = await resolveRecordsCollectionVisibility(tenant, recordsCount, this.deps);
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"records-count.js","sourceRoot":"","sources":["../../../../src/handlers/records-count.ts"],"names":[],"mappings":"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"}
|