@dereekb/firebase-server 13.11.10 → 13.11.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,23 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/model",
3
- "version": "13.11.10",
3
+ "version": "13.11.12",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.10",
6
- "@dereekb/date": "13.11.10",
7
- "@dereekb/firebase": "13.11.10",
8
- "@dereekb/firebase-server": "13.11.10",
9
- "@dereekb/model": "13.11.10",
10
- "@dereekb/nestjs": "13.11.10",
11
- "@dereekb/rxjs": "13.11.10",
12
- "@dereekb/util": "13.11.10",
5
+ "@dereekb/analytics": "13.11.12",
6
+ "@dereekb/date": "13.11.12",
7
+ "@dereekb/firebase": "13.11.12",
8
+ "@dereekb/firebase-server": "13.11.12",
9
+ "@dereekb/model": "13.11.12",
10
+ "@dereekb/nestjs": "13.11.12",
11
+ "@dereekb/rxjs": "13.11.12",
12
+ "@dereekb/util": "13.11.12",
13
13
  "@nestjs/common": "^11.1.19",
14
14
  "@nestjs/config": "^4.0.4",
15
15
  "archiver": "^7.0.1",
16
16
  "date-fns": "^4.1.0",
17
17
  "firebase-functions": "^7.2.5",
18
- "make-error": "^1.3.6"
18
+ "make-error": "^1.3.6",
19
+ "@cantoo/pdf-lib": "^2.6.5",
20
+ "sharp": "0.34.5"
19
21
  },
