@tier0/sdk-v2 0.2.2 → 0.3.0

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 (110) hide show
  1. package/README.md +28 -13
  2. package/dist/cjs/capabilities.js +2 -2
  3. package/dist/cjs/capabilities.js.map +1 -1
  4. package/dist/cjs/client.d.ts +284 -374
  5. package/dist/cjs/cloud-transport.js +6 -1
  6. package/dist/cjs/cloud-transport.js.map +1 -1
  7. package/dist/cjs/controls.d.ts +19 -7
  8. package/dist/cjs/controls.js +37 -34
  9. package/dist/cjs/controls.js.map +1 -1
  10. package/dist/cjs/data/bootstrap.js +3 -2
  11. package/dist/cjs/data/bootstrap.js.map +1 -1
  12. package/dist/cjs/data/collection.d.ts +22 -0
  13. package/dist/cjs/data/collection.js +10 -9
  14. package/dist/cjs/data/collection.js.map +1 -1
  15. package/dist/cjs/files.d.ts +9 -9
  16. package/dist/cjs/mq/broker.d.ts +1 -1
  17. package/dist/cjs/mq/broker.js +1 -1
  18. package/dist/cjs/mq/broker.js.map +1 -1
  19. package/dist/cjs/mq/types.d.ts +1 -1
  20. package/dist/cjs/mq/types.js.map +1 -1
  21. package/dist/cjs/openapi/api.generated.d.ts +417 -541
  22. package/dist/cjs/openapi/api.generated.js +292 -377
  23. package/dist/cjs/openapi/api.generated.js.map +1 -1
  24. package/dist/cjs/openapi/client.js +1 -1
  25. package/dist/cjs/openapi/client.js.map +1 -1
  26. package/dist/cjs/openapi/codecs.generated.d.ts +394 -652
  27. package/dist/cjs/openapi/codecs.generated.js +2 -2
  28. package/dist/cjs/openapi/codecs.generated.js.map +1 -1
  29. package/dist/cjs/openapi/types.generated.d.ts +697 -906
  30. package/dist/cjs/openapi/types.generated.js.map +1 -1
  31. package/dist/cjs/source.d.ts +0 -7
  32. package/dist/cjs/source.js +1 -3
  33. package/dist/cjs/source.js.map +1 -1
  34. package/dist/cjs/stream.d.ts +0 -5
  35. package/dist/cjs/stream.js +3 -4
  36. package/dist/cjs/stream.js.map +1 -1
  37. package/dist/cjs/uns-v2/codec.js +1 -1
  38. package/dist/cjs/uns-v2/codec.js.map +1 -1
  39. package/dist/cjs/uns-v2/generated.d.ts +4713 -13494
  40. package/dist/cjs/uns-v2/generated.js +12 -33
  41. package/dist/cjs/uns-v2/generated.js.map +1 -1
  42. package/dist/esm/capabilities.js +2 -2
  43. package/dist/esm/capabilities.js.map +1 -1
  44. package/dist/esm/client.d.ts +284 -374
  45. package/dist/esm/cloud-transport.js +6 -1
  46. package/dist/esm/cloud-transport.js.map +1 -1
  47. package/dist/esm/controls.d.ts +19 -7
  48. package/dist/esm/controls.js +38 -35
  49. package/dist/esm/controls.js.map +1 -1
  50. package/dist/esm/data/bootstrap.js +4 -3
  51. package/dist/esm/data/bootstrap.js.map +1 -1
  52. package/dist/esm/data/collection.d.ts +22 -0
  53. package/dist/esm/data/collection.js +10 -10
  54. package/dist/esm/data/collection.js.map +1 -1
  55. package/dist/esm/files.d.ts +9 -9
  56. package/dist/esm/mq/broker.d.ts +1 -1
  57. package/dist/esm/mq/broker.js +1 -1
  58. package/dist/esm/mq/broker.js.map +1 -1
  59. package/dist/esm/mq/types.d.ts +1 -1
  60. package/dist/esm/mq/types.js.map +1 -1
  61. package/dist/esm/openapi/api.generated.d.ts +417 -541
  62. package/dist/esm/openapi/api.generated.js +292 -377
  63. package/dist/esm/openapi/api.generated.js.map +1 -1
  64. package/dist/esm/openapi/client.js +1 -1
  65. package/dist/esm/openapi/client.js.map +1 -1
  66. package/dist/esm/openapi/codecs.generated.d.ts +394 -652
  67. package/dist/esm/openapi/codecs.generated.js +1 -1
  68. package/dist/esm/openapi/codecs.generated.js.map +1 -1
  69. package/dist/esm/openapi/types.generated.d.ts +697 -906
  70. package/dist/esm/openapi/types.generated.js.map +1 -1
  71. package/dist/esm/source.d.ts +0 -7
  72. package/dist/esm/source.js +1 -3
  73. package/dist/esm/source.js.map +1 -1
  74. package/dist/esm/stream.d.ts +0 -5
  75. package/dist/esm/stream.js +3 -4
  76. package/dist/esm/stream.js.map +1 -1
  77. package/dist/esm/uns-v2/codec.js +2 -2
  78. package/dist/esm/uns-v2/codec.js.map +1 -1
  79. package/dist/esm/uns-v2/generated.d.ts +4713 -13494
  80. package/dist/esm/uns-v2/generated.js +12 -33
  81. package/dist/esm/uns-v2/generated.js.map +1 -1
  82. package/package.json +1 -1
  83. package/skills/tier0-sdk-v2/SKILL.md +5 -3
  84. package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +4 -4
  85. package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +3 -3
  86. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +12 -0
  87. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +1 -1
  88. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/url.md +1 -1
  89. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +1 -1
  90. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/platform-members.md +1 -1
  91. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/get.md +1 -1
  92. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +1 -1
  93. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +2 -2
  94. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +4 -4
  95. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +2 -2
  96. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +3 -3
  97. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +1 -1
  98. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +11 -2
  99. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/lifecycle.md +1 -1
  100. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +25 -5
  101. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +1 -1
  102. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +1 -1
  103. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +1 -1
  104. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +3 -3
  105. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +9 -5
  106. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +5 -5
  107. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +4 -4
  108. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +8 -7
  109. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +2 -2
  110. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +4 -4
@@ -34,6 +34,22 @@ interface Page<T> {
34
34
  /** Token of the following page; null when this was the last one. */
35
35
  next: PageToken | null;
36
36
  }
37
+ interface WriteResult {
38
+ matchedCount?: number;
39
+ modifiedCount?: number;
40
+ deletedCount?: number;
41
+ insertedCount?: number;
42
+ upsertedId?: string | null;
43
+ insertedIds?: Record<string, string>;
44
+ upsertedIds?: Record<string, string>;
45
+ upsertedCount?: number;
46
+ writeErrors?: unknown[];
47
+ hasMore?: boolean;
48
+ }
49
+ /** A page of `updateMany` / `deleteMany`, the only writes that continue with `resumeAfter`. */
50
+ interface ManyPage extends WriteResult {
51
+ resumeAfter?: string | null;
52
+ }
37
53
  /** Runtime services a collection handle needs from its client. */
38
54
  export interface CollectionRuntime {
39
55
  call: DataCall;
@@ -195,6 +211,12 @@ export type BulkOperation = {
195
211
  sort?: Sort;
196
212
  };
197
213
  };
