@mdbase-dev/connect 0.1.0-beta.70 → 0.1.0-beta.75

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.
@@ -1 +1 @@
1
- sha384-AgV4nZxZSfEm0hxmoY/+laBu7GgQk24V8nJDEn4mFCtAMItb3v+XH40zTftyTkjY
1
+ sha384-2NXwGD96iZvxt5iZ6vfV4ZTuoY3PG7RMPOn+wmXEq+K+i06SN/u0vdHtOUb+Mj2p
@@ -1,6 +1,6 @@
1
1
  import type { CollectionOperation, CollectionTypeDocument, JsonObject } from "@mdbase-dev/connect-protocol";
2
2
  import { type CollectionChangesProblemCode, type CollectionDescriptionProblemCode, type CollectionMutationProblemCode, type CollectionQueryProblemCode, type CollectionReadProblemCode, type CollectionTypeProblemCode, type ConnectOutcome } from "./outcomes.js";
3
- import type { ChangesInput, CollectionChange, CollectionChangesPage, CollectionDescription, CollectionSetupApplyResult, CollectionSetupAssessment, AssessCollectionSetupInput, AssessTypePackInput, ApplyCollectionSetupInput, ApplyTypePackInput, CreateInput, CreateTypeInput, CreateViewSourceInput, DeleteInput, DeletePreflightResult, DeleteResult, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, MdbaseCollectionTransport, MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ConnectRequestOptions, QueryAllOptions, QueryInput, QueryPage, QueryPagesOptions, QueryResult, ReadInput, ReadTypeInput, ReadViewSourceInput, RenameInput, RenamePreflightResult, RenameResult, RecordDocument, SavedViewExecution, SavedViewList, SavedViewSourceDocument, TypePackApplyResult, TypePackAssessment, UpdateInput, UpdateTypeInput, UpdateViewSourceInput, WatchOptions } from "./operation-types.js";
3
+ import type { ChangesInput, CollectionChange, CollectionChangesPage, CollectionDescription, CollectionSetupApplyResult, CollectionSetupAssessment, AssessCollectionSetupInput, AssessTypePackInput, ApplyCollectionSetupInput, ApplyTypePackInput, CreateInput, CreateTypeInput, CreateViewSourceInput, DeleteInput, DeletePreflightResult, DeleteResult, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, MdbaseCollectionTransport, MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ConnectRequestOptions, QueryAllOptions, QueryInput, QueryPage, QueryPagesOptions, QueryResult, ReadInput, ReadTypeInput, ReadViewSourceInput, RenameInput, RenamePreflightResult, RenameResult, RecordDocument, SavedViewExecution, SavedViewPage, SavedViewPagesOptions, SavedViewList, SavedViewSourceDocument, TypePackApplyResult, TypePackAssessment, UpdateInput, UpdateTypeInput, UpdateViewSourceInput, WatchOptions } from "./operation-types.js";
4
4
  /**
5
5
  * Typed collection operations independent of OAuth, HTTP, or storage.
6
6
  *
@@ -20,6 +20,7 @@ export declare class MdbaseCollectionClient<Frontmatter extends JsonObject = Jso
20
20
  queryAll(input?: QueryInput, options?: QueryAllOptions<Frontmatter>): Promise<ConnectOutcome<QueryResult<Frontmatter>, CollectionQueryProblemCode>>;
21
21
  listViews(options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewList, CollectionReadProblemCode>>;
22
22
  executeView(input: ExecuteViewInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewExecution<Frontmatter>, CollectionReadProblemCode>>;
23
+ executeViewPages(input: ExecuteViewInput, options?: SavedViewPagesOptions<Frontmatter>): AsyncGenerator<ConnectOutcome<SavedViewPage<Frontmatter>, CollectionReadProblemCode>>;
23
24
  readViewSource(input: ReadViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionReadProblemCode>>;
24
25
  createViewSource(input: CreateViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionMutationProblemCode>>;
25
26
  updateViewSource(input: UpdateViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionMutationProblemCode>>;
@@ -1,5 +1,6 @@
1
1
  import { abortableDelay } from "./async.js";
2
2
  import { coordinatedQueryPages } from "./query-pagination.js";
3
+ import { coordinatedSavedViewPages } from "./saved-view-pagination.js";
3
4
  import { MdbaseConnectError, connectError, connectProblem, operationProblem } from "./errors.js";
4
5
  import { COLLECTION_CHANGES_PROBLEM_CODES, COLLECTION_DESCRIPTION_PROBLEM_CODES, COLLECTION_MUTATION_PROBLEM_CODES, COLLECTION_QUERY_PROBLEM_CODES, COLLECTION_READ_PROBLEM_CODES, COLLECTION_TYPE_PROBLEM_CODES, ALL_CONNECT_PROBLEM_CODES, captureConnectOutcome, connectFailure, connectSuccess } from "./outcomes.js";
5
6
  import { createRequestBudget, DEFAULT_REQUEST_TIMEOUT_MS, requestAbortReason } from "./request-budget.js";
@@ -38,7 +39,10 @@ export class MdbaseCollectionClient {
38
39
  results: results.map(wireQueryRecord),
39
40
  ...(meta ? {
40
41
  meta: {
41
- totalCount: meta.total_count,
42
+ ...(typeof meta.total_count === "number" ? { totalCount: meta.total_count } : {}),
43
+ ...(meta.total_count_outcome === undefined
44
+ ? {}
45
+ : { totalCountOutcome: meta.total_count_outcome }),
42
46
  hasMore: meta.has_more,
43
47
  ...(meta.cursor ? { cursor: meta.cursor } : {}),
44
48
  ...(meta.snapshot ? { snapshot: meta.snapshot } : {})
@@ -99,6 +103,9 @@ export class MdbaseCollectionClient {
99
103
  const outcome = await this.envelopeOperation("execute_view", input, COLLECTION_READ_PROBLEM_CODES, options);
100
104
  return mapOutcome(outcome, wireSavedViewExecution);
101
105
  }
106
+ async *executeViewPages(input, options = {}) {
107
+ yield* coordinatedSavedViewPages((pageInput, pageOptions) => this.executeView(pageInput, pageOptions), (cursor) => this.releaseQueryCursor(cursor), input, options);
108
+ }
102
109
  readViewSource(input, options) {
103
110
  return this.envelopeOperation("read_view_source", input, COLLECTION_READ_PROBLEM_CODES, options);
104
111
  }
@@ -530,6 +537,7 @@ function wireSavedViewExecution(value) {
530
537
  meta: {
531
538
  totalCount: value.meta.total_count,
532
539
  hasMore: value.meta.has_more,
540
+ ...(value.meta.cursor ? { cursor: value.meta.cursor } : {}),
533
541
  view: value.meta.view,
534
542
  ...(value.meta.context ? { context: value.meta.context } : {}),
535
543
  ...(value.meta.groups ? { groups: value.meta.groups } : {})
@@ -5,7 +5,7 @@ import type { GrantKeyStore } from "./crypto.js";
5
5
  import { MdbaseFileClient } from "./files.js";
6
6
  import { type Application } from "./internal-types.js";
7
7
  import type { MdbaseNativeNotificationRegistration, MdbaseNativeNotificationRegistrationOptions, MdbaseNotificationRegistration, MdbaseNotificationRegistrationOptions } from "./notifications.js";
8
- import type { ChangesInput, CollectionChangesPage, CollectionDescription, CollectionSetupApplyResult, CollectionSetupAssessment, ApplyCollectionSetupInput, ApplyTypePackInput, AssessCollectionSetupInput, AssessTypePackInput, CreateInput, CreateTypeInput, CreateViewSourceInput, DeleteInput, DeletePreflightResult, DeleteProgressOptions, DeleteResult, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ConnectRequestOptions, PendingMutation, QueryAllOptions, QueryInput, QueryPage, QueryPagesOptions, QueryResult, ReadInput, ReadTypeInput, ReadViewSourceInput, RenameInput, RenamePreflightResult, RenameProgressOptions, RenameResult, RecordDocument, SavedViewExecution, SavedViewList, SavedViewSourceDocument, TypePackApplyResult, TypePackAssessment, UpdateInput, UpdateTypeInput, UpdateViewSourceInput, MdbaseWatchSubscription, WatchInput } from "./operation-types.js";
8
+ import type { ChangesInput, CollectionChangesPage, CollectionDescription, CollectionSetupApplyResult, CollectionSetupAssessment, ApplyCollectionSetupInput, ApplyTypePackInput, AssessCollectionSetupInput, AssessTypePackInput, CreateInput, CreateTypeInput, CreateViewSourceInput, DeleteInput, DeletePreflightResult, DeleteProgressOptions, DeleteResult, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ConnectRequestOptions, PendingMutation, QueryAllOptions, QueryInput, QueryPage, QueryPagesOptions, QueryResult, ReadInput, ReadTypeInput, ReadViewSourceInput, RenameInput, RenamePreflightResult, RenameProgressOptions, RenameResult, RecordDocument, SavedViewExecution, SavedViewPage, SavedViewPagesOptions, SavedViewList, SavedViewSourceDocument, TypePackApplyResult, TypePackAssessment, UpdateInput, UpdateTypeInput, UpdateViewSourceInput, MdbaseWatchSubscription, WatchInput } from "./operation-types.js";
9
9
  import { type AuthorizationProblemCode, type CollectionChangesProblemCode, type CollectionDescriptionProblemCode, type CollectionMutationProblemCode, type CollectionQueryProblemCode, type CollectionReadProblemCode, type CollectionTypeProblemCode, type ConnectOutcome, type DirectAccessProblemCode, type NotificationProblemCode, type RegistrationProblemCode } from "./outcomes.js";
10
10
  import type { MdbaseDeviceAuthorization } from "./authorization-types.js";
11
11
  import { type ResolvedConnectTimeouts } from "./request-budget.js";
@@ -112,6 +112,7 @@ export declare class MdbaseConnection<Frontmatter extends JsonObject = JsonObjec
112
112
  queryAll(input?: QueryInput, options?: QueryAllOptions<Frontmatter>): Promise<ConnectOutcome<QueryResult<Frontmatter>, CollectionQueryProblemCode>>;
113
113
  listViews(options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewList, CollectionReadProblemCode>>;
114
114
  executeView(input: ExecuteViewInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewExecution<Frontmatter>, CollectionReadProblemCode>>;
115
+ executeViewPages(input: ExecuteViewInput, options?: SavedViewPagesOptions<Frontmatter>): AsyncGenerator<ConnectOutcome<SavedViewPage<Frontmatter>, CollectionReadProblemCode>>;
115
116
  readViewSource(input: ReadViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionReadProblemCode>>;
116
117
  createViewSource(input: CreateViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionMutationProblemCode>>;
117
118
  updateViewSource(input: UpdateViewSourceInput, options?: ConnectRequestOptions): Promise<ConnectOutcome<SavedViewSourceDocument, CollectionMutationProblemCode>>;
@@ -237,6 +237,9 @@ export class MdbaseConnection {
237
237
  executeView(input, options) {
238
238
  return this.collectionClient.executeView(input, options);
239
239
  }
240
+ executeViewPages(input, options = {}) {
241
+ return this.collectionClient.executeViewPages(input, options);
242
+ }
240
243
  readViewSource(input, options) {
241
244
  return this.collectionClient.readViewSource(input, options);
242
245
  }
package/dist/index.d.ts CHANGED
@@ -15,7 +15,7 @@ export type { MdbaseFileSource, CollectionFileDescriptor, MdbaseFileDeleteReceip
15
15
  export { parseMdbasePushPayload, parseMdbaseNativeNotificationData, showMdbasePushNotification } from "./notifications.js";
16
16
  export type { MdbaseNotificationRegistrationOptions, MdbaseNotificationRegistration, MdbaseNativeNotificationRegistrationOptions, MdbaseNativeNotificationRegistration, MdbaseNativeNotificationData, MdbasePushPayload } from "./notifications.js";
17
17
  export type { ConnectSuccess, ConnectFailure, ConnectOutcome, CommonOperationProblemCode, RegistrationProblemCode, AuthorizationProblemCode, NotificationProblemCode, DirectAccessProblemCode, SessionProblemCode, CollectionSetupProblemCode, CollectionDescriptionProblemCode, CollectionReadProblemCode, CollectionQueryProblemCode, CollectionMutationProblemCode, CollectionChangesProblemCode, CollectionTypeProblemCode } from "./outcomes.js";
18
- export type { MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ReadInput, DataContractSelector, CollectionFileMetadata, DataContractViewIdentity, QueryRecord, RecordDocument, QueryInput, QueryProjection, QuerySelectionExpression, QueryOrder, QuerySummary, QueryResult, QueryPagesOptions, QueryAllOptions, QueryPage, ConnectRequestOptions, MutationEstimate, MutationProgressState, MutationProgress, MutationProgressOptions, RequestCoordinationOptions, RenameProgressOptions, DeleteProgressOptions, PendingMutationSummary, PendingMutation, CreateInput, UpdateInput, DeleteInput, DeleteResult, DeletePreflightResult, RenameInput, RenameResult, RenamePreflightResult, ReadTypeInput, CreateTypeInput, UpdateTypeInput, ReadViewSourceInput, CreateViewSourceInput, UpdateViewSourceInput, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, SavedViewPresentation, SavedViewSource, SavedViewProperty, SavedNamedView, SavedViewDocument, SavedViewList, SavedViewSourceDocument, SavedViewExecution, ContractSetupChoice, TypePackResourceDiff, TypePackReceipt, TypePackAssessment, TypePackApplyResult, ConfigurationContributionValue, ConfigurationRequirement, ConfigurationProvision, ApplicationCollectionSetupRequirements, ApplicationCollectionSetupProvisions, ConfigurationSetupConflict, ConfigurationSetupAssessment, CollectionSetupAssessment, CollectionSetupReceipt, CollectionSetupApplyResult, AssessTypePackInput, ApplyTypePackInput, AssessCollectionSetupInput, ApplyCollectionSetupInput, ChangesInput, WatchOptions, WatchRetryOptions, WatchStatus, WatchInput, MdbaseWatchSubscription, CollectionChange, CollectionChangesPage, CollectionDescription, CollectionContractDescriptor, CollectionContractImplementationDescriptor, CollectionTypeDescriptor } from "./operation-types.js";
18
+ export type { MdbaseDesiredTimer, MdbaseTimer, MdbaseTimerList, MdbaseTimerReconciliation, ReadInput, DataContractSelector, CollectionFileMetadata, DataContractViewIdentity, QueryRecord, RecordDocument, QueryInput, QueryProjection, QuerySelectionExpression, QueryOrder, QuerySummary, QueryResult, QueryPagesOptions, QueryAllOptions, QueryPage, ConnectRequestOptions, MutationEstimate, MutationProgressState, MutationProgress, MutationProgressOptions, RequestCoordinationOptions, RenameProgressOptions, DeleteProgressOptions, PendingMutationSummary, PendingMutation, CreateInput, UpdateInput, DeleteInput, DeleteResult, DeletePreflightResult, RenameInput, RenameResult, RenamePreflightResult, ReadTypeInput, CreateTypeInput, UpdateTypeInput, ReadViewSourceInput, CreateViewSourceInput, UpdateViewSourceInput, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, SavedViewPresentation, SavedViewSource, SavedViewProperty, SavedNamedView, SavedViewDocument, SavedViewList, SavedViewSourceDocument, SavedViewExecution, SavedViewPage, SavedViewPagesOptions, ContractSetupChoice, TypePackResourceDiff, TypePackReceipt, TypePackAssessment, TypePackApplyResult, ConfigurationContributionValue, ConfigurationRequirement, ConfigurationProvision, ApplicationCollectionSetupRequirements, ApplicationCollectionSetupProvisions, ConfigurationSetupConflict, ConfigurationSetupAssessment, CollectionSetupAssessment, CollectionSetupReceipt, CollectionSetupApplyResult, AssessTypePackInput, ApplyTypePackInput, AssessCollectionSetupInput, ApplyCollectionSetupInput, ChangesInput, WatchOptions, WatchRetryOptions, WatchStatus, WatchInput, MdbaseWatchSubscription, CollectionChange, CollectionChangesPage, CollectionDescription, CollectionContractDescriptor, CollectionContractImplementationDescriptor, CollectionTypeDescriptor } from "./operation-types.js";
19
19
  export { externalStore } from "./external-store.js";
20
20
  export type { MdbaseExternalStore } from "./external-store.js";
21
21
  export { MdbaseBrowserSelection, MdbaseMemorySelection } from "./selection.js";
@@ -172,7 +172,14 @@ export interface QueryInput {
172
172
  export interface QueryResult<Record extends JsonObject = JsonObject> {
173
173
  results: Array<QueryRecord<Record>>;
174
174
  meta?: {
175
- totalCount: number;
175
+ /** Exact total when it is available within the page summary budget. */
176
+ totalCount?: number;
177
+ /** Typed successful outcome when exact counting is deferred for paging. */
178
+ totalCountOutcome?: {
179
+ status: "deferred";
180
+ budget: "eager_summary_rows";
181
+ limit: number;
182
+ };
176
183
  hasMore: boolean;
