proto.io 0.0.147 → 0.0.149

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 (50) hide show
  1. package/dist/adapters/file/database.d.ts +2 -2
  2. package/dist/adapters/file/database.js +2 -2
  3. package/dist/adapters/file/database.mjs +2 -2
  4. package/dist/adapters/file/filesystem.d.ts +2 -2
  5. package/dist/adapters/file/google-cloud-storage.d.ts +2 -2
  6. package/dist/adapters/storage/progres.d.ts +3 -1
  7. package/dist/adapters/storage/progres.js +6 -3
  8. package/dist/adapters/storage/progres.js.map +1 -1
  9. package/dist/adapters/storage/progres.mjs +6 -3
  10. package/dist/adapters/storage/progres.mjs.map +1 -1
  11. package/dist/client.d.ts +3 -5
  12. package/dist/client.js +2 -2
  13. package/dist/client.mjs +3 -3
  14. package/dist/index.d.ts +3 -5
  15. package/dist/index.js +73 -64
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.mjs +74 -65
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/internals/{index-EOtjV6U_.mjs → index-BmRuvHVZ.mjs} +11 -1
  20. package/dist/internals/index-BmRuvHVZ.mjs.map +1 -0
  21. package/dist/internals/index-BqFdBhFc.js.map +1 -1
  22. package/dist/internals/{index-BDB4idmt.d.ts → index-BuXVzVd8.d.ts} +3 -2
  23. package/dist/internals/index-BuXVzVd8.d.ts.map +1 -0
  24. package/dist/internals/index-CKgKjs8z.d.ts +60 -0
  25. package/dist/internals/index-CKgKjs8z.d.ts.map +1 -0
  26. package/dist/internals/{index-DZS2c96L.js → index-CSNRyhjB.js} +2 -2
  27. package/dist/internals/{index-DZS2c96L.js.map → index-CSNRyhjB.js.map} +1 -1
  28. package/dist/internals/{index-C6zdNpc_.js → index-CVutVPmd.js} +11 -1
  29. package/dist/internals/{index-C6zdNpc_.js.map → index-CVutVPmd.js.map} +1 -1
  30. package/dist/internals/{index-CT01T3qs.js → index-D1YGwuNK.js} +26 -4
  31. package/dist/internals/index-D1YGwuNK.js.map +1 -0
  32. package/dist/internals/{index-BWztjrw_.d.ts → index-DnREUbmG.d.ts} +9 -90
  33. package/dist/internals/index-DnREUbmG.d.ts.map +1 -0
  34. package/dist/internals/index-be1VYBY2.mjs.map +1 -1
  35. package/dist/internals/{index-Do-zNOpD.mjs → index-c-CaNuVY.mjs} +26 -4
  36. package/dist/internals/index-c-CaNuVY.mjs.map +1 -0
  37. package/dist/internals/{index-DTZ5uRgF.mjs → index-tU-lsQqj.mjs} +2 -2
  38. package/dist/internals/{index-DTZ5uRgF.mjs.map → index-tU-lsQqj.mjs.map} +1 -1
  39. package/dist/internals/{random-XGNkddOu.js → random-DBDmz54D.js} +3 -3
  40. package/dist/internals/{random-XGNkddOu.js.map → random-DBDmz54D.js.map} +1 -1
  41. package/dist/internals/{random-BjV_01xP.mjs → random-KZTFMK9-.mjs} +3 -3
  42. package/dist/internals/{random-BjV_01xP.mjs.map → random-KZTFMK9-.mjs.map} +1 -1
  43. package/package.json +4 -4
  44. package/dist/internals/index-BDB4idmt.d.ts.map +0 -1
  45. package/dist/internals/index-BWztjrw_.d.ts.map +0 -1
  46. package/dist/internals/index-CT01T3qs.js.map +0 -1
  47. package/dist/internals/index-Do-zNOpD.mjs.map +0 -1
  48. package/dist/internals/index-EOtjV6U_.mjs.map +0 -1
  49. package/dist/internals/index-bbPCIbir.d.ts +0 -116
  50. package/dist/internals/index-bbPCIbir.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as _o2ter_utils_js from '@o2ter/utils-js';