214
+ /**
215
+ * Atomic batches pass no `committed` counts: their write errors rolled the
216
+ * whole batch back. Non-atomic runs pass their cumulative counts; `details`
217
+ * then has the shape `partialWrite` uses.
218
+ */
219
+ export declare function assertNoWriteErrors(result: ManyPage, operation: string, committed?: Record<string, number>): void;
198
220
  export declare class Collection<T extends object = Record<string, unknown>, TInput extends object = T> {
199
221
  readonly definition: CollectionDefinition;
200
222
  private readonly runtime;
@@ -133,7 +133,7 @@ function idsInOrder(ids) {
133
133
  * whole batch back. Non-atomic runs pass their cumulative counts; `details`
134
134
  * then has the shape `partialWrite` uses.
135
135
  */
136
- function assertNoWriteErrors(result, operation, committed) {
136
+ export function assertNoWriteErrors(result, operation, committed) {
137
137
  if (result.writeErrors && result.writeErrors.length > 0) {
138
138
  const counts = Object.entries(committed ?? {}).map(([name, value]) => `${name}=${value}`).join(', ');
139
139
  const changed = committed !== undefined && Object.values(committed).some((value) => value > 0);
@@ -328,12 +328,11 @@ export class Collection {
328
328
  async distinct(field, filter = {}) {
329
329
  const values = [];
330
330
  for (let page = 1;; page += 1) {
331
- const result = await this.post('recordDistinct', {
332
- field,
333
- filter: Object.keys(filter).length > 0 ? filter : undefined,
331
+ const result = await this.post('recordAggregatePipeline', {
332
+ pipeline: [{ $match: filter }, { $group: { _id: `$${field}` } }],
334
333
  page: { mode: 'offset', page, size: MAX_PAGE_SIZE },
335
334
  });
336
- values.push(...result.values);
335
+ values.push(...result.items.map(item => item._id));
337
336
  if (!result.pageInfo.hasMore)
338
337
  return values;
339
338
  }
@@ -412,8 +411,8 @@ export class Collection {
412
411
  return { insertedCount: 0, insertedIds: [] };
413
412
  assertAtomicBatch('insertMany', documents.length);
414
413
  const prepared = documents.map((document) => validateDocument(this.definition, document));
415
- const result = await this.post('recordInsertMany', {
416
- documents: prepared.map(({ id, data }) => compact({ id, data })),
414
+ const result = await this.post('recordBulkWrite', {
415
+ operations: prepared.map(({ id, data }) => ({ insertOne: compact({ id, data }) })),
417
416
  ordered: true,
418
417
  atomic: true,
419
418
  idempotencyKey: options.idempotencyKey,
@@ -518,7 +517,7 @@ export class Collection {
518
517
  * returns null when another request moved the record first.
519
518
  */
520
519
  async findOneAndUpdate(filter, update, options = {}) {
521
- const result = await this.post('recordFindOneAndUpdate', {
520
+ const result = await this.post('recordUpdateOne', {
522
521
  filter,
523
522
  update: validateUpdate(this.definition, update),
524
523
  upsert: options.upsert,
@@ -533,7 +532,7 @@ export class Collection {
533
532
  }
534
533
  async findOneAndReplace(filter, replacement, options = {}) {
535
534
  const { data } = validateDocument(this.definition, replacement);
536
- const result = await this.post('recordFindOneAndReplace', {
535
+ const result = await this.post('recordReplaceOne', {
537
536
  filter,
538
537
  replacement: data,
539
538
  upsert: options.upsert,
@@ -546,12 +545,13 @@ export class Collection {
546
545
  return result.value ? toDoc(result.value) : null;
547
546
  }
548
547
  async findOneAndDelete(filter, options = {}) {
549
- const result = await this.post('recordFindOneAndDelete', {
548
+ const result = await this.post('recordDeleteOne', {
550
549
  filter,
551
550
  expectedRevision: options.expectedRevision,
552
551
  sort: toSortPairs(options.sort),
553
552
  projection: options.projection,
554
553
  idempotencyKey: options.idempotencyKey,
554
+ returnDocument: 'before',
555
555
  });
556
556
  return result.value ? toDoc(result.value) : null;
557
557
  }
@@ -1 +1 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/data/collection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mongo-driver-style collection handle over the UNS record operations\n * (`recordFind`, `recordInsertMany`, ...).\n *\n * Stored records `{ id, data, revision, createdAt, updatedAt }` are exposed as\n * flat documents `{ _id, ...data, _meta: { revision, createdAt, updatedAt } }`;\n * filters, sorts and projections use the same paths (`status`,\n * `customer.id`, `_id`, `_meta.updatedAt`).\n */\nimport type { UnsV2OperationName } from '../uns-v2/generated.js';\nimport type { CallOptions, DataCall } from './call.js';\nimport type { CollectionDefinition, RecordMeta } from './define.js';\nimport { DataError } from './error.js';\nimport { validateDocument, validateUpdate } from './schema.js';\nimport { toSortPairs, type Filter, type Sort, type SortPairs } from './sort.js';\n\n/** UNS page limit for find / aggregate / distinct. */\nexport const MAX_PAGE_SIZE = 200;\n\n/**\n * UNS commits at most 200 items in one synchronous atomic batch\n * (insertMany, bulkWrite, data.transact).\n */\nexport const MAX_ATOMIC_ITEMS = 200;\n\nexport type WithMeta<T> = T & { _id: string; _meta: RecordMeta };\n/** A projection may omit business fields at any depth; array and tuple containers retain their shape. */\nexport type DeepPartial<T> = T extends readonly unknown[]\n ? { [K in keyof T]: DeepPartial<T[K]> }\n : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;\nexport type Projection = Record<string, 0 | 1 | boolean>;\nexport type Update = Record<string, unknown>;\n\nexport interface UnsRecord {\n id: string;\n data: Record<string, unknown>;\n revision: number;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface PageInfo {\n hasMore: boolean;\n nextCursor?: string | null;\n nextPage?: number | null;\n}\n\n/** Position of the next page: an opaque cursor or a 1-based offset page number. */\ntype PageToken = string | number;\n\ninterface Page<T> {\n items: T[];\n /** Token of the following page; null when this was the last one. */\n next: PageToken | null;\n}\n\ninterface WriteResult {\n matchedCount?: number;\n modifiedCount?: number;\n deletedCount?: number;\n insertedCount?: number;\n upsertedId?: string | null;\n insertedIds?: Record<string, string>;\n upsertedIds?: Record<string, string>;\n upsertedCount?: number;\n writeErrors?: unknown[];\n hasMore?: boolean;\n}\n\n/** A page of `updateMany` / `deleteMany`, the only writes that continue with `resumeAfter`. */\ninterface ManyPage extends WriteResult {\n resumeAfter?: string | null;\n}\n\n/** Runtime services a collection handle needs from its client. */\nexport interface CollectionRuntime {\n call: DataCall;\n /** Collection ID of a declaration or declared alias, ensuring all declarations first. */\n resolve(target: CollectionDefinition | string): Promise<string>;\n /** Runs a call, re-ensuring and retrying once when its collection ID went stale (see bootstrap). */\n recover<R>(fn: () => Promise<R>, options?: { retry?: boolean }): Promise<R>;\n /** Data subject of the request being served. */\n subject(): string | undefined;\n /** Abort signal of the request being served. */\n signal(): AbortSignal | undefined;\n}\n\n/** Rejects batches UNS would refuse, before anything is sent. */\nexport function assertAtomicBatch(operation: string, count: number) {\n if (count > MAX_ATOMIC_ITEMS) {\n throw new DataError({\n message:\n `${operation} commits at most ${MAX_ATOMIC_ITEMS} items atomically; got ${count}. ` +\n `Split the input into chunks of ${MAX_ATOMIC_ITEMS} (each chunk commits on its own; give each chunk a stable ` +\n 'idempotencyKey or fixed _ids so a retry is safe), or keep all-or-nothing work within one batch.',\n status: 400,\n code: 'BATCH_LIMIT_EXCEEDED',\n });\n }\n}\n\nexport function toDoc<T>(record: UnsRecord): WithMeta<T> {\n return {\n ...(record.data as T),\n _id: record.id,\n _meta: { revision: record.revision, createdAt: record.createdAt, updatedAt: record.updatedAt },\n };\n}\n\n/**\n * Async-iterable result set. Pages hold at most 200 items; the page source\n * decides whether the next page is reached by cursor or by offset page number.\n */\nexport class Cursor<T> implements AsyncIterable<T> {\n private sortSpec?: Sort;\n private limitCount?: number;\n private projection?: Projection;\n private started = false;\n\n constructor(\n private readonly fetchPage: (state: {\n token: PageToken | null;\n size: number;\n sort?: SortPairs;\n projection?: Projection;\n }) => Promise<Page<T>>,\n options: { sort?: Sort; limit?: number; projection?: Projection } = {},\n ) {\n this.sortSpec = options.sort;\n this.limitCount = options.limit;\n this.projection = options.projection;\n }\n\n private assertNotStarted() {\n if (this.started) throw new Error('Cursor options must be set before iteration starts.');\n }\n\n sort(sort: Sort): this {\n this.assertNotStarted();\n this.sortSpec = sort;\n return this;\n }\n\n /** Total number of documents to return (pages are fetched ≤200 at a time). */\n limit(count: number): this {\n this.assertNotStarted();\n this.limitCount = count;\n return this;\n }\n\n project(projection: Projection): this {\n this.assertNotStarted();\n this.projection = projection;\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n this.started = true;\n const sort = toSortPairs(this.sortSpec);\n let remaining = this.limitCount ?? Number.POSITIVE_INFINITY;\n // One page size for the whole iteration: offset pages are only stable when it never changes.\n const size = Math.min(MAX_PAGE_SIZE, remaining);\n let token: PageToken | null = null;\n while (remaining > 0) {\n const page = await this.fetchPage({ token, size, sort, projection: this.projection });\n for (const item of page.items.slice(0, remaining)) yield item;\n remaining -= page.items.length;\n if (page.next === null || page.items.length === 0) return;\n token = page.next;\n }\n }\n\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n/** Pipelines made only of `$match` / `$sort` page by cursor; UNS requires offset paging for any other stage. */\nfunction isDirectPipeline(stages: readonly Record<string, unknown>[]): boolean {\n return stages.every((stage) => Object.keys(stage).every((key) => key === '$match' || key === '$sort'));\n}\n\nexport interface FindOptions {\n sort?: Sort;\n limit?: number;\n projection?: Projection;\n}\n\nexport interface FindPageOptions {\n sort?: Sort;\n /** 1-based page number. */\n page?: number;\n /** At most 200. */\n pageSize?: number;\n projection?: Projection;\n /** Count matches up to this many (1–100000); UNS defaults to 10000. */\n maxCount?: number;\n}\n\n/** A match count UNS stopped at its limit: `capped` means \"at least `count`\". */\nexport interface CappedCount {\n count: number;\n capped: boolean;\n}\n\n/** UNS reads at most 100 records by ID per request. */\nexport const MAX_GET_IDS = 100;\n\nexport interface FoundPage<T> {\n items: WithMeta<T>[];\n total: CappedCount;\n page: number;\n pageSize: number;\n}\n\nexport interface ValueCount {\n value: unknown;\n count: number;\n}\n\ninterface RecordGetResult {\n items: UnsRecord[];\n missing: string[];\n}\n\n/** One read of `data.queryBatch`, built by `collection.query.*`. */\nexport interface BatchQuery<R> {\n readonly collection: CollectionDefinition;\n /** The batch item without `id` and `collectionId`; resolves `$lookup` targets. */\n prepare(): Promise<Record<string, unknown>>;\n /** The item's result as the builder's caller sees it. */\n parse(data: unknown): R;\n}\n\nexport interface CollectionQueries<T> {\n /** First page (≤200, default 20); `maxCount` adds the capped total of all matches. */\n find(filter?: Filter, options?: { sort?: Sort; limit?: number; projection?: Projection; maxCount?: number }):\n BatchQuery<{ items: WithMeta<T>[]; hasMore: boolean; total?: CappedCount }>;\n /** Like `collection.findPage`. */\n findPage(filter?: Filter, options?: FindPageOptions): BatchQuery<FoundPage<T>>;\n count(filter?: Filter, options?: { maxCount?: number }): BatchQuery<CappedCount>;\n /** The 200 most frequent values. */\n countBy(field: string, filter?: Filter): BatchQuery<ValueCount[]>;\n /** The first 200 distinct values. */\n distinct(field: string, filter?: Filter): BatchQuery<unknown[]>;\n /** The first 200 output rows. */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): BatchQuery<R[]>;\n /** 1–100 distinct records by ID, as `collection.get`. */\n get(ids: readonly string[], options?: { projection?: Projection }): BatchQuery<{ items: WithMeta<T>[]; missing: string[] }>;\n}\n\nexport interface UpdateOptions {\n upsert?: boolean;\n /** Reject the write with VERSION_CONFLICT unless the record is at this revision. */\n expectedRevision?: number;\n sort?: Sort;\n arrayFilters?: Record<string, unknown>[];\n idempotencyKey?: string;\n}\n\nexport interface FindOneAndOptions extends UpdateOptions {\n returnDocument?: 'before' | 'after';\n projection?: Projection;\n}\n\nexport type InsertOneOptions = { idempotencyKey?: string } & (\n | { returnDocument?: 'none'; projection?: never }\n | { returnDocument: 'after'; projection?: Projection }\n);\n\nexport type BulkOperation =\n | { insertOne: { document: Record<string, unknown> } }\n | { updateOne: { filter: Filter; update: Update; upsert?: boolean; sort?: Sort } }\n | { replaceOne: { filter: Filter; replacement: Record<string, unknown>; upsert?: boolean; sort?: Sort } }\n | { deleteOne: { filter: Filter; sort?: Sort } };\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction filterOrNothing(filter: Filter): Filter | undefined {\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/** `recordAggregatePipeline` body of one numbered page with its capped total. */\nfunction pageRequest(filter: Filter, options: FindPageOptions) {\n const page = Math.max(1, Math.trunc(options.page ?? 1));\n const pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, Math.trunc(options.pageSize ?? 20)));\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n const sort = toSortPairs(options.sort);\n if (sort) pipeline.push({ $sort: sort });\n if (options.projection) pipeline.push({ $project: options.projection });\n const body = { pipeline, page: { mode: 'offset', page, size: pageSize }, count: options.maxCount === undefined ? {} : { max: options.maxCount } };\n return { body, page, pageSize };\n}\n\nfunction countByPipeline(field: string, filter: Filter): Record<string, unknown>[] {\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n // `_id` breaks ties, so offset pages of equal counts neither repeat nor skip a group.\n pipeline.push({ $group: { _id: `$${field}`, count: { $sum: 1 } } }, { $sort: { count: -1, _id: 1 } });\n return pipeline;\n}\n\nconst toValueCount = (row: { _id: unknown; count: number }): ValueCount => ({ value: row._id ?? null, count: row.count });\n\nfunction idsInOrder(ids: Record<string, string> | undefined): string[] {\n return Object.entries(ids ?? {})\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, id]) => id);\n}\n\n/**\n * Atomic batches pass no `committed` counts: their write errors rolled the\n * whole batch back. Non-atomic runs pass their cumulative counts; `details`\n * then has the shape `partialWrite` uses.\n */\nfunction assertNoWriteErrors(result: ManyPage, operation: string, committed?: Record<string, number>) {\n if (result.writeErrors && result.writeErrors.length > 0) {\n const counts = Object.entries(committed ?? {}).map(([name, value]) => `${name}=${value}`).join(', ');\n const changed = committed !== undefined && Object.values(committed).some((value) => value > 0);\n throw new DataError({\n message: `${operation} stopped on ${result.writeErrors.length} write error(s)${counts ? `; already committed: ${counts}` : ''}.`,\n status: 409,\n code: 'WRITE_ERRORS',\n execution: changed ? 'committed' : 'rolledBack',\n attempts: 1,\n details: committed\n ? { ...committed, status: changed ? 'partiallyCommitted' : 'failed', hasMore: Boolean(result.hasMore), resumeAfter: result.resumeAfter ?? null, writeErrors: result.writeErrors }\n : { writeErrors: result.writeErrors },\n });\n }\n}\n\n/**\n * A non-atomic run failed after some writes committed: on an earlier page, or\n * within the failed page (UNS then answers `execution: \"committed\"` with the\n * page's partial result as `data`). Like UNS, the error keeps its code and is\n * `committed` with `retry.safe: false`; `details` is the cumulative result\n * of the whole call in the shape of a success (`matchedCount` …, `status:\n * \"partiallyCommitted\"`, `hasMore`, `resumeAfter`). Continue by passing\n * `resumeAfter` back; repeating the call would apply `$inc` / `$push` twice.\n */\nfunction partialWrite(operation: string, totals: Record<string, number>, resumeAfter: string | undefined, cause: DataError): DataError {\n const counts = Object.entries(totals).map(([name, value]) => `${name}=${value}`).join(', ');\n const writeErrors = Array.isArray(cause.details.writeErrors) ? { writeErrors: cause.details.writeErrors } : {};\n return new DataError({\n message:\n `${operation} committed ${counts} and then failed: ${cause.message} ` +\n (resumeAfter\n ? `Continue with { resumeAfter: details.resumeAfter }${cause.outcomeUnknown ? ' after checking the failed page, whose outcome is unknown' : ''}; do not repeat the whole call.`\n : 'Read back what changed before writing again; do not repeat the whole call.'),\n status: cause.status,\n code: cause.code,\n reason: cause.reason,\n upstreamStatus: cause.upstreamStatus,\n requestId: cause.requestId,\n // Earlier writes took effect; the failed page too, perhaps, when its outcome is unknown.\n execution: cause.outcomeUnknown ? 'unknown' : 'committed',\n retry: { safe: false },\n attempts: cause.attempts,\n details: { ...totals, status: 'partiallyCommitted', hasMore: true, resumeAfter: resumeAfter ?? null, ...writeErrors },\n cause,\n });\n}\n\nexport class Collection<T extends object = Record<string, unknown>, TInput extends object = T> {\n constructor(\n readonly definition: CollectionDefinition,\n private readonly runtime: CollectionRuntime,\n ) {}\n\n get alias(): string {\n return this.definition.alias;\n }\n\n /**\n * One call with stale-ID recovery. A call continuing a cursor or\n * resumeAfter token of the old collection is not retried: the token means\n * nothing to a recreated collection.\n */\n private post<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const page = body.page as { cursor?: unknown } | undefined;\n const continues = typeof body.cursor === 'string' || typeof body.resumeAfter === 'string' || typeof page?.cursor === 'string';\n return this.runtime.recover(() => this.send<R>(operation, body, options), { retry: !continues });\n }\n\n private async send<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const collectionId = await this.runtime.resolve(this.definition);\n return this.runtime.call<R>(operation, { collectionId, ...compact(body) }, {\n dataSubject: this.runtime.subject(),\n signal: this.runtime.signal(),\n ...options,\n });\n }\n\n /* ---------------------------------- reads --------------------------------- */\n\n find(filter: Filter = {}, options: FindOptions = {}): Cursor<WithMeta<T>> {\n return new Cursor<WithMeta<T>>(async ({ token, size, sort, projection }) => {\n const result = await this.post<{ items: UnsRecord[]; pageInfo: PageInfo }>('recordFind', {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n sort,\n projection,\n limit: size,\n cursor: typeof token === 'string' ? token : undefined,\n });\n return {\n items: result.items.map((record) => toDoc<T>(record)),\n next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null,\n };\n }, options);\n }\n\n async findOne(filter: Filter = {}, options: Omit<FindOptions, 'limit'> = {}): Promise<WithMeta<T> | null> {\n const [first] = await this.find(filter, { ...options, limit: 1 }).toArray();\n return first ?? null;\n }\n\n /**\n * Records by ID, in the order asked for (each ID once, at its first\n * position); IDs that do not exist, are deleted or are hidden by employee\n * data rules are listed in `missing` alike. More than 100 IDs are read in\n * chunks of 100 (not one snapshot).\n */\n async get(ids: readonly string[], options: { projection?: Projection } = {}): Promise<{ items: WithMeta<T>[]; missing: string[] }> {\n const unique = [...new Set(ids)];\n const chunks: string[][] = [];\n for (let start = 0; start < unique.length; start += MAX_GET_IDS) chunks.push(unique.slice(start, start + MAX_GET_IDS));\n const results = await Promise.all(chunks.map((chunk) =>\n this.post<RecordGetResult>('recordGet', { ids: chunk, projection: options.projection })));\n return {\n items: results.flatMap((result) => result.items.map((record) => toDoc<T>(record))),\n missing: results.flatMap((result) => result.missing),\n };\n }\n\n /**\n * One numbered page plus the total match count, for paged list screens:\n * one `recordAggregatePipeline` offset page whose `count` runs in the same\n * snapshot. Show a capped total as \"10000+\".\n */\n async findPage(filter: Filter = {}, options: FindPageOptions = {}): Promise<FoundPage<T>> {\n const { body, page, pageSize } = pageRequest(filter, options);\n const result = await this.post<{ items: WithMeta<T>[]; total: CappedCount }>('recordAggregatePipeline', body);\n return { items: result.items, total: result.total, page, pageSize };\n }\n\n /**\n * Counts matches up to `maxCount` (1–100000, UNS default 100000). A\n * `capped` result means \"at least `count`\".\n */\n async countDocuments(filter: Filter = {}, options: { maxCount?: number } = {}): Promise<CappedCount> {\n const result = await this.post<CappedCount>('recordCount', { filter: filterOrNothing(filter), maxCount: options.maxCount });\n return { count: result.count, capped: result.capped };\n }\n\n /**\n * Match counts per value of `field`, largest first: one `$group` pipeline\n * instead of a count per value. Records without the field count under\n * `value: null`.\n */\n async countBy(field: string, filter: Filter = {}): Promise<ValueCount[]> {\n const rows = await this.aggregate<{ _id: unknown; count: number }>(countByPipeline(field, filter)).toArray();\n return rows.map(toValueCount);\n }\n\n /**\n * Builders for `data.queryBatch`: each describes one read of this\n * collection, run together with the others in one request and one\n * snapshot. Each returns one page (at most 200 rows), unlike the cursor\n * methods; `get` takes at most 100 IDs.\n */\n get query(): CollectionQueries<T> {\n const one = <R>(op: string, build: () => Promise<Record<string, unknown>>, parse: (data: never) => R): BatchQuery<R> => ({\n collection: this.definition,\n prepare: async () => ({ op, ...compact(await build()) }),\n parse: parse as (data: unknown) => R,\n });\n return {\n find: (filter = {}, options = {}) =>\n one('find', async () => ({\n filter: filterOrNothing(filter),\n sort: toSortPairs(options.sort),\n projection: options.projection,\n limit: Math.min(MAX_PAGE_SIZE, options.limit ?? 20),\n count: options.maxCount === undefined ? undefined : { max: options.maxCount },\n }), (data: { items: UnsRecord[]; pageInfo: PageInfo; total?: CappedCount }) => ({\n items: data.items.map((record) => toDoc<T>(record)),\n hasMore: data.pageInfo.hasMore,\n ...(data.total ? { total: data.total } : {}),\n })),\n findPage: (filter = {}, options = {}) => {\n const { body, page, pageSize } = pageRequest(filter, options);\n return one('aggregate', async () => body, (data: { items: WithMeta<T>[]; total: CappedCount }) => ({\n items: data.items, total: data.total, page, pageSize,\n }));\n },\n count: (filter = {}, options = {}) =>\n one('count', async () => ({ filter: filterOrNothing(filter), maxCount: options.maxCount }),\n (data: CappedCount) => ({ count: data.count, capped: data.capped })),\n countBy: (field, filter = {}) =>\n one('aggregate', async () => ({\n pipeline: await this.prepareStages(countByPipeline(field, filter)),\n page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE },\n }), (data: { items: { _id: unknown; count: number }[] }) => data.items.map(toValueCount)),\n distinct: (field, filter = {}) =>\n one('distinct', async () => ({ field, filter: filterOrNothing(filter), page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } }),\n (data: { values: unknown[] }) => data.values),\n aggregate: <R = Record<string, unknown>>(pipeline: Record<string, unknown>[]) =>\n one('aggregate', async () => {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n // A final $count returns one row and forbids an explicit page.\n return last !== undefined && '$count' in last\n ? { pipeline: stages }\n : { pipeline: stages, page: isDirectPipeline(stages) ? { mode: 'cursor', size: MAX_PAGE_SIZE } : { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } };\n }, (data: { items: R[] }) => data.items),\n get: (ids, options = {}) => {\n const unique = [...new Set(ids)];\n if (unique.length < 1 || unique.length > MAX_GET_IDS) {\n throw new TypeError(`query.get takes 1–${MAX_GET_IDS} distinct IDs; use collection.get for more.`);\n }\n return one('get', async () => ({ ids: unique, projection: options.projection }),\n (data: RecordGetResult) => ({ items: data.items.map((record) => toDoc<T>(record)), missing: data.missing }));\n },\n };\n }\n\n /** Distinct values of a field (every page). */\n async distinct(field: string, filter: Filter = {}): Promise<unknown[]> {\n const values: unknown[] = [];\n for (let page = 1; ; page += 1) {\n const result = await this.post<{ values: unknown[]; pageInfo: PageInfo }>('recordDistinct', {\n field,\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n page: { mode: 'offset', page, size: MAX_PAGE_SIZE },\n });\n values.push(...result.values);\n if (!result.pageInfo.hasMore) return values;\n }\n }\n\n /**\n * Runs a pipeline (`$match`, `$sort`, `$group`, `$project`, `$set`,\n * `$lookup`, `$unwind`, `$skip`, `$limit`, `$count`). `$sort` accepts\n * `{ field: 1 | -1 }`; `$lookup` takes `from` (a declared collection or\n * alias of this App) instead of a collection ID. Rows are whatever the\n * pipeline outputs, not wrapped records.\n *\n * Pipelines of only `$match` / `$sort` page by cursor; any other stage pages\n * by offset (UNS rejects cursors for transformed results). The `$exists`,\n * `$distinct` and `$frequencies` stages are listed in the UNS schema but not\n * executed by the record pipeline; use `countDocuments`, `distinct` or `$group`.\n */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): Cursor<R> {\n // Recovery wraps stage preparation too, so a retry re-resolves `$lookup` IDs.\n return new Cursor<R>(({ token, size }) => this.runtime.recover(() => this.aggregatePage<R>(pipeline, token, size), { retry: typeof token !== 'string' }));\n }\n\n private async aggregatePage<R>(\n pipeline: Record<string, unknown>[],\n token: PageToken | null,\n size: number,\n ): Promise<Page<R>> {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n if (last !== undefined && '$count' in last) {\n // A final $count returns one row and forbids an explicit page.\n const result = await this.send<{ items: R[] }>('recordAggregatePipeline', { pipeline: stages });\n return { items: result.items, next: null };\n }\n if (isDirectPipeline(stages)) {\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'cursor', size, ...(typeof token === 'string' ? { cursor: token } : {}) },\n });\n return { items: result.items, next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null };\n }\n const page = typeof token === 'number' ? token : 1;\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'offset', page, size },\n });\n return {\n items: result.items,\n next: result.pageInfo.hasMore ? (result.pageInfo.nextPage ?? page + 1) : null,\n };\n }\n\n /** Converts Mongo-style `$sort` objects and resolves `$lookup.from`, recursively. */\n private async prepareStages(pipeline: readonly Record<string, unknown>[]): Promise<Record<string, unknown>[]> {\n return Promise.all(\n pipeline.map(async (stage) => {\n if ('$sort' in stage && !Array.isArray(stage.$sort)) {\n return { ...stage, $sort: toSortPairs(stage.$sort as Sort) };\n }\n if ('$lookup' in stage && stage.$lookup && typeof stage.$lookup === 'object') {\n const { from, pipeline: inner, ...lookup } = stage.$lookup as Record<string, unknown>;\n const resolved: Record<string, unknown> = { ...lookup };\n if (from !== undefined) resolved.collectionId = await this.runtime.resolve(from as CollectionDefinition | string);\n if (Array.isArray(inner)) resolved.pipeline = await this.prepareStages(inner as Record<string, unknown>[]);\n return { ...stage, $lookup: resolved };\n }\n return stage;\n }),\n );\n }\n\n /* --------------------------------- writes --------------------------------- */\n\n /** Returns the creation snapshot in the same write; replay preserves that snapshot and requires current read access. */\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }> & { projection?: never }): Promise<{ insertedId: string; value: WithMeta<T> }>;\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }>): Promise<{ insertedId: string; value: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options?: Extract<InsertOneOptions, { returnDocument?: 'none' }>): Promise<{ insertedId: string }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions): Promise<{ insertedId: string; value?: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions = {}): Promise<{ insertedId: string; value?: WithMeta<T> | WithMeta<DeepPartial<T>> }> {\n const { id, data } = validateDocument(this.definition, document as Record<string, unknown>);\n const result = await this.post<{ insertedId: string; value: UnsRecord }>('recordInsertOne', {\n id, data, idempotencyKey: options.idempotencyKey, returnDocument: options.returnDocument, projection: options.projection,\n });\n if (options.returnDocument === 'after') return { insertedId: result.insertedId, value: toDoc<T>(result.value) };\n return { insertedId: result.insertedId };\n }\n\n /** Inserts up to 200 documents atomically (all or none). */\n async insertMany(\n documents: readonly (TInput & { _id?: string })[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{ insertedCount: number; insertedIds: string[] }> {\n if (documents.length === 0) return { insertedCount: 0, insertedIds: [] };\n assertAtomicBatch('insertMany', documents.length);\n const prepared = documents.map((document) => validateDocument(this.definition, document as Record<string, unknown>));\n const result = await this.post<WriteResult>('recordInsertMany', {\n documents: prepared.map(({ id, data }) => compact({ id, data })),\n ordered: true,\n atomic: true,\n idempotencyKey: options.idempotencyKey,\n });\n assertNoWriteErrors(result, 'insertMany');\n return { insertedCount: result.insertedCount ?? 0, insertedIds: idsInOrder(result.insertedIds) };\n }\n\n async updateOne(\n filter: Filter,\n update: Update,\n options: UpdateOptions = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const result = await this.post<WriteResult>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /**\n * Updates every match like Mongo's updateMany: documents commit one by one\n * (not atomically), following `resumeAfter` until every match is processed.\n * A failure after some documents committed keeps its code but is\n * `execution: \"committed\"`, with the cumulative counts and\n * `details.resumeAfter`; pass that back as `resumeAfter` to continue\n * instead of repeating the call. For all-or-nothing multi-document changes\n * use `data.transact` (≤200 items).\n */\n async updateMany(\n filter: Filter,\n update: Update,\n options: Pick<UpdateOptions, 'arrayFilters'> & { resumeAfter?: string } = {},\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const validated = validateUpdate(this.definition, update);\n let matchedCount = 0;\n let modifiedCount = 0;\n await this.writeEach('updateMany', 'recordUpdateMany', { filter, update: validated, arrayFilters: options.arrayFilters }, options.resumeAfter, (result) => {\n matchedCount += result.matchedCount ?? 0;\n modifiedCount += result.modifiedCount ?? 0;\n return { matchedCount, modifiedCount };\n });\n return { matchedCount, modifiedCount };\n }\n\n /** Runs a non-atomic many-write page by page; see updateMany for failures. */\n private async writeEach(\n name: string,\n operation: UnsV2OperationName,\n body: Record<string, unknown>,\n from: string | undefined,\n add: (result: WriteResult) => Record<string, number>,\n ): Promise<void> {\n let resumeAfter = from;\n let committed: Record<string, number> | undefined;\n do {\n let result: ManyPage;\n try {\n result = await this.post<ManyPage>(operation, { ...body, atomic: false, resumeAfter });\n } catch (error) {\n if (!(error instanceof DataError)) throw error;\n // UNS reports what the failed page itself committed, with where to continue.\n const page = error.execution === 'committed' ? (error.details as ManyPage) : undefined;\n const totals = page ? add(page) : committed;\n // Nothing of this call took effect: the page's own error tells the truth.\n if (!totals || !Object.values(totals).some((value) => value > 0)) throw error;\n throw partialWrite(name, totals, page ? (page.resumeAfter ?? undefined) : resumeAfter, error);\n }\n committed = add(result);\n assertNoWriteErrors(result, name, committed);\n resumeAfter = result.hasMore && result.resumeAfter ? result.resumeAfter : undefined;\n } while (resumeAfter);\n }\n\n /**\n * Replaces the whole body. Fields written by another App version and not in\n * this declaration are lost — prefer `updateOne` with `$set`.\n */\n async replaceOne(\n filter: Filter,\n replacement: TInput,\n options: Omit<UpdateOptions, 'arrayFilters'> = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<WriteResult>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /** Soft-deletes one record; requires `uns.delete` on the App key. */\n async deleteOne(filter: Filter, options: Pick<UpdateOptions, 'expectedRevision' | 'sort' | 'idempotencyKey'> = {}): Promise<{ deletedCount: number }> {\n const result = await this.post<WriteResult>(\n 'recordDeleteOne',\n { filter, expectedRevision: options.expectedRevision, sort: toSortPairs(options.sort), idempotencyKey: options.idempotencyKey },\n );\n return { deletedCount: result.deletedCount ?? 0 };\n }\n\n /**\n * Soft-deletes every match, one document at a time like Mongo's deleteMany\n * (not atomic), following `resumeAfter`; requires `uns.delete` on the App\n * key. Failures after committed deletes report them as updateMany does.\n */\n async deleteMany(filter: Filter, options: { resumeAfter?: string } = {}): Promise<{ deletedCount: number }> {\n let deletedCount = 0;\n await this.writeEach('deleteMany', 'recordDeleteMany', { filter }, options.resumeAfter, (result) => {\n deletedCount += result.deletedCount ?? 0;\n return { deletedCount };\n });\n return { deletedCount };\n }\n\n /**\n * Atomic read-modify-write. A state transition puts the expected state in\n * the filter: `findOneAndUpdate({ _id, status: \"DRAFT\" }, { $set: { status: \"SUBMITTED\" } })`\n * returns null when another request moved the record first.\n */\n async findOneAndUpdate(filter: Filter, update: Update, options: FindOneAndOptions = {}): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>('recordFindOneAndUpdate', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndReplace(\n filter: Filter,\n replacement: TInput,\n options: Omit<FindOneAndOptions, 'arrayFilters'> = {},\n ): Promise<WithMeta<T> | null> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<{ value: UnsRecord | null }>('recordFindOneAndReplace', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndDelete(\n filter: Filter,\n options: Pick<FindOneAndOptions, 'expectedRevision' | 'sort' | 'projection' | 'idempotencyKey'> = {},\n ): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>(\n 'recordFindOneAndDelete',\n {\n filter,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n },\n );\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n /** Up to 200 mixed single-record writes in one atomic call (insertOne / updateOne / replaceOne / deleteOne). */\n async bulkWrite(\n operations: readonly BulkOperation[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{\n insertedCount: number;\n matchedCount: number;\n modifiedCount: number;\n deletedCount: number;\n upsertedCount: number;\n insertedIds: Record<number, string>;\n upsertedIds: Record<number, string>;\n }> {\n assertAtomicBatch('bulkWrite', operations.length);\n const mapped = operations.map((operation) => {\n if ('insertOne' in operation) {\n const { id, data } = validateDocument(this.definition, operation.insertOne.document);\n return { insertOne: compact({ id, data }) };\n }\n if ('updateOne' in operation) {\n const { filter, update, upsert, sort } = operation.updateOne;\n return { updateOne: compact({ filter, update: validateUpdate(this.definition, update), upsert, sort: toSortPairs(sort) }) };\n }\n if ('replaceOne' in operation) {\n const { filter, replacement, upsert, sort } = operation.replaceOne;\n const { data } = validateDocument(this.definition, replacement);\n return { replaceOne: compact({ filter, replacement: data, upsert, sort: toSortPairs(sort) }) };\n }\n if ('deleteOne' in operation) {\n return { deleteOne: compact({ filter: operation.deleteOne.filter, sort: toSortPairs(operation.deleteOne.sort) }) };\n }\n throw new Error(\n `Unsupported bulkWrite operation ${Object.keys(operation).join(', ')}; use updateMany() / deleteMany() or data.transact().`,\n );\n });\n if (mapped.length === 0) {\n return { insertedCount: 0, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, insertedIds: {}, upsertedIds: {} };\n }\n const result = await this.post<WriteResult>(\n 'recordBulkWrite',\n { operations: mapped, ordered: true, atomic: true, idempotencyKey: options.idempotencyKey },\n );\n assertNoWriteErrors(result, 'bulkWrite');\n const numericKeys = (ids: Record<string, string> | undefined) =>\n Object.fromEntries(Object.entries(ids ?? {}).map(([index, id]) => [Number(index), id]));\n return {\n insertedCount: result.insertedCount ?? 0,\n matchedCount: result.matchedCount ?? 0,\n modifiedCount: result.modifiedCount ?? 0,\n deletedCount: result.deletedCount ?? 0,\n upsertedCount: result.upsertedCount ?? 0,\n insertedIds: numericKeys(result.insertedIds),\n upsertedIds: numericKeys(result.upsertedIds),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/data/collection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mongo-driver-style collection handle over the UNS record operations\n * (`recordFind`, `recordBulkWrite`, ...).\n *\n * Stored records `{ id, data, revision, createdAt, updatedAt }` are exposed as\n * flat documents `{ _id, ...data, _meta: { revision, createdAt, updatedAt } }`;\n * filters, sorts and projections use the same paths (`status`,\n * `customer.id`, `_id`, `_meta.updatedAt`).\n */\nimport type { UnsV2OperationName } from '../uns-v2/generated.js';\nimport type { CallOptions, DataCall } from './call.js';\nimport type { CollectionDefinition, RecordMeta } from './define.js';\nimport { DataError } from './error.js';\nimport { validateDocument, validateUpdate } from './schema.js';\nimport { toSortPairs, type Filter, type Sort, type SortPairs } from './sort.js';\n\n/** UNS page limit for find / aggregate / distinct. */\nexport const MAX_PAGE_SIZE = 200;\n\n/**\n * UNS commits at most 200 items in one synchronous atomic batch\n * (insertMany, bulkWrite, data.transact).\n */\nexport const MAX_ATOMIC_ITEMS = 200;\n\nexport type WithMeta<T> = T & { _id: string; _meta: RecordMeta };\n/** A projection may omit business fields at any depth; array and tuple containers retain their shape. */\nexport type DeepPartial<T> = T extends readonly unknown[]\n ? { [K in keyof T]: DeepPartial<T[K]> }\n : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;\nexport type Projection = Record<string, 0 | 1 | boolean>;\nexport type Update = Record<string, unknown>;\n\nexport interface UnsRecord {\n id: string;\n data: Record<string, unknown>;\n revision: number;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface PageInfo {\n hasMore: boolean;\n nextCursor?: string | null;\n nextPage?: number | null;\n}\n\n/** Position of the next page: an opaque cursor or a 1-based offset page number. */\ntype PageToken = string | number;\n\ninterface Page<T> {\n items: T[];\n /** Token of the following page; null when this was the last one. */\n next: PageToken | null;\n}\n\ninterface WriteResult {\n matchedCount?: number;\n modifiedCount?: number;\n deletedCount?: number;\n insertedCount?: number;\n upsertedId?: string | null;\n insertedIds?: Record<string, string>;\n upsertedIds?: Record<string, string>;\n upsertedCount?: number;\n writeErrors?: unknown[];\n hasMore?: boolean;\n}\n\n/** A page of `updateMany` / `deleteMany`, the only writes that continue with `resumeAfter`. */\ninterface ManyPage extends WriteResult {\n resumeAfter?: string | null;\n}\n\n/** Runtime services a collection handle needs from its client. */\nexport interface CollectionRuntime {\n call: DataCall;\n /** Collection ID of a declaration or declared alias, ensuring all declarations first. */\n resolve(target: CollectionDefinition | string): Promise<string>;\n /** Runs a call, re-ensuring and retrying once when its collection ID went stale (see bootstrap). */\n recover<R>(fn: () => Promise<R>, options?: { retry?: boolean }): Promise<R>;\n /** Data subject of the request being served. */\n subject(): string | undefined;\n /** Abort signal of the request being served. */\n signal(): AbortSignal | undefined;\n}\n\n/** Rejects batches UNS would refuse, before anything is sent. */\nexport function assertAtomicBatch(operation: string, count: number) {\n if (count > MAX_ATOMIC_ITEMS) {\n throw new DataError({\n message:\n `${operation} commits at most ${MAX_ATOMIC_ITEMS} items atomically; got ${count}. ` +\n `Split the input into chunks of ${MAX_ATOMIC_ITEMS} (each chunk commits on its own; give each chunk a stable ` +\n 'idempotencyKey or fixed _ids so a retry is safe), or keep all-or-nothing work within one batch.',\n status: 400,\n code: 'BATCH_LIMIT_EXCEEDED',\n });\n }\n}\n\nexport function toDoc<T>(record: UnsRecord): WithMeta<T> {\n return {\n ...(record.data as T),\n _id: record.id,\n _meta: { revision: record.revision, createdAt: record.createdAt, updatedAt: record.updatedAt },\n };\n}\n\n/**\n * Async-iterable result set. Pages hold at most 200 items; the page source\n * decides whether the next page is reached by cursor or by offset page number.\n */\nexport class Cursor<T> implements AsyncIterable<T> {\n private sortSpec?: Sort;\n private limitCount?: number;\n private projection?: Projection;\n private started = false;\n\n constructor(\n private readonly fetchPage: (state: {\n token: PageToken | null;\n size: number;\n sort?: SortPairs;\n projection?: Projection;\n }) => Promise<Page<T>>,\n options: { sort?: Sort; limit?: number; projection?: Projection } = {},\n ) {\n this.sortSpec = options.sort;\n this.limitCount = options.limit;\n this.projection = options.projection;\n }\n\n private assertNotStarted() {\n if (this.started) throw new Error('Cursor options must be set before iteration starts.');\n }\n\n sort(sort: Sort): this {\n this.assertNotStarted();\n this.sortSpec = sort;\n return this;\n }\n\n /** Total number of documents to return (pages are fetched ≤200 at a time). */\n limit(count: number): this {\n this.assertNotStarted();\n this.limitCount = count;\n return this;\n }\n\n project(projection: Projection): this {\n this.assertNotStarted();\n this.projection = projection;\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n this.started = true;\n const sort = toSortPairs(this.sortSpec);\n let remaining = this.limitCount ?? Number.POSITIVE_INFINITY;\n // One page size for the whole iteration: offset pages are only stable when it never changes.\n const size = Math.min(MAX_PAGE_SIZE, remaining);\n let token: PageToken | null = null;\n while (remaining > 0) {\n const page = await this.fetchPage({ token, size, sort, projection: this.projection });\n for (const item of page.items.slice(0, remaining)) yield item;\n remaining -= page.items.length;\n if (page.next === null || page.items.length === 0) return;\n token = page.next;\n }\n }\n\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n/** Pipelines made only of `$match` / `$sort` page by cursor; UNS requires offset paging for any other stage. */\nfunction isDirectPipeline(stages: readonly Record<string, unknown>[]): boolean {\n return stages.every((stage) => Object.keys(stage).every((key) => key === '$match' || key === '$sort'));\n}\n\nexport interface FindOptions {\n sort?: Sort;\n limit?: number;\n projection?: Projection;\n}\n\nexport interface FindPageOptions {\n sort?: Sort;\n /** 1-based page number. */\n page?: number;\n /** At most 200. */\n pageSize?: number;\n projection?: Projection;\n /** Count matches up to this many (1–100000); UNS defaults to 10000. */\n maxCount?: number;\n}\n\n/** A match count UNS stopped at its limit: `capped` means \"at least `count`\". */\nexport interface CappedCount {\n count: number;\n capped: boolean;\n}\n\n/** UNS reads at most 100 records by ID per request. */\nexport const MAX_GET_IDS = 100;\n\nexport interface FoundPage<T> {\n items: WithMeta<T>[];\n total: CappedCount;\n page: number;\n pageSize: number;\n}\n\nexport interface ValueCount {\n value: unknown;\n count: number;\n}\n\ninterface RecordGetResult {\n items: UnsRecord[];\n missing: string[];\n}\n\n/** One read of `data.queryBatch`, built by `collection.query.*`. */\nexport interface BatchQuery<R> {\n readonly collection: CollectionDefinition;\n /** The batch item without `id` and `collectionId`; resolves `$lookup` targets. */\n prepare(): Promise<Record<string, unknown>>;\n /** The item's result as the builder's caller sees it. */\n parse(data: unknown): R;\n}\n\nexport interface CollectionQueries<T> {\n /** First page (≤200, default 20); `maxCount` adds the capped total of all matches. */\n find(filter?: Filter, options?: { sort?: Sort; limit?: number; projection?: Projection; maxCount?: number }):\n BatchQuery<{ items: WithMeta<T>[]; hasMore: boolean; total?: CappedCount }>;\n /** Like `collection.findPage`. */\n findPage(filter?: Filter, options?: FindPageOptions): BatchQuery<FoundPage<T>>;\n count(filter?: Filter, options?: { maxCount?: number }): BatchQuery<CappedCount>;\n /** The 200 most frequent values. */\n countBy(field: string, filter?: Filter): BatchQuery<ValueCount[]>;\n /** The first 200 distinct values. */\n distinct(field: string, filter?: Filter): BatchQuery<unknown[]>;\n /** The first 200 output rows. */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): BatchQuery<R[]>;\n /** 1–100 distinct records by ID, as `collection.get`. */\n get(ids: readonly string[], options?: { projection?: Projection }): BatchQuery<{ items: WithMeta<T>[]; missing: string[] }>;\n}\n\nexport interface UpdateOptions {\n upsert?: boolean;\n /** Reject the write with VERSION_CONFLICT unless the record is at this revision. */\n expectedRevision?: number;\n sort?: Sort;\n arrayFilters?: Record<string, unknown>[];\n idempotencyKey?: string;\n}\n\nexport interface FindOneAndOptions extends UpdateOptions {\n returnDocument?: 'before' | 'after';\n projection?: Projection;\n}\n\nexport type InsertOneOptions = { idempotencyKey?: string } & (\n | { returnDocument?: 'none'; projection?: never }\n | { returnDocument: 'after'; projection?: Projection }\n);\n\nexport type BulkOperation =\n | { insertOne: { document: Record<string, unknown> } }\n | { updateOne: { filter: Filter; update: Update; upsert?: boolean; sort?: Sort } }\n | { replaceOne: { filter: Filter; replacement: Record<string, unknown>; upsert?: boolean; sort?: Sort } }\n | { deleteOne: { filter: Filter; sort?: Sort } };\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction filterOrNothing(filter: Filter): Filter | undefined {\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/** `recordAggregatePipeline` body of one numbered page with its capped total. */\nfunction pageRequest(filter: Filter, options: FindPageOptions) {\n const page = Math.max(1, Math.trunc(options.page ?? 1));\n const pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, Math.trunc(options.pageSize ?? 20)));\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n const sort = toSortPairs(options.sort);\n if (sort) pipeline.push({ $sort: sort });\n if (options.projection) pipeline.push({ $project: options.projection });\n const body = { pipeline, page: { mode: 'offset', page, size: pageSize }, count: options.maxCount === undefined ? {} : { max: options.maxCount } };\n return { body, page, pageSize };\n}\n\nfunction countByPipeline(field: string, filter: Filter): Record<string, unknown>[] {\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n // `_id` breaks ties, so offset pages of equal counts neither repeat nor skip a group.\n pipeline.push({ $group: { _id: `$${field}`, count: { $sum: 1 } } }, { $sort: { count: -1, _id: 1 } });\n return pipeline;\n}\n\nconst toValueCount = (row: { _id: unknown; count: number }): ValueCount => ({ value: row._id ?? null, count: row.count });\n\nfunction idsInOrder(ids: Record<string, string> | undefined): string[] {\n return Object.entries(ids ?? {})\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, id]) => id);\n}\n\n/**\n * Atomic batches pass no `committed` counts: their write errors rolled the\n * whole batch back. Non-atomic runs pass their cumulative counts; `details`\n * then has the shape `partialWrite` uses.\n */\nexport function assertNoWriteErrors(result: ManyPage, operation: string, committed?: Record<string, number>) {\n if (result.writeErrors && result.writeErrors.length > 0) {\n const counts = Object.entries(committed ?? {}).map(([name, value]) => `${name}=${value}`).join(', ');\n const changed = committed !== undefined && Object.values(committed).some((value) => value > 0);\n throw new DataError({\n message: `${operation} stopped on ${result.writeErrors.length} write error(s)${counts ? `; already committed: ${counts}` : ''}.`,\n status: 409,\n code: 'WRITE_ERRORS',\n execution: changed ? 'committed' : 'rolledBack',\n attempts: 1,\n details: committed\n ? { ...committed, status: changed ? 'partiallyCommitted' : 'failed', hasMore: Boolean(result.hasMore), resumeAfter: result.resumeAfter ?? null, writeErrors: result.writeErrors }\n : { writeErrors: result.writeErrors },\n });\n }\n}\n\n/**\n * A non-atomic run failed after some writes committed: on an earlier page, or\n * within the failed page (UNS then answers `execution: \"committed\"` with the\n * page's partial result as `data`). Like UNS, the error keeps its code and is\n * `committed` with `retry.safe: false`; `details` is the cumulative result\n * of the whole call in the shape of a success (`matchedCount` …, `status:\n * \"partiallyCommitted\"`, `hasMore`, `resumeAfter`). Continue by passing\n * `resumeAfter` back; repeating the call would apply `$inc` / `$push` twice.\n */\nfunction partialWrite(operation: string, totals: Record<string, number>, resumeAfter: string | undefined, cause: DataError): DataError {\n const counts = Object.entries(totals).map(([name, value]) => `${name}=${value}`).join(', ');\n const writeErrors = Array.isArray(cause.details.writeErrors) ? { writeErrors: cause.details.writeErrors } : {};\n return new DataError({\n message:\n `${operation} committed ${counts} and then failed: ${cause.message} ` +\n (resumeAfter\n ? `Continue with { resumeAfter: details.resumeAfter }${cause.outcomeUnknown ? ' after checking the failed page, whose outcome is unknown' : ''}; do not repeat the whole call.`\n : 'Read back what changed before writing again; do not repeat the whole call.'),\n status: cause.status,\n code: cause.code,\n reason: cause.reason,\n upstreamStatus: cause.upstreamStatus,\n requestId: cause.requestId,\n // Earlier writes took effect; the failed page too, perhaps, when its outcome is unknown.\n execution: cause.outcomeUnknown ? 'unknown' : 'committed',\n retry: { safe: false },\n attempts: cause.attempts,\n details: { ...totals, status: 'partiallyCommitted', hasMore: true, resumeAfter: resumeAfter ?? null, ...writeErrors },\n cause,\n });\n}\n\nexport class Collection<T extends object = Record<string, unknown>, TInput extends object = T> {\n constructor(\n readonly definition: CollectionDefinition,\n private readonly runtime: CollectionRuntime,\n ) {}\n\n get alias(): string {\n return this.definition.alias;\n }\n\n /**\n * One call with stale-ID recovery. A call continuing a cursor or\n * resumeAfter token of the old collection is not retried: the token means\n * nothing to a recreated collection.\n */\n private post<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const page = body.page as { cursor?: unknown } | undefined;\n const continues = typeof body.cursor === 'string' || typeof body.resumeAfter === 'string' || typeof page?.cursor === 'string';\n return this.runtime.recover(() => this.send<R>(operation, body, options), { retry: !continues });\n }\n\n private async send<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const collectionId = await this.runtime.resolve(this.definition);\n return this.runtime.call<R>(operation, { collectionId, ...compact(body) }, {\n dataSubject: this.runtime.subject(),\n signal: this.runtime.signal(),\n ...options,\n });\n }\n\n /* ---------------------------------- reads --------------------------------- */\n\n find(filter: Filter = {}, options: FindOptions = {}): Cursor<WithMeta<T>> {\n return new Cursor<WithMeta<T>>(async ({ token, size, sort, projection }) => {\n const result = await this.post<{ items: UnsRecord[]; pageInfo: PageInfo }>('recordFind', {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n sort,\n projection,\n limit: size,\n cursor: typeof token === 'string' ? token : undefined,\n });\n return {\n items: result.items.map((record) => toDoc<T>(record)),\n next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null,\n };\n }, options);\n }\n\n async findOne(filter: Filter = {}, options: Omit<FindOptions, 'limit'> = {}): Promise<WithMeta<T> | null> {\n const [first] = await this.find(filter, { ...options, limit: 1 }).toArray();\n return first ?? null;\n }\n\n /**\n * Records by ID, in the order asked for (each ID once, at its first\n * position); IDs that do not exist, are deleted or are hidden by employee\n * data rules are listed in `missing` alike. More than 100 IDs are read in\n * chunks of 100 (not one snapshot).\n */\n async get(ids: readonly string[], options: { projection?: Projection } = {}): Promise<{ items: WithMeta<T>[]; missing: string[] }> {\n const unique = [...new Set(ids)];\n const chunks: string[][] = [];\n for (let start = 0; start < unique.length; start += MAX_GET_IDS) chunks.push(unique.slice(start, start + MAX_GET_IDS));\n const results = await Promise.all(chunks.map((chunk) =>\n this.post<RecordGetResult>('recordGet', { ids: chunk, projection: options.projection })));\n return {\n items: results.flatMap((result) => result.items.map((record) => toDoc<T>(record))),\n missing: results.flatMap((result) => result.missing),\n };\n }\n\n /**\n * One numbered page plus the total match count, for paged list screens:\n * one `recordAggregatePipeline` offset page whose `count` runs in the same\n * snapshot. Show a capped total as \"10000+\".\n */\n async findPage(filter: Filter = {}, options: FindPageOptions = {}): Promise<FoundPage<T>> {\n const { body, page, pageSize } = pageRequest(filter, options);\n const result = await this.post<{ items: WithMeta<T>[]; total: CappedCount }>('recordAggregatePipeline', body);\n return { items: result.items, total: result.total, page, pageSize };\n }\n\n /**\n * Counts matches up to `maxCount` (1–100000, UNS default 100000). A\n * `capped` result means \"at least `count`\".\n */\n async countDocuments(filter: Filter = {}, options: { maxCount?: number } = {}): Promise<CappedCount> {\n const result = await this.post<CappedCount>('recordCount', { filter: filterOrNothing(filter), maxCount: options.maxCount });\n return { count: result.count, capped: result.capped };\n }\n\n /**\n * Match counts per value of `field`, largest first: one `$group` pipeline\n * instead of a count per value. Records without the field count under\n * `value: null`.\n */\n async countBy(field: string, filter: Filter = {}): Promise<ValueCount[]> {\n const rows = await this.aggregate<{ _id: unknown; count: number }>(countByPipeline(field, filter)).toArray();\n return rows.map(toValueCount);\n }\n\n /**\n * Builders for `data.queryBatch`: each describes one read of this\n * collection, run together with the others in one request and one\n * snapshot. Each returns one page (at most 200 rows), unlike the cursor\n * methods; `get` takes at most 100 IDs.\n */\n get query(): CollectionQueries<T> {\n const one = <R>(op: string, build: () => Promise<Record<string, unknown>>, parse: (data: never) => R): BatchQuery<R> => ({\n collection: this.definition,\n prepare: async () => ({ op, ...compact(await build()) }),\n parse: parse as (data: unknown) => R,\n });\n return {\n find: (filter = {}, options = {}) =>\n one('find', async () => ({\n filter: filterOrNothing(filter),\n sort: toSortPairs(options.sort),\n projection: options.projection,\n limit: Math.min(MAX_PAGE_SIZE, options.limit ?? 20),\n count: options.maxCount === undefined ? undefined : { max: options.maxCount },\n }), (data: { items: UnsRecord[]; pageInfo: PageInfo; total?: CappedCount }) => ({\n items: data.items.map((record) => toDoc<T>(record)),\n hasMore: data.pageInfo.hasMore,\n ...(data.total ? { total: data.total } : {}),\n })),\n findPage: (filter = {}, options = {}) => {\n const { body, page, pageSize } = pageRequest(filter, options);\n return one('aggregate', async () => body, (data: { items: WithMeta<T>[]; total: CappedCount }) => ({\n items: data.items, total: data.total, page, pageSize,\n }));\n },\n count: (filter = {}, options = {}) =>\n one('count', async () => ({ filter: filterOrNothing(filter), maxCount: options.maxCount }),\n (data: CappedCount) => ({ count: data.count, capped: data.capped })),\n countBy: (field, filter = {}) =>\n one('aggregate', async () => ({\n pipeline: await this.prepareStages(countByPipeline(field, filter)),\n page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE },\n }), (data: { items: { _id: unknown; count: number }[] }) => data.items.map(toValueCount)),\n distinct: (field, filter = {}) =>\n one('distinct', async () => ({ field, filter: filterOrNothing(filter), page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } }),\n (data: { values: unknown[] }) => data.values),\n aggregate: <R = Record<string, unknown>>(pipeline: Record<string, unknown>[]) =>\n one('aggregate', async () => {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n // A final $count returns one row and forbids an explicit page.\n return last !== undefined && '$count' in last\n ? { pipeline: stages }\n : { pipeline: stages, page: isDirectPipeline(stages) ? { mode: 'cursor', size: MAX_PAGE_SIZE } : { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } };\n }, (data: { items: R[] }) => data.items),\n get: (ids, options = {}) => {\n const unique = [...new Set(ids)];\n if (unique.length < 1 || unique.length > MAX_GET_IDS) {\n throw new TypeError(`query.get takes 1–${MAX_GET_IDS} distinct IDs; use collection.get for more.`);\n }\n return one('get', async () => ({ ids: unique, projection: options.projection }),\n (data: RecordGetResult) => ({ items: data.items.map((record) => toDoc<T>(record)), missing: data.missing }));\n },\n };\n }\n\n /** Distinct values of a field (every page). */\n async distinct(field: string, filter: Filter = {}): Promise<unknown[]> {\n const values: unknown[] = [];\n for (let page = 1; ; page += 1) {\n const result = await this.post<{ items: { _id: unknown }[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: [{ $match: filter }, { $group: { _id: `$${field}` } }],\n page: { mode: 'offset', page, size: MAX_PAGE_SIZE },\n });\n values.push(...result.items.map(item => item._id));\n if (!result.pageInfo.hasMore) return values;\n }\n }\n\n /**\n * Runs a pipeline (`$match`, `$sort`, `$group`, `$project`, `$set`,\n * `$lookup`, `$unwind`, `$skip`, `$limit`, `$count`). `$sort` accepts\n * `{ field: 1 | -1 }`; `$lookup` takes `from` (a declared collection or\n * alias of this App) instead of a collection ID. Rows are whatever the\n * pipeline outputs, not wrapped records.\n *\n * Pipelines of only `$match` / `$sort` page by cursor; any other stage pages\n * by offset (UNS rejects cursors for transformed results). The `$exists`,\n * `$distinct` and `$frequencies` stages are listed in the UNS schema but not\n * executed by the record pipeline; use `countDocuments`, `distinct` or `$group`.\n */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): Cursor<R> {\n // Recovery wraps stage preparation too, so a retry re-resolves `$lookup` IDs.\n return new Cursor<R>(({ token, size }) => this.runtime.recover(() => this.aggregatePage<R>(pipeline, token, size), { retry: typeof token !== 'string' }));\n }\n\n private async aggregatePage<R>(\n pipeline: Record<string, unknown>[],\n token: PageToken | null,\n size: number,\n ): Promise<Page<R>> {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n if (last !== undefined && '$count' in last) {\n // A final $count returns one row and forbids an explicit page.\n const result = await this.send<{ items: R[] }>('recordAggregatePipeline', { pipeline: stages });\n return { items: result.items, next: null };\n }\n if (isDirectPipeline(stages)) {\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'cursor', size, ...(typeof token === 'string' ? { cursor: token } : {}) },\n });\n return { items: result.items, next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null };\n }\n const page = typeof token === 'number' ? token : 1;\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'offset', page, size },\n });\n return {\n items: result.items,\n next: result.pageInfo.hasMore ? (result.pageInfo.nextPage ?? page + 1) : null,\n };\n }\n\n /** Converts Mongo-style `$sort` objects and resolves `$lookup.from`, recursively. */\n private async prepareStages(pipeline: readonly Record<string, unknown>[]): Promise<Record<string, unknown>[]> {\n return Promise.all(\n pipeline.map(async (stage) => {\n if ('$sort' in stage && !Array.isArray(stage.$sort)) {\n return { ...stage, $sort: toSortPairs(stage.$sort as Sort) };\n }\n if ('$lookup' in stage && stage.$lookup && typeof stage.$lookup === 'object') {\n const { from, pipeline: inner, ...lookup } = stage.$lookup as Record<string, unknown>;\n const resolved: Record<string, unknown> = { ...lookup };\n if (from !== undefined) resolved.collectionId = await this.runtime.resolve(from as CollectionDefinition | string);\n if (Array.isArray(inner)) resolved.pipeline = await this.prepareStages(inner as Record<string, unknown>[]);\n return { ...stage, $lookup: resolved };\n }\n return stage;\n }),\n );\n }\n\n /* --------------------------------- writes --------------------------------- */\n\n /** Returns the creation snapshot in the same write; replay preserves that snapshot and requires current read access. */\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }> & { projection?: never }): Promise<{ insertedId: string; value: WithMeta<T> }>;\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }>): Promise<{ insertedId: string; value: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options?: Extract<InsertOneOptions, { returnDocument?: 'none' }>): Promise<{ insertedId: string }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions): Promise<{ insertedId: string; value?: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions = {}): Promise<{ insertedId: string; value?: WithMeta<T> | WithMeta<DeepPartial<T>> }> {\n const { id, data } = validateDocument(this.definition, document as Record<string, unknown>);\n const result = await this.post<{ insertedId: string; value: UnsRecord }>('recordInsertOne', {\n id, data, idempotencyKey: options.idempotencyKey, returnDocument: options.returnDocument, projection: options.projection,\n });\n if (options.returnDocument === 'after') return { insertedId: result.insertedId, value: toDoc<T>(result.value) };\n return { insertedId: result.insertedId };\n }\n\n /** Inserts up to 200 documents atomically (all or none). */\n async insertMany(\n documents: readonly (TInput & { _id?: string })[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{ insertedCount: number; insertedIds: string[] }> {\n if (documents.length === 0) return { insertedCount: 0, insertedIds: [] };\n assertAtomicBatch('insertMany', documents.length);\n const prepared = documents.map((document) => validateDocument(this.definition, document as Record<string, unknown>));\n const result = await this.post<WriteResult>('recordBulkWrite', {\n operations: prepared.map(({ id, data }) => ({ insertOne: compact({ id, data }) })),\n ordered: true,\n atomic: true,\n idempotencyKey: options.idempotencyKey,\n });\n assertNoWriteErrors(result, 'insertMany');\n return { insertedCount: result.insertedCount ?? 0, insertedIds: idsInOrder(result.insertedIds) };\n }\n\n async updateOne(\n filter: Filter,\n update: Update,\n options: UpdateOptions = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const result = await this.post<WriteResult>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /**\n * Updates every match like Mongo's updateMany: documents commit one by one\n * (not atomically), following `resumeAfter` until every match is processed.\n * A failure after some documents committed keeps its code but is\n * `execution: \"committed\"`, with the cumulative counts and\n * `details.resumeAfter`; pass that back as `resumeAfter` to continue\n * instead of repeating the call. For all-or-nothing multi-document changes\n * use `data.transact` (≤200 items).\n */\n async updateMany(\n filter: Filter,\n update: Update,\n options: Pick<UpdateOptions, 'arrayFilters'> & { resumeAfter?: string } = {},\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const validated = validateUpdate(this.definition, update);\n let matchedCount = 0;\n let modifiedCount = 0;\n await this.writeEach('updateMany', 'recordUpdateMany', { filter, update: validated, arrayFilters: options.arrayFilters }, options.resumeAfter, (result) => {\n matchedCount += result.matchedCount ?? 0;\n modifiedCount += result.modifiedCount ?? 0;\n return { matchedCount, modifiedCount };\n });\n return { matchedCount, modifiedCount };\n }\n\n /** Runs a non-atomic many-write page by page; see updateMany for failures. */\n private async writeEach(\n name: string,\n operation: UnsV2OperationName,\n body: Record<string, unknown>,\n from: string | undefined,\n add: (result: WriteResult) => Record<string, number>,\n ): Promise<void> {\n let resumeAfter = from;\n let committed: Record<string, number> | undefined;\n do {\n let result: ManyPage;\n try {\n result = await this.post<ManyPage>(operation, { ...body, atomic: false, resumeAfter });\n } catch (error) {\n if (!(error instanceof DataError)) throw error;\n // UNS reports what the failed page itself committed, with where to continue.\n const page = error.execution === 'committed' ? (error.details as ManyPage) : undefined;\n const totals = page ? add(page) : committed;\n // Nothing of this call took effect: the page's own error tells the truth.\n if (!totals || !Object.values(totals).some((value) => value > 0)) throw error;\n throw partialWrite(name, totals, page ? (page.resumeAfter ?? undefined) : resumeAfter, error);\n }\n committed = add(result);\n assertNoWriteErrors(result, name, committed);\n resumeAfter = result.hasMore && result.resumeAfter ? result.resumeAfter : undefined;\n } while (resumeAfter);\n }\n\n /**\n * Replaces the whole body. Fields written by another App version and not in\n * this declaration are lost — prefer `updateOne` with `$set`.\n */\n async replaceOne(\n filter: Filter,\n replacement: TInput,\n options: Omit<UpdateOptions, 'arrayFilters'> = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<WriteResult>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /** Soft-deletes one record; requires `uns.delete` on the App key. */\n async deleteOne(filter: Filter, options: Pick<UpdateOptions, 'expectedRevision' | 'sort' | 'idempotencyKey'> = {}): Promise<{ deletedCount: number }> {\n const result = await this.post<WriteResult>(\n 'recordDeleteOne',\n { filter, expectedRevision: options.expectedRevision, sort: toSortPairs(options.sort), idempotencyKey: options.idempotencyKey },\n );\n return { deletedCount: result.deletedCount ?? 0 };\n }\n\n /**\n * Soft-deletes every match, one document at a time like Mongo's deleteMany\n * (not atomic), following `resumeAfter`; requires `uns.delete` on the App\n * key. Failures after committed deletes report them as updateMany does.\n */\n async deleteMany(filter: Filter, options: { resumeAfter?: string } = {}): Promise<{ deletedCount: number }> {\n let deletedCount = 0;\n await this.writeEach('deleteMany', 'recordDeleteMany', { filter }, options.resumeAfter, (result) => {\n deletedCount += result.deletedCount ?? 0;\n return { deletedCount };\n });\n return { deletedCount };\n }\n\n /**\n * Atomic read-modify-write. A state transition puts the expected state in\n * the filter: `findOneAndUpdate({ _id, status: \"DRAFT\" }, { $set: { status: \"SUBMITTED\" } })`\n * returns null when another request moved the record first.\n */\n async findOneAndUpdate(filter: Filter, update: Update, options: FindOneAndOptions = {}): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndReplace(\n filter: Filter,\n replacement: TInput,\n options: Omit<FindOneAndOptions, 'arrayFilters'> = {},\n ): Promise<WithMeta<T> | null> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<{ value: UnsRecord | null }>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndDelete(\n filter: Filter,\n options: Pick<FindOneAndOptions, 'expectedRevision' | 'sort' | 'projection' | 'idempotencyKey'> = {},\n ): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>(\n 'recordDeleteOne',\n {\n filter,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n returnDocument: 'before',\n },\n );\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n /** Up to 200 mixed single-record writes in one atomic call (insertOne / updateOne / replaceOne / deleteOne). */\n async bulkWrite(\n operations: readonly BulkOperation[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{\n insertedCount: number;\n matchedCount: number;\n modifiedCount: number;\n deletedCount: number;\n upsertedCount: number;\n insertedIds: Record<number, string>;\n upsertedIds: Record<number, string>;\n }> {\n assertAtomicBatch('bulkWrite', operations.length);\n const mapped = operations.map((operation) => {\n if ('insertOne' in operation) {\n const { id, data } = validateDocument(this.definition, operation.insertOne.document);\n return { insertOne: compact({ id, data }) };\n }\n if ('updateOne' in operation) {\n const { filter, update, upsert, sort } = operation.updateOne;\n return { updateOne: compact({ filter, update: validateUpdate(this.definition, update), upsert, sort: toSortPairs(sort) }) };\n }\n if ('replaceOne' in operation) {\n const { filter, replacement, upsert, sort } = operation.replaceOne;\n const { data } = validateDocument(this.definition, replacement);\n return { replaceOne: compact({ filter, replacement: data, upsert, sort: toSortPairs(sort) }) };\n }\n if ('deleteOne' in operation) {\n return { deleteOne: compact({ filter: operation.deleteOne.filter, sort: toSortPairs(operation.deleteOne.sort) }) };\n }\n throw new Error(\n `Unsupported bulkWrite operation ${Object.keys(operation).join(', ')}; use updateMany() / deleteMany() or data.transact().`,\n );\n });\n if (mapped.length === 0) {\n return { insertedCount: 0, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, insertedIds: {}, upsertedIds: {} };\n }\n const result = await this.post<WriteResult>(\n 'recordBulkWrite',\n { operations: mapped, ordered: true, atomic: true, idempotencyKey: options.idempotencyKey },\n );\n assertNoWriteErrors(result, 'bulkWrite');\n const numericKeys = (ids: Record<string, string> | undefined) =>\n Object.fromEntries(Object.entries(ids ?? {}).map(([index, id]) => [Number(index), id]));\n return {\n insertedCount: result.insertedCount ?? 0,\n matchedCount: result.matchedCount ?? 0,\n modifiedCount: result.modifiedCount ?? 0,\n deletedCount: result.deletedCount ?? 0,\n upsertedCount: result.upsertedCount ?? 0,\n insertedIds: numericKeys(result.insertedIds),\n upsertedIds: numericKeys(result.upsertedIds),\n };\n }\n}\n"]}
@@ -29,15 +29,6 @@ export declare class FilesClient {
29
29
  private readonly http;
30
30
  private readonly api;
31
31
  readonly multipart: {
32
- abort: (body: components["schemas"]["SdkassetsFilesMultipartAbortRequest"], options?: RequestOptions) => Promise<{
33
- aborted: number | bigint;
34
- }>;
35
- complete: (body: components["schemas"]["SdkassetsFilesMultipartCompleteRequest"], options?: RequestOptions) => Promise<{
36
- expiresAt?: number | bigint;
37
- filePath: string;
38
- fileUrl?: string;
39
- sizeBytes: number | bigint;
40
- }>;
41
32
  init: (body: components["schemas"]["SdkassetsFilesMultipartInitRequest"], options?: RequestOptions) => Promise<{
42
33
  expiresAt: number | bigint;
43
34
  fileKey: string;
@@ -49,6 +40,15 @@ export declare class FilesClient {
49
40
  partUrls: (body: components["schemas"]["SdkassetsFilesMultipartPartUrlsRequest"], options?: RequestOptions) => Promise<{
50
41
  partUrls: components["schemas"]["AssetFileMultipartPartUrl"][];
51
42
  }>;
43
+ complete: (body: components["schemas"]["SdkassetsFilesMultipartCompleteRequest"], options?: RequestOptions) => Promise<{
44
+ expiresAt?: number | bigint;
45
+ filePath: string;
46
+ fileUrl?: string;
47
+ sizeBytes: number | bigint;
48
+ }>;
49
+ abort: (body: components["schemas"]["SdkassetsFilesMultipartAbortRequest"], options?: RequestOptions) => Promise<{
50
+ aborted: number | bigint;
51
+ }>;
52
52
  };
53
53
  constructor(http: HttpClient);
54
54
  private storage;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * MQTT broker 地址归一化工具。
3
3
  *
4
- * 平台 `/openapi/v1/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:
4
+ * 平台 `/openapi/v2/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:
5
5
  * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);
6
6
  * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * MQTT broker 地址归一化工具。
3
3
  *
4
- * 平台 `/openapi/v1/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:
4
+ * 平台 `/openapi/v2/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:
5
5
  * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);
6
6
  * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/mq/broker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MQTT broker 地址归一化工具。\n *\n * 平台 `/openapi/v1/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:\n * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);\n * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。\n *\n * 浏览器 wss 客户端不应直接把它当 hostname 拼 URL(会得到 `wss://tcp://...`\n * 这类非法地址),先经本模块解析/推导,再交给 `Tier0MQClient`。\n */\n\n/** 解析后的 broker 端点。hostname 保证为裸主机(无 scheme、无端口、无路径)。 */\nexport interface MqttBrokerEndpoint {\n /** 裸主机名(已剥离 scheme/path/query,不含端口)。 */\n hostname: string;\n /**\n * 原始端口。注意:对 `tcp://host:1883` 这是 **tcp 端口**,浏览器 wss 场景\n * 不能直接沿用(wss 通常是 8084),由 `toWebSocketUrl` 的 `wssPort` 决定。\n */\n port?: number;\n /** 原始 scheme(tcp/mqtt/mqtts/ws/wss/...),裸 host 输入时为 undefined。 */\n scheme?: string;\n}\n\nconst SCHEME_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\//;\n\n/**\n * 解析各种形态的 broker 字符串为结构化端点。\n *\n * 兼容输入:`tcp://host:1883`、`mqtts://host:8883`、`wss://host:8084/mqtt`、\n * `host:1883`、裸 `host`。无法解析(空串、非法 URL)返回 undefined。\n */\nexport function parseMqttBroker(broker?: string | null): MqttBrokerEndpoint | undefined {\n const raw = broker?.trim();\n if (!raw) return undefined;\n\n if (SCHEME_RE.test(raw)) {\n try {\n const u = new URL(raw);\n if (!u.hostname) return undefined;\n const scheme = SCHEME_RE.exec(raw)?.[1]?.toLowerCase();\n return {\n hostname: u.hostname,\n port: u.port ? Number.parseInt(u.port, 10) : undefined,\n scheme,\n };\n } catch {\n return undefined;\n }\n }\n\n // 无 scheme:`host:port` 或裸 `host`;含路径/空白的是垃圾输入,拒绝\n if (/[\\s/]/.test(raw)) return undefined;\n const i = raw.lastIndexOf(':');\n if (i > 0 && /^\\d+$/.test(raw.slice(i + 1))) {\n const hostname = raw.slice(0, i);\n if (!hostname) return undefined;\n return { hostname, port: Number.parseInt(raw.slice(i + 1), 10) };\n }\n return { hostname: raw };\n}\n\n/** 浏览器 wss 默认端口(与平台 OS_MQTT_WEBSOCKET_TSL_PORT 默认值一致)。 */\nexport const DEFAULT_WSS_PORT = 8084;\n/** MQTT over WebSocket 路径。 */\nexport const DEFAULT_WS_PATH = '/mqtt';\n\nexport interface ToWebSocketUrlOptions {\n /** wss 端口,默认 {@link DEFAULT_WSS_PORT}(8084)。 */\n wssPort?: number;\n /**\n * 显式指定 ws(false)/wss(true)。缺省自适应:浏览器 https 页面用 wss,\n * 或 WebSocket 端口为 8084 时用 wss,其余用 ws。\n */\n secure?: boolean;\n}\n\n/**\n * 当前运行环境是否处于 https 安全上下文。\n *\n * 用 `globalThis.location` 而不是 `window.location`:Web Worker\n * (dedicated/shared)里 `window` 不存在,但 `location.protocol` 同样是 `https:`,\n * 应同等视为安全上下文(否则会被降级为 ws 而被浏览器按 mixed content 拦截)。\n */\nexport function isBrowserHttps(): boolean {\n const loc = (globalThis as { location?: { protocol?: string } }).location;\n return typeof loc?.protocol === 'string' && loc.protocol === 'https:';\n}\n\n/**\n * 把 `mqttBroker`(或 {@link MqttBrokerEndpoint})推导为可直接传给\n * `Tier0MQClient` 的 WebSocket URL。\n *\n * 规则:\n * - 输入已是 `ws(s)://` URL:原样归一(补 `/mqtt` 路径,端口、path、query 均保留);\n * - 输入 `tcp://host:1883` / `host:port` / 裸 `host`:按 `secure` 推导 scheme,\n * 端口一律用 `wssPort`(8084),**不沿用** tcp 端口;\n * - 输入为空/无法解析:返回 undefined(调用方应回退或报错,勿硬拼 URL)。\n *\n * @example\n * toWebSocketUrl('tcp://example.tier0.dev:1883', { secure: true });\n * // → 'wss://example.tier0.dev:8084/mqtt'\n */\nexport function toWebSocketUrl(\n broker: string | MqttBrokerEndpoint | undefined | null,\n opts: ToWebSocketUrlOptions = {},\n): string | undefined {\n if (broker == null || broker === '') return undefined;\n\n // 已是 ws(s) URL:解析后归一直通(保留其 scheme/端口/path/query,仅补 /mqtt 路径)\n if (typeof broker === 'string' && /^wss?:\\/\\//i.test(broker.trim())) {\n try {\n const u = new URL(broker.trim());\n if (!u.hostname) return undefined;\n if (!u.pathname || u.pathname === '/') {\n u.pathname = DEFAULT_WS_PATH;\n }\n return u.toString();\n } catch {\n return undefined;\n }\n }\n\n const endpoint = typeof broker === 'string' ? parseMqttBroker(broker) : broker;\n if (!endpoint?.hostname) return undefined;\n\n // ws(s) 端点:保留其 scheme 与端口(\"已是 WebSocket 地址\"的直通语义)\n if (endpoint.scheme === 'ws' || endpoint.scheme === 'wss') {\n const port = endpoint.port ? `:${endpoint.port}` : '';\n return `${endpoint.scheme}://${endpoint.hostname}${port}${DEFAULT_WS_PATH}`;\n }\n\n const port = opts.wssPort ?? DEFAULT_WSS_PORT;\n const secure = opts.secure ?? (isBrowserHttps() || port === DEFAULT_WSS_PORT);\n return `${secure ? 'wss' : 'ws'}://${endpoint.hostname}:${port}${DEFAULT_WS_PATH}`;\n}\n"]}
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/mq/broker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MQTT broker 地址归一化工具。\n *\n * 平台 `/openapi/v2/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:\n * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);\n * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。\n *\n * 浏览器 wss 客户端不应直接把它当 hostname 拼 URL(会得到 `wss://tcp://...`\n * 这类非法地址),先经本模块解析/推导,再交给 `Tier0MQClient`。\n */\n\n/** 解析后的 broker 端点。hostname 保证为裸主机(无 scheme、无端口、无路径)。 */\nexport interface MqttBrokerEndpoint {\n /** 裸主机名(已剥离 scheme/path/query,不含端口)。 */\n hostname: string;\n /**\n * 原始端口。注意:对 `tcp://host:1883` 这是 **tcp 端口**,浏览器 wss 场景\n * 不能直接沿用(wss 通常是 8084),由 `toWebSocketUrl` 的 `wssPort` 决定。\n */\n port?: number;\n /** 原始 scheme(tcp/mqtt/mqtts/ws/wss/...),裸 host 输入时为 undefined。 */\n scheme?: string;\n}\n\nconst SCHEME_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\//;\n\n/**\n * 解析各种形态的 broker 字符串为结构化端点。\n *\n * 兼容输入:`tcp://host:1883`、`mqtts://host:8883`、`wss://host:8084/mqtt`、\n * `host:1883`、裸 `host`。无法解析(空串、非法 URL)返回 undefined。\n */\nexport function parseMqttBroker(broker?: string | null): MqttBrokerEndpoint | undefined {\n const raw = broker?.trim();\n if (!raw) return undefined;\n\n if (SCHEME_RE.test(raw)) {\n try {\n const u = new URL(raw);\n if (!u.hostname) return undefined;\n const scheme = SCHEME_RE.exec(raw)?.[1]?.toLowerCase();\n return {\n hostname: u.hostname,\n port: u.port ? Number.parseInt(u.port, 10) : undefined,\n scheme,\n };\n } catch {\n return undefined;\n }\n }\n\n // 无 scheme:`host:port` 或裸 `host`;含路径/空白的是垃圾输入,拒绝\n if (/[\\s/]/.test(raw)) return undefined;\n const i = raw.lastIndexOf(':');\n if (i > 0 && /^\\d+$/.test(raw.slice(i + 1))) {\n const hostname = raw.slice(0, i);\n if (!hostname) return undefined;\n return { hostname, port: Number.parseInt(raw.slice(i + 1), 10) };\n }\n return { hostname: raw };\n}\n\n/** 浏览器 wss 默认端口(与平台 OS_MQTT_WEBSOCKET_TSL_PORT 默认值一致)。 */\nexport const DEFAULT_WSS_PORT = 8084;\n/** MQTT over WebSocket 路径。 */\nexport const DEFAULT_WS_PATH = '/mqtt';\n\nexport interface ToWebSocketUrlOptions {\n /** wss 端口,默认 {@link DEFAULT_WSS_PORT}(8084)。 */\n wssPort?: number;\n /**\n * 显式指定 ws(false)/wss(true)。缺省自适应:浏览器 https 页面用 wss,\n * 或 WebSocket 端口为 8084 时用 wss,其余用 ws。\n */\n secure?: boolean;\n}\n\n/**\n * 当前运行环境是否处于 https 安全上下文。\n *\n * 用 `globalThis.location` 而不是 `window.location`:Web Worker\n * (dedicated/shared)里 `window` 不存在,但 `location.protocol` 同样是 `https:`,\n * 应同等视为安全上下文(否则会被降级为 ws 而被浏览器按 mixed content 拦截)。\n */\nexport function isBrowserHttps(): boolean {\n const loc = (globalThis as { location?: { protocol?: string } }).location;\n return typeof loc?.protocol === 'string' && loc.protocol === 'https:';\n}\n\n/**\n * 把 `mqttBroker`(或 {@link MqttBrokerEndpoint})推导为可直接传给\n * `Tier0MQClient` 的 WebSocket URL。\n *\n * 规则:\n * - 输入已是 `ws(s)://` URL:原样归一(补 `/mqtt` 路径,端口、path、query 均保留);\n * - 输入 `tcp://host:1883` / `host:port` / 裸 `host`:按 `secure` 推导 scheme,\n * 端口一律用 `wssPort`(8084),**不沿用** tcp 端口;\n * - 输入为空/无法解析:返回 undefined(调用方应回退或报错,勿硬拼 URL)。\n *\n * @example\n * toWebSocketUrl('tcp://example.tier0.dev:1883', { secure: true });\n * // → 'wss://example.tier0.dev:8084/mqtt'\n */\nexport function toWebSocketUrl(\n broker: string | MqttBrokerEndpoint | undefined | null,\n opts: ToWebSocketUrlOptions = {},\n): string | undefined {\n if (broker == null || broker === '') return undefined;\n\n // 已是 ws(s) URL:解析后归一直通(保留其 scheme/端口/path/query,仅补 /mqtt 路径)\n if (typeof broker === 'string' && /^wss?:\\/\\//i.test(broker.trim())) {\n try {\n const u = new URL(broker.trim());\n if (!u.hostname) return undefined;\n if (!u.pathname || u.pathname === '/') {\n u.pathname = DEFAULT_WS_PATH;\n }\n return u.toString();\n } catch {\n return undefined;\n }\n }\n\n const endpoint = typeof broker === 'string' ? parseMqttBroker(broker) : broker;\n if (!endpoint?.hostname) return undefined;\n\n // ws(s) 端点:保留其 scheme 与端口(\"已是 WebSocket 地址\"的直通语义)\n if (endpoint.scheme === 'ws' || endpoint.scheme === 'wss') {\n const port = endpoint.port ? `:${endpoint.port}` : '';\n return `${endpoint.scheme}://${endpoint.hostname}${port}${DEFAULT_WS_PATH}`;\n }\n\n const port = opts.wssPort ?? DEFAULT_WSS_PORT;\n const secure = opts.secure ?? (isBrowserHttps() || port === DEFAULT_WSS_PORT);\n return `${secure ? 'wss' : 'ws'}://${endpoint.hostname}:${port}${DEFAULT_WS_PATH}`;\n}\n"]}
@@ -3,7 +3,7 @@ export interface MQTTConfig {
3
3
  * broker 地址。支持三种形态:
4
4
  * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);
5
5
  * - 裸 `host`(可含端口,如 `host:8084`);
6
- * - 平台 `/openapi/v1/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,
6
+ * - 平台 `/openapi/v2/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,
7
7
  * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。
8
8
  */
9
9
  host?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mq/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface MQTTConfig {\n /**\n * broker 地址。支持三种形态:\n * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);\n * - 裸 `host`(可含端口,如 `host:8084`);\n * - 平台 `/openapi/v1/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,\n * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。\n */\n host?: string;\n /** WebSocket port fallback when host has no embedded WebSocket port. */\n port?: number;\n /**\n * 当 host 不带 ws(s) scheme 时,显式指定用 wss(true) 还是 ws(false)。\n * 缺省自适应:浏览器 https 页面或端口 8084 用 wss,其余用 ws。\n */\n secure?: boolean;\n clientId?: string;\n username?: string;\n /** Original API key; connect-time changes refresh automatically derived identity fields. */\n password?: string;\n keepAlive?: number;\n reconnectPeriod?: number;\n connectTimeout?: number;\n clean?: boolean;\n /**\n * 背压保护阈值:handler 连续返回 false(表示下游停滞/消费者已断开)达到\n * 该次数后,SDK 自动移除该订阅并向 broker 退订,避免消息在无消费者的\n * 应用内队列中持续堆积。0 或不设置表示关闭该保护(保持原有行为)。\n */\n maxBackpressuredDeliveries?: number;\n}\n\nexport type MQTTMessage = {\n topic: string;\n payload: string | Buffer;\n qos: number;\n retain: boolean;\n};\n\nexport type MQTTEventMap = {\n connect: () => void;\n disconnect: () => void;\n error: (error: Error) => void;\n message: (message: MQTTMessage) => void;\n /** 订阅因持续背压被 SDK 自动移除时触发。 */\n subscriptionDropped: (info: { topic: string; reason: string }) => void;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mq/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface MQTTConfig {\n /**\n * broker 地址。支持三种形态:\n * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);\n * - 裸 `host`(可含端口,如 `host:8084`);\n * - 平台 `/openapi/v2/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,\n * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。\n */\n host?: string;\n /** WebSocket port fallback when host has no embedded WebSocket port. */\n port?: number;\n /**\n * 当 host 不带 ws(s) scheme 时,显式指定用 wss(true) 还是 ws(false)。\n * 缺省自适应:浏览器 https 页面或端口 8084 用 wss,其余用 ws。\n */\n secure?: boolean;\n clientId?: string;\n username?: string;\n /** Original API key; connect-time changes refresh automatically derived identity fields. */\n password?: string;\n keepAlive?: number;\n reconnectPeriod?: number;\n connectTimeout?: number;\n clean?: boolean;\n /**\n * 背压保护阈值:handler 连续返回 false(表示下游停滞/消费者已断开)达到\n * 该次数后,SDK 自动移除该订阅并向 broker 退订,避免消息在无消费者的\n * 应用内队列中持续堆积。0 或不设置表示关闭该保护(保持原有行为)。\n */\n maxBackpressuredDeliveries?: number;\n}\n\nexport type MQTTMessage = {\n topic: string;\n payload: string | Buffer;\n qos: number;\n retain: boolean;\n};\n\nexport type MQTTEventMap = {\n connect: () => void;\n disconnect: () => void;\n error: (error: Error) => void;\n message: (message: MQTTMessage) => void;\n /** 订阅因持续背压被 SDK 自动移除时触发。 */\n subscriptionDropped: (info: { topic: string; reason: string }) => void;\n};\n"]}