177
184
  cursor?: string;
178
185
  snapshot?: string;
@@ -385,8 +392,19 @@ export interface ExecuteViewInput {
385
392
  } | null;
386
393
  limit?: number;
387
394
  offset?: number;
395
+ /** Opaque, single-use token returned for the next snapshot-pinned page. */
396
+ cursor?: string;
388
397
  render?: boolean;
389
398
  }
399
+ export interface SavedViewPagesOptions<Frontmatter extends JsonObject = JsonObject> {
400
+ firstPageSize?: number;
401
+ pageSize?: number;
402
+ signal?: AbortSignal;
403
+ /** Independent budget for each page requested by this caller-driven iterator. */
404
+ pageTimeoutMs?: number | null;
405
+ coordination?: RequestCoordinationOptions;
406
+ onProgress?: (page: SavedViewPage<Frontmatter>) => void;
407
+ }
390
408
  export interface SavedViewPresentation extends JsonObject {
391
409
  type: string;
392
410
  fallback?: string;
@@ -439,6 +457,7 @@ export interface SavedViewExecution<Frontmatter extends JsonObject = JsonObject>
439
457
  meta: {
440
458
  totalCount: number;
441
459
  hasMore: boolean;
460
+ cursor?: string;
442
461
  view: {
443
462
  path: string;
444
463
  id: string;
@@ -453,6 +472,14 @@ export interface SavedViewExecution<Frontmatter extends JsonObject = JsonObject>
453
472
  }>;
454
473
  };
455
474
  }