2
- import { asyncStream, Awaitable } from '@o2ter/utils-js';
2
+ import { BinaryData, asyncStream, Awaitable } from '@o2ter/utils-js';
3
3
  import jwt, { SignOptions, VerifyOptions } from 'jsonwebtoken';
4
4
  import { Request, CookieOptions } from '@o2ter/server-js';
5
5
  import Decimal$1, { Decimal } from 'decimal.js';
@@ -7,8 +7,6 @@ import _ from 'lodash';
7
7
  import { Readable } from 'node:stream';
8
8
  import { Socket } from 'socket.io-client';
9
9
 
10
- declare const PVK: unique symbol;
11
-
12
10
  type TNumber = number | Decimal | BigInt;
13
11
  type TPrimitive = Date | string | TNumber | boolean | null | undefined;
14
12
  type TDictionary = {
@@ -184,9 +182,6 @@ interface TQueryBaseOptions extends TQueryFilterBaseOptions {
184
182
  matches?: Record<string, TQueryBaseOptions>;
185
183
  }
186
184
  declare class TQueryFilterBase {
187
- [PVK]: {
188
- options: TQueryFilterBaseOptions;
189
- };
190
185
  filter(filter: TQuerySelector): this;
191
186
  equalTo<T extends string>(key: PathName<T>, value: TValue | undefined): this;
192
187
  notEqualTo<T extends string>(key: PathName<T>, value: TValue | undefined): this;
@@ -213,9 +208,6 @@ declare class TQueryFilterBase {
213
208
  nor(...callbacks: ((query: TQueryFilterBase) => void)[]): this;
214
209
  }
215
210
  declare class TQueryBase extends TQueryFilterBase {
216
- [PVK]: {
217
- options: TQueryBaseOptions;
218
- };
219
211
  sort<T extends Record<string, 1 | -1>>(sort: PathNameMap<T> | TSortOption[]): this;
220
212
  skip(skip: number): this;
221
213
  limit(limit: number): this;
@@ -229,10 +221,6 @@ interface TQueryRandomOptions {
229
221
  weight?: string;
230
222
  }
231
223
  declare abstract class TQuery<T extends string, Ext, M extends boolean, P extends ProtoType<any>> extends TQueryBase {
232
- [PVK]: {
233
- className: T;
234
- options: TQueryOptions;
235
- };
236
224
  constructor(className: T, options?: TQueryOptions);
237
225
  get className(): T;
238
226
  abstract clone(options?: TQueryOptions): TQuery<T, Ext, M, P>;
@@ -255,6 +243,9 @@ declare abstract class TQuery<T extends string, Ext, M extends boolean, P extend
255
243
  eachBatch(callback: (batch: TObjectType<T, Ext>[]) => Awaitable<void>, options?: ExtraOptions<M, P> & {
256
244
  batchSize?: number;
257
245
  }): Promise<void>;
246
+ each(callback: (object: TObjectType<T, Ext>) => Awaitable<void>, options?: ExtraOptions<M, P> & {
247
+ batchSize?: number;
248
+ }): Promise<void>;
258
249
  }
259
250
 
260
251
  type Callback<T, R, E> = (request: ProtoService<E> & T) => Awaitable<R>;
@@ -290,17 +281,7 @@ type EventData = Record<string, _TValue> & {
290
281
  _created_at: Date;
291
282
  _rperm: string[];
292
283
  };
293
- interface ProtoInternalType<Ext, P extends ProtoType<any>> {
294
- options: {
295
- endpoint: string;
296
- classExtends?: TExtensions<Ext>;
297
- };
298
- saveFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Promise<TFile>;
299
- deleteFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Promise<TFile>;
300
- fileData(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): FileStream;
301
- }
302
284
  declare abstract class ProtoType<Ext> {
303
- abstract [PVK]: ProtoInternalType<Ext, this>;
304
285
  abstract config(options?: {
305
286
  master?: boolean;
306
287
  }): Promise<Record<string, _TValue>>;
@@ -355,10 +336,6 @@ interface ProtoType<Ext> {
355
336
  afterSave<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
356
337
  beforeDelete<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
357
338
  afterDelete<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
358
- beforeSaveFile(callback: ProtoTrigger<'File', Ext>): void;
359
- afterSaveFile(callback: ProtoTrigger<'File', Ext>): void;
360
- beforeDeleteFile(callback: ProtoTrigger<'File', Ext>): void;
361
- afterDeleteFile(callback: ProtoTrigger<'File', Ext>): void;
362
339
  lockTable(className: string | string[], update: boolean): void;
363
340
  withTransaction<T>(callback: (connection: ProtoType<Ext>) => PromiseLike<T>, options?: TransactionOptions): void;
364
341
  generateUploadToken(options?: {
@@ -368,9 +345,11 @@ interface ProtoType<Ext> {
368
345
  jwtVarify(token: string, options?: jwt.VerifyOptions): jwt.JwtPayload | undefined;
369
346
  }
370
347
 
348
+ type TriggerType = 'beforeSave' | 'afterSave' | 'beforeDelete' | 'afterDelete';
371
349
  type ExtraOptions<M extends boolean, P extends ProtoType<any>> = {
372
350
  master?: M;
373
351
  context?: TSerializable;
352
+ silent?: TriggerType | TriggerType[];
374
353
  session?: P;
375
354
  abortSignal?: AbortSignal;
376
355
  };
@@ -386,12 +365,6 @@ interface TObject {
386
365
  declare class TObject {
387
366
  static defaultReadonlyKeys: string[];
388
367
  static defaultKeys: string[];
389
- [PVK]: {
390
- className: string;
391
- attributes: Record<string, TValue>;
392
- mutated: Record<string, TUpdateOp>;
393
- extra: Record<string, any>;
394
- };
395
368
  constructor(className: string, attributes?: Record<string, TValue> | ((self: TObject) => Record<string, TValue>));
396
369
  get className(): string;
397
370
  get attributes(): Record<string, TValue>;
@@ -590,6 +563,7 @@ interface TStorage {
590
563
  deleteMany(query: DecodedQuery<FindOptions>): PromiseLike<number>;
591
564
  lockTable(className: string | string[], update: boolean): Promise<void>;
592
565
  withConnection<T>(callback: (connection: TStorage) => PromiseLike<T>): PromiseLike<T>;
566
+ isDuplicateIdError(error: any): boolean;
593
567
  atomic<T>(callback: (connection: TStorage) => PromiseLike<T>, options?: {
594
568
  lockTable?: string;
595
569
  }): PromiseLike<T>;
@@ -641,58 +615,7 @@ type ProtoServiceKeyOptions = {
641
615
  }[];
642
616
  };
643
617
 
644
- declare class ProtoInternal<Ext, P extends ProtoService<Ext>> implements ProtoInternalType<Ext, P> {
645
- options: Required<ProtoServiceOptions<Ext>> & ProtoServiceKeyOptions;
646
- functions: Record<string, ProtoFunction<Ext> | ProtoFunctionOptions<Ext>>;
647
- triggers: {
648
- beforeSave?: Record<string, ProtoTrigger<string, Ext>>;
649
- afterSave?: Record<string, ProtoTrigger<string, Ext>>;
650
- beforeDelete?: Record<string, ProtoTrigger<string, Ext>>;
651
- afterDelete?: Record<string, ProtoTrigger<string, Ext>>;
652
- beforeSaveFile?: ProtoTrigger<'File', Ext>;
653
- afterSaveFile?: ProtoTrigger<'File', Ext>;
654
- beforeDeleteFile?: ProtoTrigger<'File', Ext>;
655
- afterDeleteFile?: ProtoTrigger<'File', Ext>;
656
- };
657
- constructor(options: Required<ProtoServiceOptions<Ext>> & ProtoServiceKeyOptions);
658
- prepare(): Promise<void>;
659
- generateId(): string;
660
- private _perms;
661
- config(proto: P, options?: {
662
- master?: boolean;
663
- }): Promise<Record<string, _TValue>>;
664
- configAcl(): PromiseLike<Record<string, string[]>>;
665
- setConfig(values: Record<string, _TValue>, acl?: string[]): Promise<void>;
666
- run(proto: P, name: string, payload: any, options?: ExtraOptions<boolean, P>): Promise<void | TSerializable>;
667
- varifyPassword(proto: P, user: TUser, password: string, options: ExtraOptions<true, P>): Promise<boolean>;
668
- setPassword(proto: P, user: TUser, password: string, options: ExtraOptions<true, P>): Promise<void>;
669
- unsetPassword(proto: P, user: TUser, options: ExtraOptions<true, P>): Promise<void>;
670
- updateFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Promise<TFile>;
671
- varifyUploadToken(proto: P, token?: string, isMaster?: boolean): {
672
- nonce: string | undefined;
673
- maxUploadSize: number;
674
- };
675
- createFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P> & {
676
- uploadToken?: string;
677
- }): Promise<TFile>;
678
- saveFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Promise<TFile>;
679
- deleteFile(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Promise<TFile>;
680
- fileData(proto: P, object: TFile, options?: ExtraOptions<boolean, P>): Readable;
681
- destroyFileData(proto: P, id: string): void;
682
- jwtSign(payload: any, options: 'login' | 'upload' | jwt.SignOptions): string;
683
- jwtVarify(token: string, options?: 'login' | 'upload' | jwt.VerifyOptions): jwt.JwtPayload | undefined;
684
- notify(proto: P, data: Record<string, _TValue> & {
685
- _rperm?: string[];
686
- }): Promise<void>;
687
- listen(proto: P, callback: (data: EventData) => void): {
688
- remove: VoidFunction;
689
- };
690
- validateCLPs(className: string, acls: string[], keys: (keyof TSchema.CLPs)[]): boolean;
691
- refs(proto: P, object: TObject, options?: ExtraOptions<boolean, P>): Promise<AsyncIterable<TObject>>;
692
- }
693
-
694
618
  declare class ProtoService<Ext> extends ProtoType<Ext> {
695
- [PVK]: ProtoInternal<Ext, this>;
696
619
  private _storage?;
697
620
  private _schedule;
698
621
  req?: Request;
@@ -759,10 +682,6 @@ declare class ProtoService<Ext> extends ProtoType<Ext> {
759
682
  afterSave<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
760
683
  beforeDelete<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
761
684
  afterDelete<T extends string>(name: T, callback: ProtoTrigger<T, Ext>): void;
762
- beforeSaveFile(callback: ProtoTrigger<'File', Ext>): void;
763
- afterSaveFile(callback: ProtoTrigger<'File', Ext>): void;
764
- beforeDeleteFile(callback: ProtoTrigger<'File', Ext>): void;
765
- afterDeleteFile(callback: ProtoTrigger<'File', Ext>): void;
766
685
  lockTable(className: string | string[], update: boolean): Promise<void>;
767
686
  withTransaction<T>(callback: (connection: ProtoService<Ext>) => PromiseLike<T>, options?: TransactionOptions): PromiseLike<T>;
768
687
  generateUploadToken(options?: {
@@ -780,5 +699,5 @@ declare class ProtoService<Ext> extends ProtoType<Ext> {
780
699
  refs(object: TObject, options?: ExtraOptions<boolean, this>): _o2ter_utils_js.AsyncStream<TObjectType<string, Ext>>;
781
700
  }
782
701
 
783
- export { type TQueryRandomOptions as A, type TPubSub as B, type TFileInfo as C, type DeserializeOptions as D, type ExtraOptions as E, type FindOptions as F, type InsertOptions as I, ProtoService as P, QuerySelector as Q, type SerializeOptions as S, TSchema as T, type _TValue as _, type ProtoServiceOptions as a, type ProtoServiceKeyOptions as b, type TFileStorage as c, type TSerializable as d, deserialize as e, type TExtensions as f, TQuery as g, TObject as h, TUser as i, TRole as j, TFile as k, ProtoType as l, type ProtoInternalType as m, type TObjectType as n, type EventData as o, PVK as p, type DecodedQuery as q, type DecodedSortOption as r, serialize as s, type TValue as t, type FindOneOptions as u, type TUpdateOp as v, FieldSelectorExpression as w, QueryExpression as x, type TStorage as y, type TransactionOptions as z };
784
- //# sourceMappingURL=index-BWztjrw_.d.ts.map
702
+ export { type TFileInfo as A, type DeserializeOptions as D, type ExtraOptions as E, type FindOptions as F, type InsertOptions as I, ProtoService as P, QuerySelector as Q, type SerializeOptions as S, TSchema as T, type _TValue as _, type ProtoServiceOptions as a, type ProtoServiceKeyOptions as b, type TFileStorage as c, type TSerializable as d, deserialize as e, type TExtensions as f, TQuery as g, TObject as h, TUser as i, TRole as j, TFile as k, ProtoType as l, type TObjectType as m, type EventData as n, type DecodedQuery as o, type DecodedSortOption as p, type TValue as q, type FindOneOptions as r, serialize as s, type TUpdateOp as t, FieldSelectorExpression as u, QueryExpression as v, type TStorage as w, type TransactionOptions as x, type TQueryRandomOptions as y, type TPubSub as z };
703
+ //# sourceMappingURL=index-DnREUbmG.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DnREUbmG.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"index-be1VYBY2.mjs","sources":["../../../src/adapters/file/base/index.ts"],"sourcesContent":["//\n// index.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2024 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { promisify } from 'util';\nimport { deflate as _deflate, unzip as _unzip } from 'zlib';\nimport { TFileInfo, TFileStorage } from '../../../server/file';\nimport { ProtoService } from '../../../server/proto';\nimport { TSchema } from '../../../internals/schema';\nimport { binaryStreamChunk, parallelEach, parallelMap } from '@o2ter/utils-js';\nimport { PVK } from '../../../internals/private';\n\nconst deflate = promisify(_deflate);\nconst unzip = promisify(_unzip);\n\nexport type FileStorageOptions = {\n chunkSize?: number;\n parallel?: number;\n};\n\nexport abstract class FileStorageBase implements TFileStorage {\n\n options: Required<FileStorageOptions>;\n\n constructor(options: FileStorageOptions) {\n this.options = {\n chunkSize: 16 * 1024,\n parallel: 8,\n ..._.pickBy(options, v => !_.isNil(v)),\n };\n }\n\n get schema(): Record<string, TSchema> {\n return {}\n }\n\n abstract createChunk<E>(proto: ProtoService<E>, token: string, start: number, end: number, compressed: Buffer): PromiseLike<void>;\n abstract readChunks<E>(proto: ProtoService<E>, token: string, start?: number, end?: number): AsyncGenerator<{\n start: number;\n data: Buffer | Uint8Array | PromiseLike<Buffer | Uint8Array>;\n }, void>;\n abstract destroy<E>(proto: ProtoService<E>, id: string): PromiseLike<void>;\n\n async create<E>(\n proto: ProtoService<E>,\n stream: BinaryData | AsyncIterable<BinaryData>,\n info: TFileInfo,\n maxUploadSize: number,\n ) {\n\n const token = proto[PVK].generateId();\n\n let size = 0;\n const _stream = async function* (stream: AsyncIterable<Buffer>) {\n for await (const data of stream) {\n yield { data, offset: size };\n size += data.byteLength;\n }\n };\n\n await parallelEach(\n _stream(binaryStreamChunk(stream, this.options.chunkSize)),\n this.options.parallel,\n async ({ data, offset }) => {\n const chunkSize = data.byteLength;\n await this.createChunk(proto, token, offset, offset + chunkSize, await deflate(data));\n if (offset + chunkSize > maxUploadSize) throw Error('Payload too large');\n }\n );\n\n return { _id: token, size };\n }\n\n async* fileData<E>(proto: ProtoService<E>, id: string, start?: number, end?: number) {\n\n const _stream = parallelMap(\n this.readChunks(proto, id, start, end),\n this.options.parallel,\n async chunk => ({\n start: chunk.start,\n data: await unzip(await chunk.data),\n })\n );\n\n for await (const { start: startBytes, data } of _stream) {\n\n if (!_.isNumber(start) && !_.isNumber(end)) {\n\n yield data;\n\n } else {\n\n const endBytes = startBytes + data.length;\n const _start = _.isNumber(start) && start > startBytes ? start - startBytes : 0;\n const _end = _.isNumber(end) && end < endBytes ? end - startBytes : undefined;\n\n yield data.subarray(_start, _end);\n }\n }\n }\n};\n\nexport default FileStorageBase;"],"names":["_deflate","_unzip"],"mappings":"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"}
1
+ {"version":3,"file":"index-be1VYBY2.mjs","sources":["../../../src/adapters/file/base/index.ts"],"sourcesContent":["//\n// index.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2024 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { promisify } from 'util';\nimport { deflate as _deflate, unzip as _unzip } from 'zlib';\nimport { TFileInfo, TFileStorage } from '../../../server/file';\nimport { ProtoService } from '../../../server/proto';\nimport { TSchema } from '../../../internals/schema';\nimport { BinaryData, binaryStreamChunk, parallelEach, parallelMap } from '@o2ter/utils-js';\nimport { PVK } from '../../../internals/private';\n\nconst deflate = promisify(_deflate);\nconst unzip = promisify(_unzip);\n\nexport type FileStorageOptions = {\n chunkSize?: number;\n parallel?: number;\n};\n\nexport abstract class FileStorageBase implements TFileStorage {\n\n options: Required<FileStorageOptions>;\n\n constructor(options: FileStorageOptions) {\n this.options = {\n chunkSize: 16 * 1024,\n parallel: 8,\n ..._.pickBy(options, v => !_.isNil(v)),\n };\n }\n\n get schema(): Record<string, TSchema> {\n return {}\n }\n\n abstract createChunk<E>(proto: ProtoService<E>, token: string, start: number, end: number, compressed: Buffer): PromiseLike<void>;\n abstract readChunks<E>(proto: ProtoService<E>, token: string, start?: number, end?: number): AsyncGenerator<{\n start: number;\n data: Buffer | Uint8Array | PromiseLike<Buffer | Uint8Array>;\n }, void>;\n abstract destroy<E>(proto: ProtoService<E>, id: string): PromiseLike<void>;\n\n async create<E>(\n proto: ProtoService<E>,\n stream: BinaryData | AsyncIterable<BinaryData>,\n info: TFileInfo,\n maxUploadSize: number,\n ) {\n\n const token = proto[PVK].generateId();\n\n let size = 0;\n const _stream = async function* (stream: AsyncIterable<Buffer>) {\n for await (const data of stream) {\n yield { data, offset: size };\n size += data.byteLength;\n }\n };\n\n await parallelEach(\n _stream(binaryStreamChunk(stream, this.options.chunkSize)),\n this.options.parallel,\n async ({ data, offset }) => {\n const chunkSize = data.byteLength;\n await this.createChunk(proto, token, offset, offset + chunkSize, await deflate(data));\n if (offset + chunkSize > maxUploadSize) throw Error('Payload too large');\n }\n );\n\n return { _id: token, size };\n }\n\n async* fileData<E>(proto: ProtoService<E>, id: string, start?: number, end?: number) {\n\n const _stream = parallelMap(\n this.readChunks(proto, id, start, end),\n this.options.parallel,\n async chunk => ({\n start: chunk.start,\n data: await unzip(await chunk.data),\n })\n );\n\n for await (const { start: startBytes, data } of _stream) {\n\n if (!_.isNumber(start) && !_.isNumber(end)) {\n\n yield data;\n\n } else {\n\n const endBytes = startBytes + data.length;\n const _start = _.isNumber(start) && start > startBytes ? start - startBytes : 0;\n const _end = _.isNumber(end) && end < endBytes ? end - startBytes : undefined;\n\n yield data.subarray(_start, _end);\n }\n }\n }\n};\n\nexport default FileStorageBase;"],"names":["_deflate","_unzip"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { T as TObject, d as decodeUpdateOp } from './index-EOtjV6U_.mjs';
1
+ import { T as TObject, d as decodeUpdateOp } from './index-BmRuvHVZ.mjs';
2
2
  import _ from 'lodash';
3
3
  import { Decimal } from 'decimal.js';
4
4
  import { asyncStream, isBinaryData, isReadableStream, isBlob, base64ToBuffer, iterableToStream } from '@o2ter/utils-js';
@@ -46,6 +46,7 @@ const mergeOpts = (lhs, rhs) => {
46
46
  };
47
47
  };
48
48
  class TQueryFilterBase {
49
+ /** @internal */
49
50
  [PVK] = { options: {} };
50
51
  filter(filter) {
51
52
  if (_.isNil(this[PVK].options.filter)) {
@@ -156,6 +157,7 @@ class TQueryFilterBase {
156
157
  }
157
158
  }
158
159
  class TQueryBase extends TQueryFilterBase {
160
+ /** @internal */
159
161
  [PVK] = { options: {} };
160
162
  sort(sort) {
161
163
  this[PVK].options.sort = sort;
@@ -216,6 +218,7 @@ class TQueryBase extends TQueryFilterBase {
216
218
  // THE SOFTWARE.
217
219
  //
218
220
  class TQuery extends TQueryBase {
221
+ /** @internal */
219
222
  [PVK];
220
223
  constructor(className, options = {}) {
221
224
  super();
@@ -277,6 +280,13 @@ class TQuery extends TQueryBase {
277
280
  await callback(batch);
278
281
  }
279
282
  }
283
+ async each(callback, options) {
284
+ await this.eachBatch(async (batch) => {
285
+ for (const object of batch) {
286
+ await callback(object);
287
+ }
288
+ }, options);
289
+ }
280
290
  }
281
291
 
282
292
  //
@@ -596,7 +606,7 @@ const applyObjectMethods = (object, proto) => {
596
606
  else {
597
607
  const created = await query()
598
608
  .includes(...this.keys())
599
- .insert(_.fromPairs([...this.entries()]), options);
609
+ .insert(_.fromPairs([...this._set_entries()]), options);
600
610
  this[PVK].attributes = created.attributes;
601
611
  this[PVK].mutated = {};
602
612
  }
@@ -871,6 +881,7 @@ class ProtoClientQuery extends TQuery {
871
881
  return this._proto[PVK].request(this._proto, {
872
882
  operation: 'explain',
873
883
  context: options?.context ?? {},
884
+ silent: options?.silent,
874
885
  ...this._queryOptions,
875
886
  }, this._requestOpt(options));
876
887
  }
@@ -878,6 +889,7 @@ class ProtoClientQuery extends TQuery {
878
889
  return this._proto[PVK].request(this._proto, {
879
890
  operation: 'count',
880
891
  context: options?.context ?? {},
892
+ silent: options?.silent,
881
893
  ...this._queryOptions,
882
894
  }, this._requestOpt(options));
883
895
  }
@@ -885,6 +897,7 @@ class ProtoClientQuery extends TQuery {
885
897
  const request = () => this._proto[PVK].request(this._proto, {
886
898
  operation: 'find',
887
899
  context: options?.context ?? {},
900
+ silent: options?.silent,
888
901
  ...this._queryOptions,
889
902
  }, this._requestOpt(options));
890
903
  return asyncStream(request);
@@ -893,6 +906,7 @@ class ProtoClientQuery extends TQuery {
893
906
  const request = () => this._proto[PVK].request(this._proto, {
894
907
  operation: 'random',
895
908
  context: options?.context ?? {},
909
+ silent: options?.silent,
896
910
  random: opts,
897
911
  ...this._queryOptions,
898
912
  }, this._requestOpt(options));
@@ -902,6 +916,7 @@ class ProtoClientQuery extends TQuery {
902
916
  const request = () => this._proto[PVK].request(this._proto, {
903
917
  operation: 'nonrefs',
904
918
  context: options?.context ?? {},
919
+ silent: options?.silent,
905
920
  ...this._queryOptions,
906
921
  }, this._requestOpt(options));
907
922
  return asyncStream(request);
@@ -910,6 +925,7 @@ class ProtoClientQuery extends TQuery {
910
925
  return this._proto[PVK].request(this._proto, {
911
926
  operation: 'insert',
912
927
  context: options?.context ?? {},
928
+ silent: options?.silent,
913
929
  attributes: attrs,
914
930
  ...this._queryOptions,
915
931
  }, this._requestOpt(options));
@@ -918,6 +934,7 @@ class ProtoClientQuery extends TQuery {
918
934
  return this._proto[PVK].request(this._proto, {
919
935
  operation: 'insertMany',
920
936
  context: options?.context ?? {},
937
+ silent: options?.silent,
921
938
  attributes: values,
922
939
  ...this._queryOptions,
923
940
  }, this._requestOpt(options));
@@ -926,6 +943,7 @@ class ProtoClientQuery extends TQuery {
926
943
  return this._proto[PVK].request(this._proto, {
927
944
  operation: 'updateOne',
928
945
  context: options?.context ?? {},
946
+ silent: options?.silent,
929
947
  update,
930
948
  ...this._queryOptions,
931
949
  }, this._requestOpt(options));
@@ -934,6 +952,7 @@ class ProtoClientQuery extends TQuery {
934
952
  return this._proto[PVK].request(this._proto, {
935
953
  operation: 'upsertOne',
936
954
  context: options?.context ?? {},
955
+ silent: options?.silent,
937
956
  update,
938
957
  setOnInsert,
939
958
  ...this._queryOptions,
@@ -943,6 +962,7 @@ class ProtoClientQuery extends TQuery {
943
962
  return this._proto[PVK].request(this._proto, {
944
963
  operation: 'deleteOne',
945
964
  context: options?.context ?? {},
965
+ silent: options?.silent,
946
966
  ...this._queryOptions,
947
967
  }, this._requestOpt(options));
948
968
  }
@@ -950,6 +970,7 @@ class ProtoClientQuery extends TQuery {
950
970
  return this._proto[PVK].request(this._proto, {
951
971
  operation: 'deleteMany',
952
972
  context: options?.context ?? {},
973
+ silent: options?.silent,
953
974
  ...this._queryOptions,
954
975
  }, this._requestOpt(options));
955
976
  }
@@ -1275,7 +1296,7 @@ class ProtoClientInternal {
1275
1296
  url: 'files',
1276
1297
  responseType: 'text',
1277
1298
  data: {
1278
- attributes: serialize(_.fromPairs([...object.entries()]), serializeOpts),
1299
+ attributes: serialize(_.fromPairs([...object._set_entries()]), serializeOpts),
1279
1300
  file: buffer,
1280
1301
  },
1281
1302
  headers: {
@@ -1402,6 +1423,7 @@ class ProtoClientInternal {
1402
1423
  // THE SOFTWARE.
1403
1424
  //
1404
1425
  class ProtoClient extends ProtoType {
1426
+ /** @internal */
1405
1427
  [PVK];
1406
1428
  constructor(options) {
1407
1429
  super();
@@ -1463,4 +1485,4 @@ class ProtoClient extends ProtoType {
1463
1485
  }
1464
1486
 
1465
1487
  export { AUTH_COOKIE_KEY as A, MASTER_USER_HEADER_NAME as M, ProtoType as P, TQuery as T, UPLOAD_TOKEN_HEADER_NAME as U, MASTER_PASS_HEADER_NAME as a, TUser as b, ProtoClient as c, deserialize as d, classExtends as e, isObject as f, isUser as g, isRole as h, isQuery as i, isFile as j, serialize as s };
1466
- //# sourceMappingURL=index-Do-zNOpD.mjs.map
1488
+ //# sourceMappingURL=index-c-CaNuVY.mjs.map