20
22
  "exports": {
21
23
  "./package.json": "./package.json",
@@ -0,0 +1,94 @@
1
+ import { type Maybe } from '@dereekb/util';
2
+ /**
3
+ * Format the compressed image buffer is encoded as.
4
+ */
5
+ export type CompressImageBufferToTargetSizeFormat = 'jpeg' | 'png' | 'webp';
6
+ export declare const DEFAULT_COMPRESS_IMAGE_MAX_DIMENSION = 4096;
7
+ export declare const DEFAULT_COMPRESS_IMAGE_INITIAL_QUALITY = 85;
8
+ export declare const DEFAULT_COMPRESS_IMAGE_MIN_QUALITY = 50;
9
+ export declare const DEFAULT_COMPRESS_IMAGE_QUALITY_STEP = 10;
10
+ export declare const DEFAULT_COMPRESS_IMAGE_FORMAT: CompressImageBufferToTargetSizeFormat;
11
+ /**
12
+ * Configuration for {@link compressImageBufferToTargetSize}.
13
+ */
14
+ export interface CompressImageBufferToTargetSizeConfig {
15
+ /**
16
+ * Target maximum size in bytes for the output. Acts as a soft target — if the
17
+ * smallest encoding still exceeds this, the best-effort result is returned with
18
+ * `hitTarget: false`.
19
+ */
20
+ readonly targetSizeBytes: number;
21
+ /**
22
+ * Maximum dimension (longest side, in pixels) of the output image. Images larger
23
+ * than this on either axis are scaled down preserving aspect ratio.
24
+ *
25
+ * Defaults to {@link DEFAULT_COMPRESS_IMAGE_MAX_DIMENSION}.
26
+ */
27
+ readonly maxDimension?: Maybe<number>;
28
+ /**
29
+ * Initial quality (1-100) to try when encoding. Stepped down by `qualityStep` until
30
+ * the output fits `targetSizeBytes` or `minQuality` is reached. Ignored for PNG.
31
+ *
32
+ * Defaults to {@link DEFAULT_COMPRESS_IMAGE_INITIAL_QUALITY}.
33
+ */
34
+ readonly initialQuality?: Maybe<number>;
35
+ /**
36
+ * Minimum quality (1-100) the iterator will drop to. Defaults to {@link DEFAULT_COMPRESS_IMAGE_MIN_QUALITY}.
37
+ */
38
+ readonly minQuality?: Maybe<number>;
39
+ /**
40
+ * Quality decrement applied each iteration. Defaults to {@link DEFAULT_COMPRESS_IMAGE_QUALITY_STEP}.
41
+ */
42
+ readonly qualityStep?: Maybe<number>;
43
+ /**
44
+ * Output format. Defaults to {@link DEFAULT_COMPRESS_IMAGE_FORMAT}.
45
+ */
46
+ readonly format?: Maybe<CompressImageBufferToTargetSizeFormat>;
47
+ }
48
+ /**
49
+ * Result of {@link compressImageBufferToTargetSize}.
50
+ */
51
+ export interface CompressImageBufferToTargetSizeResult {
52
+ /**
53
+ * Best-effort compressed image bytes. Falls back to the original input if no
54
+ * encoding produced a smaller result.
55
+ */
56
+ readonly buffer: Buffer;
57
+ readonly originalSizeBytes: number;
58
+ readonly compressedSizeBytes: number;
59
+ /**
60
+ * Quality the returned buffer was encoded at. Zero for PNG (no quality knob) and
61
+ * 100 when the original was returned unchanged.
62
+ */
63
+ readonly finalQuality: number;
64
+ readonly finalWidth: number;
65
+ readonly finalHeight: number;
66
+ /**
67
+ * True if `compressedSizeBytes <= targetSizeBytes`.
68
+ */
69
+ readonly hitTarget: boolean;
70
+ }
71
+ /**
72
+ * Compresses an image buffer toward a target byte size by resizing down to a max
73
+ * dimension and iteratively lowering the encoder quality. Returns the best result
74
+ * found; falls back to the original buffer if no encoding beat it.
75
+ *
76
+ * Throws on unreadable input — callers should catch errors and decide whether to
77
+ * fall back to the original bytes.
78
+ *
79
+ * @param input - The image bytes to compress.
80
+ * @param config - Target size and encoder parameters.
81
+ * @returns The best-effort compressed result plus metadata about what was applied.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const result = await compressImageBufferToTargetSize(buffer, {
86
+ * targetSizeBytes: 2 * 1024 * 1024,
87
+ * maxDimension: 2048
88
+ * });
89
+ * if (result.hitTarget) {
90
+ * await file.upload(result.buffer);
91
+ * }
92
+ * ```
93
+ */
94
+ export declare function compressImageBufferToTargetSize(input: Buffer, config: CompressImageBufferToTargetSizeConfig): Promise<CompressImageBufferToTargetSizeResult>;
@@ -0,0 +1,78 @@
1
+ import { type Maybe } from '@dereekb/util';
2
+ export declare const DEFAULT_COMPRESS_PDF_IMAGE_MAX_DIMENSION = 2048;
3
+ export declare const DEFAULT_COMPRESS_PDF_IMAGE_QUALITY = 75;
4
+ export declare const DEFAULT_COMPRESS_PDF_IMAGE_SIZE_THRESHOLD_BYTES: number;
5
+ /**
6
+ * Configuration for {@link compressPdfImagesToTargetSize}.
7
+ */
8
+ export interface CompressPdfImagesToTargetSizeConfig {
9
+ /**
10
+ * Target maximum size in bytes for the output PDF. Acts as a soft target — if the
11
+ * best-effort recompression still exceeds this, the result is returned with `hitTarget: false`.
12
+ */
13
+ readonly targetSizeBytes: number;
14
+ /**
15
+ * Maximum dimension (longest side) of embedded images after recompression.
16
+ * Defaults to {@link DEFAULT_COMPRESS_PDF_IMAGE_MAX_DIMENSION}.
17
+ */
18
+ readonly imageMaxDimension?: Maybe<number>;
19
+ /**
20
+ * JPEG quality applied when re-encoding extracted images. Defaults to
21
+ * {@link DEFAULT_COMPRESS_PDF_IMAGE_QUALITY}.
22
+ */
23
+ readonly imageQuality?: Maybe<number>;
24
+ /**
25
+ * Images smaller than this byte size are left untouched (tiny icons / logos are
26
+ * not worth recompressing). Defaults to {@link DEFAULT_COMPRESS_PDF_IMAGE_SIZE_THRESHOLD_BYTES}.
27
+ */
28
+ readonly imageSizeThresholdBytes?: Maybe<number>;
29
+ }
30
+ /**
31
+ * Result of {@link compressPdfImagesToTargetSize}.
32
+ */
33
+ export interface CompressPdfImagesToTargetSizeResult {
34
+ /**
35
+ * Best-effort compressed PDF bytes. Equal to the original buffer if recompression
36
+ * produced no smaller result.
37
+ */
38
+ readonly buffer: Buffer;
39
+ readonly originalSizeBytes: number;
40
+ readonly compressedSizeBytes: number;
41
+ /**
42
+ * Number of image XObjects that were successfully recompressed.
43
+ */
44
+ readonly imagesCompressed: number;
45
+ /**
46
+ * Number of image XObjects that were skipped (unsupported filter, mask, indexed
47
+ * color space, or per-image error).
48
+ */
49
+ readonly imagesSkipped: number;
50
+ /**
51
+ * True if `compressedSizeBytes <= targetSizeBytes`.
52
+ */
53
+ readonly hitTarget: boolean;
54
+ }
55
+ /**
56
+ * Recompresses image XObjects embedded in a PDF to shrink its overall size.
57
+ *
58
+ * Only DCTDecode (JPEG) image streams are touched in this implementation — the
59
+ * dominant case for "phone photo PDFs". Images using other filters (FlateDecode,
60
+ * CCITTFax, JBIG2, JPEG2000), indexed/CMYK color spaces, or that carry a
61
+ * `/SMask` (soft mask) are skipped and counted in `imagesSkipped`.
62
+ *
63
+ * Throws on a malformed PDF — callers should catch and fall back to the original
64
+ * bytes.
65
+ *
66
+ * @param input - The PDF bytes to compress.
67
+ * @param config - Target size and image recompression parameters.
68
+ * @returns The best-effort compressed PDF plus per-image counters.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * const result = await compressPdfImagesToTargetSize(buffer, {
73
+ * targetSizeBytes: 6 * 1024 * 1024
74
+ * });
75
+ * const finalBytes = result.hitTarget ? result.buffer : buffer;
76
+ * ```
77
+ */
78
+ export declare function compressPdfImagesToTargetSize(input: Buffer, config: CompressPdfImagesToTargetSizeConfig): Promise<CompressPdfImagesToTargetSizeResult>;
@@ -0,0 +1,2 @@
1
+ export * from './compress.image';
2
+ export * from './compress.pdf';
@@ -1,3 +1,4 @@
1
+ export * from './extension';
1
2
  export * from './storagefile.action.server';
2
3
  export * from './storagefile.action.server.init';
3
4
  export * from './storagefile.error';
package/oidc/index.cjs.js CHANGED
@@ -326,7 +326,7 @@ function _define_property$f(obj, key, value) {
326
326
  */ function readRequestedSessionTtlSeconds(ctx) {
327
327
  var _ctx_oidc;
328
328
  var params = ctx === null || ctx === void 0 ? void 0 : (_ctx_oidc = ctx.oidc) === null || _ctx_oidc === void 0 ? void 0 : _ctx_oidc.params;
329
- var raw = params != null ? params[DBX_FIREBASE_SERVER_OIDC_SESSION_TTL_PARAM] : undefined;
329
+ var raw = params == null ? undefined : params[DBX_FIREBASE_SERVER_OIDC_SESSION_TTL_PARAM];
330
330
  return parseRequestedSessionTtlSeconds(raw);
331
331
  }
332
332
  // MARK: Grant remaining time
@@ -2992,7 +2992,10 @@ var GRANTABLE_MODELS = new Set(GRANTABLE_MODEL_NAMES);
2992
2992
  * @returns the decrypted adapter payload, or undefined if the entry has expired
2993
2993
  */ key: "_toPayload",
2994
2994
  value: function _toPayload(data) {
2995
- var expiresDate = data.expiresAt ? _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2995
+ var expiresDate;
2996
+ if (data.expiresAt) {
2997
+ expiresDate = _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate();
2998
+ }
2996
2999
  var isExpired = expiresDate != null && expiresDate < new Date();
2997
3000
  return isExpired ? undefined : encryptionService.decryptAdapterPayload(data.payload);
2998
3001
  }
package/oidc/index.esm.js CHANGED
@@ -324,7 +324,7 @@ function _define_property$f(obj, key, value) {
324
324
  */ function readRequestedSessionTtlSeconds(ctx) {
325
325
  var _ctx_oidc;
326
326
  var params = ctx === null || ctx === void 0 ? void 0 : (_ctx_oidc = ctx.oidc) === null || _ctx_oidc === void 0 ? void 0 : _ctx_oidc.params;
327
- var raw = params != null ? params[DBX_FIREBASE_SERVER_OIDC_SESSION_TTL_PARAM] : undefined;
327
+ var raw = params == null ? undefined : params[DBX_FIREBASE_SERVER_OIDC_SESSION_TTL_PARAM];
328
328
  return parseRequestedSessionTtlSeconds(raw);
329
329
  }
330
330
  // MARK: Grant remaining time
@@ -2990,7 +2990,10 @@ var GRANTABLE_MODELS = new Set(GRANTABLE_MODEL_NAMES);
2990
2990
  * @returns the decrypted adapter payload, or undefined if the entry has expired
2991
2991
  */ key: "_toPayload",
2992
2992
  value: function _toPayload(data) {
2993
- var expiresDate = data.expiresAt ? _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2993
+ var expiresDate;
2994
+ if (data.expiresAt) {
2995
+ expiresDate = _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate();
2996
+ }
2994
2997
  var isExpired = expiresDate != null && expiresDate < new Date();
2995
2998
  return isExpired ? undefined : encryptionService.decryptAdapterPayload(data.payload);
2996
2999
  }
package/oidc/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/oidc",
3
- "version": "13.11.10",
3
+ "version": "13.11.12",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.10",
6
- "@dereekb/date": "13.11.10",
7
- "@dereekb/firebase": "13.11.10",
8
- "@dereekb/firebase-server": "13.11.10",
9
- "@dereekb/model": "13.11.10",
10
- "@dereekb/nestjs": "13.11.10",
11
- "@dereekb/rxjs": "13.11.10",
12
- "@dereekb/util": "13.11.10",
13
- "@dereekb/zoho": "13.11.10",
5
+ "@dereekb/analytics": "13.11.12",
6
+ "@dereekb/date": "13.11.12",
7
+ "@dereekb/firebase": "13.11.12",
8
+ "@dereekb/firebase-server": "13.11.12",
9
+ "@dereekb/model": "13.11.12",
10
+ "@dereekb/nestjs": "13.11.12",
11
+ "@dereekb/rxjs": "13.11.12",
12
+ "@dereekb/util": "13.11.12",
13
+ "@dereekb/zoho": "13.11.12",
14
14
  "@nestjs/common": "^11.1.19",
15
15
  "@nestjs/config": "^4.0.4",
16
16
  "express": "^5.2.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server",
3
- "version": "13.11.10",
3
+ "version": "13.11.12",
4
4
  "sideEffects": false,
5
5
  "exports": {
6
6
  "./test": {
@@ -44,15 +44,15 @@
44
44
  "main": "./index.cjs.js",
45
45
  "types": "./src/index.d.ts",
46
46
  "peerDependencies": {
47
- "@dereekb/analytics": "13.11.10",
48
- "@dereekb/date": "13.11.10",
49
- "@dereekb/dbx-core": "13.11.10",
50
- "@dereekb/firebase": "13.11.10",
51
- "@dereekb/model": "13.11.10",
52
- "@dereekb/nestjs": "13.11.10",
53
- "@dereekb/rxjs": "13.11.10",
54
- "@dereekb/util": "13.11.10",
55
- "@dereekb/zoho": "13.11.10",
47
+ "@dereekb/analytics": "13.11.12",
48
+ "@dereekb/date": "13.11.12",
49
+ "@dereekb/dbx-core": "13.11.12",
50
+ "@dereekb/firebase": "13.11.12",
51
+ "@dereekb/model": "13.11.12",
52
+ "@dereekb/nestjs": "13.11.12",
53
+ "@dereekb/rxjs": "13.11.12",
54
+ "@dereekb/util": "13.11.12",
55
+ "@dereekb/zoho": "13.11.12",
56
56
  "@google-cloud/firestore": "^7.11.6",
57
57
  "@google-cloud/storage": "^7.19.0",
58
58
  "@nestjs/common": "^11.1.19",
package/test/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/test",
3
- "version": "13.11.10",
3
+ "version": "13.11.12",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.10",
6
- "@dereekb/date": "13.11.10",
7
- "@dereekb/firebase": "13.11.10",
8
- "@dereekb/firebase-server": "13.11.10",
9
- "@dereekb/firebase-server/oidc": "13.11.10",
10
- "@dereekb/model": "13.11.10",
11
- "@dereekb/nestjs": "13.11.10",
12
- "@dereekb/rxjs": "13.11.10",
13
- "@dereekb/util": "13.11.10",
5
+ "@dereekb/analytics": "13.11.12",
6
+ "@dereekb/date": "13.11.12",
7
+ "@dereekb/firebase": "13.11.12",
8
+ "@dereekb/firebase-server": "13.11.12",
9
+ "@dereekb/firebase-server/oidc": "13.11.12",
10
+ "@dereekb/model": "13.11.12",
11
+ "@dereekb/nestjs": "13.11.12",
12
+ "@dereekb/rxjs": "13.11.12",
13
+ "@dereekb/util": "13.11.12",
14
14
  "@google-cloud/firestore": "^7.11.6",
15
15
  "@google-cloud/storage": "^7.19.0",
16
16
  "@nestjs/common": "^11.1.19",
@@ -23,7 +23,7 @@
23
23
  "supertest": "^7.2.2"
24
24
  },
25
25
  "devDependencies": {
26
- "@dereekb/nestjs": "13.11.10"
26
+ "@dereekb/nestjs": "13.11.12"
27
27
  },
28
28
  "exports": {
29
29
  "./package.json": "./package.json",
package/zoho/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/zoho",
3
- "version": "13.11.10",
3
+ "version": "13.11.12",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.10",
6
- "@dereekb/date": "13.11.10",
7
- "@dereekb/model": "13.11.10",
8
- "@dereekb/nestjs": "13.11.10",
9
- "@dereekb/rxjs": "13.11.10",
10
- "@dereekb/firebase": "13.11.10",
11
- "@dereekb/util": "13.11.10",
12
- "@dereekb/zoho": "13.11.10"
5
+ "@dereekb/analytics": "13.11.12",
6
+ "@dereekb/date": "13.11.12",
7
+ "@dereekb/model": "13.11.12",
8
+ "@dereekb/nestjs": "13.11.12",
9
+ "@dereekb/rxjs": "13.11.12",
10
+ "@dereekb/firebase": "13.11.12",
11
+ "@dereekb/util": "13.11.12",
12
+ "@dereekb/zoho": "13.11.12"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",