475
+ export interface SavedViewPage<Frontmatter extends JsonObject = JsonObject> extends SavedViewExecution<Frontmatter> {
476
+ page: number;
477
+ offset: number;
478
+ loaded: number;
479
+ complete: boolean;
480
+ /** Opaque token for the next page while this iterator remains open. */
481
+ cursor?: string;
482
+ }
456
483
  export type ContractSetupChoice = {
457
484
  contract: ContractRequirement;
458
485
  mode: "starter";
@@ -0,0 +1,6 @@
1
+ import type { JsonObject } from "@mdbase-dev/connect-protocol";
2
+ import { type CollectionReadProblemCode, type ConnectOutcome } from "./outcomes.js";
3
+ import type { ConnectRequestOptions, ExecuteViewInput, SavedViewExecution, SavedViewPage, SavedViewPagesOptions } from "./operation-types.js";
4
+ type SavedViewOperation<Frontmatter extends JsonObject> = (input: ExecuteViewInput, options?: ConnectRequestOptions) => Promise<ConnectOutcome<SavedViewExecution<Frontmatter>, CollectionReadProblemCode>>;
5
+ export declare function coordinatedSavedViewPages<Frontmatter extends JsonObject>(executeView: SavedViewOperation<Frontmatter>, releaseQueryCursor: (cursor: string) => Promise<void>, input: ExecuteViewInput, options?: SavedViewPagesOptions<Frontmatter>): AsyncGenerator<ConnectOutcome<SavedViewPage<Frontmatter>, CollectionReadProblemCode>>;
6
+ export {};
@@ -0,0 +1,76 @@
1
+ import { connectProblem } from "./errors.js";
2
+ import { connectFailure, connectSuccess } from "./outcomes.js";
3
+ export async function* coordinatedSavedViewPages(executeView, releaseQueryCursor, input, options = {}) {
4
+ const { offset: requestedOffset, limit: requestedLimit, cursor: requestedCursor, ...criteria } = input;
5
+ let offset = nonNegativeInteger(requestedOffset, 0);
6
+ const firstPageSize = positiveInteger(options.firstPageSize ?? requestedLimit, 200);
7
+ const pageSize = positiveInteger(options.pageSize ?? requestedLimit, 1_000);
8
+ let cursor = requestedCursor;
9
+ let cursorMode = requestedCursor !== undefined;
10
+ let cursorToRelease = requestedCursor;
11
+ let loaded = 0;
12
+ let pageNumber = 0;
13
+ try {
14
+ while (!options.signal?.aborted) {
15
+ const pageCursor = cursor;
16
+ const outcome = await executeView({
17
+ ...criteria,
18
+ limit: pageNumber === 0 ? firstPageSize : pageSize,
19
+ ...(cursorMode && pageCursor ? { cursor: pageCursor } : { offset })
20
+ }, {
21
+ signal: options.signal,
22
+ timeoutMs: options.pageTimeoutMs,
23
+ coordination: { ...options.coordination, coalesce: false }
24
+ });
25
+ if (!outcome.ok) {
26
+ yield outcome;
27
+ return;
28
+ }
29
+ const result = outcome.value;
30
+ const returnedCursor = result.meta.cursor;
31
+ if (returnedCursor) {
32
+ cursorMode = true;
33
+ cursor = returnedCursor;
34
+ cursorToRelease = returnedCursor;
35
+ }
36
+ else if (cursorMode) {
37
+ cursor = undefined;
38
+ cursorToRelease = pageCursor;
39
+ }
40
+ if (cursorMode && result.meta.hasMore && !returnedCursor) {
41
+ yield connectFailure(connectProblem("invalid_operation_response", "The collection authority omitted the cursor required for the next saved-view page."));
42
+ return;
43
+ }
44
+ loaded += result.results.length;
45
+ const complete = !result.meta.hasMore || result.results.length === 0;
46
+ const page = {
47
+ ...result,
48
+ page: pageNumber,
49
+ offset,
50
+ loaded,
51
+ complete,
52
+ ...(returnedCursor ? { cursor: returnedCursor } : {})
53
+ };
54
+ options.onProgress?.(page);
55
+ yield connectSuccess(page, outcome.diagnostics);
56
+ if (complete)
57
+ return;
58
+ offset += result.results.length;
59
+ pageNumber += 1;
60
+ }
61
+ }
62
+ finally {
63
+ if (cursorMode && cursorToRelease)
64
+ await releaseQueryCursor(cursorToRelease);
65
+ }
66
+ }
67
+ function nonNegativeInteger(value, fallback) {
68
+ return typeof value === "number" && Number.isFinite(value)
69
+ ? Math.max(0, Math.floor(value))
70
+ : fallback;
71
+ }
72
+ function positiveInteger(value, fallback) {
73
+ return typeof value === "number" && Number.isFinite(value) && value > 0
74
+ ? Math.floor(value)
75
+ : fallback;
76
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mdbase-dev/connect",
3
- "version": "0.1.0-beta.70",
3
+ "version": "0.1.0-beta.75",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "@mdbase-dev/connect-protocol": "0.1.0-beta.70"
36
+ "@mdbase-dev/connect-protocol": "0.1.0-beta.75"
37
37
  },
38
38
  "devDependencies": {
39
39
  "esbuild": "^0.28.1",