@dereekb/firebase-server 13.11.8 → 13.11.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.js CHANGED
@@ -35,7 +35,7 @@ function _define_property$z(obj, key, value) {
35
35
  }
36
36
  return obj;
37
37
  }
38
- function _object_spread$j(target) {
38
+ function _object_spread$l(target) {
39
39
  for(var i = 1; i < arguments.length; i++){
40
40
  var source = arguments[i] != null ? arguments[i] : {};
41
41
  var ownKeys = Object.keys(source);
@@ -102,7 +102,7 @@ function _type_of$7(obj) {
102
102
  */ function unauthenticatedError(messageOrError) {
103
103
  var _serverError_message;
104
104
  var serverError = util.partialServerError(messageOrError);
105
- return new https.HttpsError('unauthenticated', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'unauthenticated', _object_spread_props$e(_object_spread$j({
105
+ return new https.HttpsError('unauthenticated', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'unauthenticated', _object_spread_props$e(_object_spread$l({
106
106
  status: 401,
107
107
  code: firebase.UNAUTHENTICATED_ERROR_CODE
108
108
  }, serverError), {
@@ -117,7 +117,7 @@ function _type_of$7(obj) {
117
117
  */ function forbiddenError(messageOrError) {
118
118
  var _serverError_message;
119
119
  var serverError = util.partialServerError(messageOrError);
120
- return new https.HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'forbidden', _object_spread_props$e(_object_spread$j({
120
+ return new https.HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'forbidden', _object_spread_props$e(_object_spread$l({
121
121
  status: 403,
122
122
  code: firebase.FORBIDDEN_ERROR_CODE
123
123
  }, serverError), {
@@ -132,7 +132,7 @@ function _type_of$7(obj) {
132
132
  */ function permissionDeniedError(messageOrError) {
133
133
  var _serverError_message;
134
134
  var serverError = util.partialServerError(messageOrError);
135
- return new https.HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'permission denied', _object_spread_props$e(_object_spread$j({
135
+ return new https.HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'permission denied', _object_spread_props$e(_object_spread$l({
136
136
  status: 403,
137
137
  code: firebase.PERMISSION_DENIED_ERROR_CODE
138
138
  }, serverError), {
@@ -147,7 +147,7 @@ function _type_of$7(obj) {
147
147
  */ function notFoundError(messageOrError) {
148
148
  var _serverError_message;
149
149
  var serverError = util.partialServerError(messageOrError);
150
- return new https.HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'not found', _object_spread_props$e(_object_spread$j({
150
+ return new https.HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'not found', _object_spread_props$e(_object_spread$l({
151
151
  status: 404,
152
152
  code: firebase.NOT_FOUND_ERROR_CODE
153
153
  }, serverError), {
@@ -162,7 +162,7 @@ function _type_of$7(obj) {
162
162
  */ function modelNotAvailableError(messageOrError) {
163
163
  var _serverError_message;
164
164
  var serverError = util.partialServerError(messageOrError);
165
- return new https.HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'model was not available', _object_spread_props$e(_object_spread$j({
165
+ return new https.HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'model was not available', _object_spread_props$e(_object_spread$l({
166
166
  status: 404,
167
167
  code: firebase.MODEL_NOT_AVAILABLE_ERROR_CODE
168
168
  }, serverError), {
@@ -177,7 +177,7 @@ function _type_of$7(obj) {
177
177
  */ function badRequestError(messageOrError) {
178
178
  var _serverError_message;
179
179
  var serverError = util.partialServerError(messageOrError);
180
- return new https.HttpsError('invalid-argument', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'bad request', _object_spread_props$e(_object_spread$j({
180
+ return new https.HttpsError('invalid-argument', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'bad request', _object_spread_props$e(_object_spread$l({
181
181
  status: 400,
182
182
  code: firebase.BAD_REQUEST_ERROR_CODE
183
183
  }, serverError), {
@@ -192,7 +192,7 @@ function _type_of$7(obj) {
192
192
  */ function preconditionConflictError(messageOrError) {
193
193
  var _serverError_message;
194
194
  var serverError = util.partialServerError(messageOrError);
195
- return new https.HttpsError('failed-precondition', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'conflict', _object_spread_props$e(_object_spread$j({
195
+ return new https.HttpsError('failed-precondition', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'conflict', _object_spread_props$e(_object_spread$l({
196
196
  status: 409,
197
197
  code: firebase.CONFLICT_ERROR_CODE
198
198
  }, serverError), {
@@ -207,7 +207,7 @@ function _type_of$7(obj) {
207
207
  */ function alreadyExistsError(messageOrError) {
208
208
  var _serverError_message;
209
209
  var serverError = util.partialServerError(messageOrError);
210
- return new https.HttpsError('already-exists', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'already exists', _object_spread_props$e(_object_spread$j({
210
+ return new https.HttpsError('already-exists', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'already exists', _object_spread_props$e(_object_spread$l({
211
211
  status: 409,
212
212
  code: firebase.ALREADY_EXISTS_ERROR_CODE
213
213
  }, serverError), {
@@ -222,7 +222,7 @@ function _type_of$7(obj) {
222
222
  */ function unavailableError(messageOrError) {
223
223
  var _serverError_message;
224
224
  var serverError = util.partialServerError(messageOrError);
225
- return new https.HttpsError('unavailable', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'service unavailable', _object_spread_props$e(_object_spread$j({
225
+ return new https.HttpsError('unavailable', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'service unavailable', _object_spread_props$e(_object_spread$l({
226
226
  status: 503,
227
227
  code: firebase.UNAVAILABLE_ERROR_CODE
228
228
  }, serverError), {
@@ -237,7 +237,7 @@ function _type_of$7(obj) {
237
237
  */ function unavailableOrDeactivatedFunctionError(messageOrError) {
238
238
  var _serverError_message;
239
239
  var serverError = util.partialServerError(messageOrError);
240
- return new https.HttpsError('unimplemented', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'the requested function is not available or has been deactivated for use', _object_spread_props$e(_object_spread$j({
240
+ return new https.HttpsError('unimplemented', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'the requested function is not available or has been deactivated for use', _object_spread_props$e(_object_spread$l({
241
241
  status: 501,
242
242
  code: firebase.UNAVAILABLE_OR_DEACTIVATED_FUNCTION_ERROR_CODE
243
243
  }, serverError), {
@@ -252,7 +252,7 @@ function _type_of$7(obj) {
252
252
  */ function internalServerError(messageOrError) {
253
253
  var _serverError_message;
254
254
  var serverError = util.partialServerError(messageOrError);
255
- return new https.HttpsError('internal', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'internal error', _object_spread_props$e(_object_spread$j({
255
+ return new https.HttpsError('internal', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'internal error', _object_spread_props$e(_object_spread$l({
256
256
  status: 500,
257
257
  code: firebase.INTERNAL_SERVER_ERROR_CODE
258
258
  }, serverError), {
@@ -412,7 +412,11 @@ function _type_of$7(obj) {
412
412
  * Converts a Firebase Admin {@link admin.auth.DecodedIdToken} into a normalized {@link FirebaseAuthToken}.
413
413
  *
414
414
  * Maps Firebase Admin token fields (snake_case) to the application's token interface (camelCase),
415
- * including email, phone, and sign-in timestamps.
415
+ * including email, phone, and sign-in timestamps. `auth_time`/`iat` are Unix seconds per the
416
+ * Firebase Admin types, so they are converted to milliseconds before being formatted. Missing
417
+ * or non-finite values map to `undefined` (the {@link FirebaseAuthToken} fields are optional) —
418
+ * synthetic tokens built from OIDC bearer auth do not always carry those claims, and we must
419
+ * not throw `RangeError("Invalid time value")` from this path.
416
420
  *
417
421
  * @param token - The decoded ID token from Firebase Admin Auth.
418
422
  * @returns A normalized {@link FirebaseAuthToken} with camelCase fields.
@@ -427,10 +431,20 @@ function _type_of$7(obj) {
427
431
  email: token.email,
428
432
  emailVerified: token.email_verified,
429
433
  phoneNumber: token.phone_number,
430
- lastSignInTime: new Date(token.auth_time).toISOString(),
431
- lastRefreshTime: new Date(token.iat).toISOString()
434
+ lastSignInTime: toIsoStringFromUnixSeconds(token.auth_time),
435
+ lastRefreshTime: toIsoStringFromUnixSeconds(token.iat)
432
436
  };
433
437
  }
438
+ function toIsoStringFromUnixSeconds(value) {
439
+ var result;
440
+ if (typeof value === 'number' && Number.isFinite(value)) {
441
+ var date = new Date(value * 1000);
442
+ if (Number.isFinite(date.getTime())) {
443
+ result = date.toISOString();
444
+ }
445
+ }
446
+ return result;
447
+ }
434
448
 
435
449
  function asyncGeneratorStep$h(gen, resolve, reject, _next, _throw, key, arg) {
436
450
  try {
@@ -975,7 +989,7 @@ function _non_iterable_rest$4() {
975
989
  function _non_iterable_spread$a() {
976
990
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
977
991
  }
978
- function _object_spread$i(target) {
992
+ function _object_spread$k(target) {
979
993
  for(var i = 1; i < arguments.length; i++){
980
994
  var source = arguments[i] != null ? arguments[i] : {};
981
995
  var ownKeys = Object.keys(source);
@@ -1407,7 +1421,7 @@ function _ts_generator$g(thisArg, body) {
1407
1421
  return _async_to_generator$g(function() {
1408
1422
  var claims;
1409
1423
  return _ts_generator$g(this, function(_state) {
1410
- claims = _object_spread$i({}, claimsToRetain, this._claimsForRolesChange(_to_consumable_array$a(roles)));
1424
+ claims = _object_spread$k({}, claimsToRetain, this._claimsForRolesChange(_to_consumable_array$a(roles)));
1411
1425
  return [
1412
1426
  2,
1413
1427
  this.setClaims(claims)
@@ -1451,7 +1465,7 @@ function _ts_generator$g(thisArg, body) {
1451
1465
  ];
1452
1466
  case 1:
1453
1467
  currentClaims = _state.sent();
1454
- newClaims = _object_spread$i({}, currentClaims, util.filterUndefinedValues(claims, false));
1468
+ newClaims = _object_spread$k({}, currentClaims, util.filterUndefinedValues(claims, false));
1455
1469
  newClaims = util.filterNullAndUndefinedValues(newClaims);
1456
1470
  return [
1457
1471
  2,
@@ -3220,7 +3234,7 @@ function _iterable_to_array$9(iter) {
3220
3234
  function _non_iterable_spread$9() {
3221
3235
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
3222
3236
  }
3223
- function _object_spread$h(target) {
3237
+ function _object_spread$j(target) {
3224
3238
  for(var i = 1; i < arguments.length; i++){
3225
3239
  var source = arguments[i] != null ? arguments[i] : {};
3226
3240
  var ownKeys = Object.keys(source);
@@ -3277,7 +3291,7 @@ function _unsupported_iterable_to_array$d(o, minLen) {
3277
3291
  }
3278
3292
  return result;
3279
3293
  }
3280
- var updateData = _object_spread$h({}, createUpdatesWithArrayFunction(union, firestore.FieldValue.arrayUnion), createUpdatesWithArrayFunction(remove, firestore.FieldValue.arrayRemove));
3294
+ var updateData = _object_spread$j({}, createUpdatesWithArrayFunction(union, firestore.FieldValue.arrayUnion), createUpdatesWithArrayFunction(remove, firestore.FieldValue.arrayRemove));
3281
3295
  return updateData;
3282
3296
  }
3283
3297
 
@@ -4127,7 +4141,7 @@ function _iterable_to_array$8(iter) {
4127
4141
  function _non_iterable_spread$8() {
4128
4142
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
4129
4143
  }
4130
- function _object_spread$g(target) {
4144
+ function _object_spread$i(target) {
4131
4145
  for(var i = 1; i < arguments.length; i++){
4132
4146
  var source = arguments[i] != null ? arguments[i] : {};
4133
4147
  var ownKeys = Object.keys(source);
@@ -4240,7 +4254,7 @@ var _obj;
4240
4254
  * const queryDriver = googleCloudFirestoreQueryDriver();
4241
4255
  * ```
4242
4256
  */ function googleCloudFirestoreQueryDriver() {
4243
- return _object_spread_props$d(_object_spread$g({}, firestoreClientQueryConstraintFunctionsDriver()), {
4257
+ return _object_spread_props$d(_object_spread$i({}, firestoreClientQueryConstraintFunctionsDriver()), {
4244
4258
  countDocs: function countDocs(query) {
4245
4259
  return query.count().get().then(function(x) {
4246
4260
  return x.data().count;
@@ -5446,7 +5460,7 @@ function _define_property$q(obj, key, value) {
5446
5460
  }
5447
5461
  return obj;
5448
5462
  }
5449
- function _object_spread$f(target) {
5463
+ function _object_spread$h(target) {
5450
5464
  for(var i = 1; i < arguments.length; i++){
5451
5465
  var source = arguments[i] != null ? arguments[i] : {};
5452
5466
  var ownKeys = Object.keys(source);
@@ -5624,7 +5638,7 @@ function _object_spread_props$c(target, source) {
5624
5638
  modelType: modelType,
5625
5639
  specifier: specifier
5626
5640
  });
5627
- return crudFn(_object_spread_props$c(_object_spread$f({}, request), {
5641
+ return crudFn(_object_spread_props$c(_object_spread$h({}, request), {
5628
5642
  specifier: specifier,
5629
5643
  data: request.data.data
5630
5644
  }));
@@ -6278,7 +6292,7 @@ function _inherits$2(subClass, superClass) {
6278
6292
  });
6279
6293
  if (superClass) _set_prototype_of$2(subClass, superClass);
6280
6294
  }
6281
- function _object_spread$e(target) {
6295
+ function _object_spread$g(target) {
6282
6296
  for(var i = 1; i < arguments.length; i++){
6283
6297
  var source = arguments[i] != null ? arguments[i] : {};
6284
6298
  var ownKeys = Object.keys(source);
@@ -6359,7 +6373,7 @@ function _is_native_reflect_construct$2() {
6359
6373
  {
6360
6374
  key: "handleOnCallAnalyticsEvent",
6361
6375
  value: function handleOnCallAnalyticsEvent(event) {
6362
- var properties = _object_spread$e(_object_spread_props$b(_object_spread$e({}, analytics.asAnalyticsEventData(event.properties)), {
6376
+ var properties = _object_spread$g(_object_spread_props$b(_object_spread$g({}, analytics.asAnalyticsEventData(event.properties)), {
6363
6377
  call: event.call,
6364
6378
  modelType: event.modelType,
6365
6379
  lifecycle: event.lifecycle
@@ -6489,7 +6503,7 @@ function _define_property$o(obj, key, value) {
6489
6503
  }
6490
6504
  return obj;
6491
6505
  }
6492
- function _object_spread$d(target) {
6506
+ function _object_spread$f(target) {
6493
6507
  for(var i = 1; i < arguments.length; i++){
6494
6508
  var source = arguments[i] != null ? arguments[i] : {};
6495
6509
  var ownKeys = Object.keys(source);
@@ -6570,7 +6584,7 @@ exports.FirebaseServerAuthModule = __decorate([
6570
6584
  */ function provideFirebaseServerAuthService(provider) {
6571
6585
  var _provider_inject;
6572
6586
  return [
6573
- _object_spread_props$a(_object_spread$d({}, provider), {
6587
+ _object_spread_props$a(_object_spread$f({}, provider), {
6574
6588
  inject: (_provider_inject = provider.inject) !== null && _provider_inject !== void 0 ? _provider_inject : [
6575
6589
  FIREBASE_AUTH_TOKEN
6576
6590
  ]
@@ -6771,7 +6785,7 @@ function _define_property$n(obj, key, value) {
6771
6785
  }
6772
6786
  return obj;
6773
6787
  }
6774
- function _object_spread$c(target) {
6788
+ function _object_spread$e(target) {
6775
6789
  for(var i = 1; i < arguments.length; i++){
6776
6790
  var source = arguments[i] != null ? arguments[i] : {};
6777
6791
  var ownKeys = Object.keys(source);
@@ -6816,7 +6830,7 @@ function _object_spread_props$9(target, source) {
6816
6830
  * @param request - The base request to augment (must include the nestApplication reference).
6817
6831
  * @returns A new object combining the request properties with the nest context.
6818
6832
  */ function injectNestIntoRequest(nest, request) {
6819
- return _object_spread_props$9(_object_spread$c({}, request), {
6833
+ return _object_spread_props$9(_object_spread$e({}, request), {
6820
6834
  nest: nest
6821
6835
  });
6822
6836
  }
@@ -6830,7 +6844,7 @@ function _object_spread_props$9(target, source) {
6830
6844
  * @param request - The base request to augment.
6831
6845
  * @returns A new object combining the request properties with the application context.
6832
6846
  */ function injectNestApplicationContextIntoRequest(nestContext, request) {
6833
- return _object_spread_props$9(_object_spread$c({}, request), {
6847
+ return _object_spread_props$9(_object_spread$e({}, request), {
6834
6848
  nestApplication: nestContext
6835
6849
  });
6836
6850
  }
@@ -6895,6 +6909,21 @@ function _define_property$m(obj, key, value) {
6895
6909
  }
6896
6910
  return obj;
6897
6911
  }
6912
+ function _object_spread$d(target) {
6913
+ for(var i = 1; i < arguments.length; i++){
6914
+ var source = arguments[i] != null ? arguments[i] : {};
6915
+ var ownKeys = Object.keys(source);
6916
+ if (typeof Object.getOwnPropertySymbols === "function") {
6917
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
6918
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
6919
+ }));
6920
+ }
6921
+ ownKeys.forEach(function(key) {
6922
+ _define_property$m(target, key, source[key]);
6923
+ });
6924
+ }
6925
+ return target;
6926
+ }
6898
6927
  function _ts_generator$a(thisArg, body) {
6899
6928
  var f, y, t, _ = {
6900
6929
  label: 0,
@@ -7053,14 +7082,17 @@ function _ts_generator$a(thisArg, body) {
7053
7082
  * @returns The handler's return value.
7054
7083
  */ function dispatch(params, auth, rawRequest) {
7055
7084
  return _async_to_generator$a(function() {
7056
- var _auth_oidcValidatedToken, callableRequest, appRequest, contextRequest;
7085
+ var _auth_token, _auth_oidcValidatedToken, callableRequest, appRequest, contextRequest;
7057
7086
  return _ts_generator$a(this, function(_state) {
7058
- // Build a synthetic CallableRequest that the dispatch chain expects
7087
+ // Build a synthetic CallableRequest that the dispatch chain expects. Layer the
7088
+ // OIDC-validated claim subset over the base token so standard JWT claims
7089
+ // (`iat`, `auth_time`, `email`, …) survive — the callModel chain and any
7090
+ // `authContextInfo` consumer downstream rely on them being present.
7059
7091
  callableRequest = {
7060
7092
  data: params,
7061
7093
  auth: auth ? {
7062
7094
  uid: auth.uid,
7063
- token: (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {}
7095
+ token: _object_spread$d({}, (_auth_token = auth.token) !== null && _auth_token !== void 0 ? _auth_token : {}, (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {})
7064
7096
  } : undefined,
7065
7097
  rawRequest: rawRequest,
7066
7098
  acceptsStreaming: false
@@ -7156,6 +7188,21 @@ function _define_property$l(obj, key, value) {
7156
7188
  }
7157
7189
  return obj;
7158
7190
  }
7191
+ function _object_spread$c(target) {
7192
+ for(var i = 1; i < arguments.length; i++){
7193
+ var source = arguments[i] != null ? arguments[i] : {};
7194
+ var ownKeys = Object.keys(source);
7195
+ if (typeof Object.getOwnPropertySymbols === "function") {
7196
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
7197
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
7198
+ }));
7199
+ }
7200
+ ownKeys.forEach(function(key) {
7201
+ _define_property$l(target, key, source[key]);
7202
+ });
7203
+ }
7204
+ return target;
7205
+ }
7159
7206
  function _ts_generator$9(thisArg, body) {
7160
7207
  var f, y, t, _ = {
7161
7208
  label: 0,
@@ -7410,17 +7457,26 @@ function _ts_generator$9(thisArg, body) {
7410
7457
  * Builds an {@link AuthDataRef} compatible with `useModel()` from the HTTP request auth.
7411
7458
  *
7412
7459
  * Uses the same synthetic auth pattern as {@link ModelApiDispatchService.dispatch}.
7460
+ * The OIDC-validated claim subset is layered over the base token so the synthetic
7461
+ * `auth.token` keeps standard JWT claims (`iat`, `auth_time`, `email`, …) that
7462
+ * downstream consumers like `authContextInfo` rely on.
7413
7463
  *
7414
7464
  * @param auth - The Firebase server auth data from the HTTP request, or undefined for unauthenticated requests.
7415
7465
  * @returns An object containing a synthetic {@link AuthData} for use with `useModel()`, or undefined auth.
7416
7466
  */ key: "_makeAuthRef",
7417
7467
  value: function _makeAuthRef(auth) {
7418
- var _ref, _auth_oidcValidatedToken;
7419
- return {
7420
- auth: auth ? {
7468
+ var synthetic;
7469
+ if (auth) {
7470
+ var _auth_token, _auth_oidcValidatedToken;
7471
+ var baseToken = (_auth_token = auth.token) !== null && _auth_token !== void 0 ? _auth_token : {};
7472
+ var oidcToken = (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {};
7473
+ synthetic = {
7421
7474
  uid: auth.uid,
7422
- token: (_ref = (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : auth.token) !== null && _ref !== void 0 ? _ref : {}
7423
- } : undefined
7475
+ token: _object_spread$c({}, baseToken, oidcToken)
7476
+ };
7477
+ }
7478
+ return {
7479
+ auth: synthetic
7424
7480
  };
7425
7481
  }
7426
7482
  }
package/index.esm.js CHANGED
@@ -33,7 +33,7 @@ function _define_property$z(obj, key, value) {
33
33
  }
34
34
  return obj;
35
35
  }
36
- function _object_spread$j(target) {
36
+ function _object_spread$l(target) {
37
37
  for(var i = 1; i < arguments.length; i++){
38
38
  var source = arguments[i] != null ? arguments[i] : {};
39
39
  var ownKeys = Object.keys(source);
@@ -100,7 +100,7 @@ function _type_of$7(obj) {
100
100
  */ function unauthenticatedError(messageOrError) {
101
101
  var _serverError_message;
102
102
  var serverError = partialServerError(messageOrError);
103
- return new HttpsError('unauthenticated', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'unauthenticated', _object_spread_props$e(_object_spread$j({
103
+ return new HttpsError('unauthenticated', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'unauthenticated', _object_spread_props$e(_object_spread$l({
104
104
  status: 401,
105
105
  code: UNAUTHENTICATED_ERROR_CODE
106
106
  }, serverError), {
@@ -115,7 +115,7 @@ function _type_of$7(obj) {
115
115
  */ function forbiddenError(messageOrError) {
116
116
  var _serverError_message;
117
117
  var serverError = partialServerError(messageOrError);
118
- return new HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'forbidden', _object_spread_props$e(_object_spread$j({
118
+ return new HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'forbidden', _object_spread_props$e(_object_spread$l({
119
119
  status: 403,
120
120
  code: FORBIDDEN_ERROR_CODE
121
121
  }, serverError), {
@@ -130,7 +130,7 @@ function _type_of$7(obj) {
130
130
  */ function permissionDeniedError(messageOrError) {
131
131
  var _serverError_message;
132
132
  var serverError = partialServerError(messageOrError);
133
- return new HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'permission denied', _object_spread_props$e(_object_spread$j({
133
+ return new HttpsError('permission-denied', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'permission denied', _object_spread_props$e(_object_spread$l({
134
134
  status: 403,
135
135
  code: PERMISSION_DENIED_ERROR_CODE
136
136
  }, serverError), {
@@ -145,7 +145,7 @@ function _type_of$7(obj) {
145
145
  */ function notFoundError(messageOrError) {
146
146
  var _serverError_message;
147
147
  var serverError = partialServerError(messageOrError);
148
- return new HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'not found', _object_spread_props$e(_object_spread$j({
148
+ return new HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'not found', _object_spread_props$e(_object_spread$l({
149
149
  status: 404,
150
150
  code: NOT_FOUND_ERROR_CODE
151
151
  }, serverError), {
@@ -160,7 +160,7 @@ function _type_of$7(obj) {
160
160
  */ function modelNotAvailableError(messageOrError) {
161
161
  var _serverError_message;
162
162
  var serverError = partialServerError(messageOrError);
163
- return new HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'model was not available', _object_spread_props$e(_object_spread$j({
163
+ return new HttpsError('not-found', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'model was not available', _object_spread_props$e(_object_spread$l({
164
164
  status: 404,
165
165
  code: MODEL_NOT_AVAILABLE_ERROR_CODE
166
166
  }, serverError), {
@@ -175,7 +175,7 @@ function _type_of$7(obj) {
175
175
  */ function badRequestError(messageOrError) {
176
176
  var _serverError_message;
177
177
  var serverError = partialServerError(messageOrError);
178
- return new HttpsError('invalid-argument', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'bad request', _object_spread_props$e(_object_spread$j({
178
+ return new HttpsError('invalid-argument', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'bad request', _object_spread_props$e(_object_spread$l({
179
179
  status: 400,
180
180
  code: BAD_REQUEST_ERROR_CODE
181
181
  }, serverError), {
@@ -190,7 +190,7 @@ function _type_of$7(obj) {
190
190
  */ function preconditionConflictError(messageOrError) {
191
191
  var _serverError_message;
192
192
  var serverError = partialServerError(messageOrError);
193
- return new HttpsError('failed-precondition', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'conflict', _object_spread_props$e(_object_spread$j({
193
+ return new HttpsError('failed-precondition', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'conflict', _object_spread_props$e(_object_spread$l({
194
194
  status: 409,
195
195
  code: CONFLICT_ERROR_CODE
196
196
  }, serverError), {
@@ -205,7 +205,7 @@ function _type_of$7(obj) {
205
205
  */ function alreadyExistsError(messageOrError) {
206
206
  var _serverError_message;
207
207
  var serverError = partialServerError(messageOrError);
208
- return new HttpsError('already-exists', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'already exists', _object_spread_props$e(_object_spread$j({
208
+ return new HttpsError('already-exists', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'already exists', _object_spread_props$e(_object_spread$l({
209
209
  status: 409,
210
210
  code: ALREADY_EXISTS_ERROR_CODE
211
211
  }, serverError), {
@@ -220,7 +220,7 @@ function _type_of$7(obj) {
220
220
  */ function unavailableError(messageOrError) {
221
221
  var _serverError_message;
222
222
  var serverError = partialServerError(messageOrError);
223
- return new HttpsError('unavailable', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'service unavailable', _object_spread_props$e(_object_spread$j({
223
+ return new HttpsError('unavailable', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'service unavailable', _object_spread_props$e(_object_spread$l({
224
224
  status: 503,
225
225
  code: UNAVAILABLE_ERROR_CODE
226
226
  }, serverError), {
@@ -235,7 +235,7 @@ function _type_of$7(obj) {
235
235
  */ function unavailableOrDeactivatedFunctionError(messageOrError) {
236
236
  var _serverError_message;
237
237
  var serverError = partialServerError(messageOrError);
238
- return new HttpsError('unimplemented', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'the requested function is not available or has been deactivated for use', _object_spread_props$e(_object_spread$j({
238
+ return new HttpsError('unimplemented', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'the requested function is not available or has been deactivated for use', _object_spread_props$e(_object_spread$l({
239
239
  status: 501,
240
240
  code: UNAVAILABLE_OR_DEACTIVATED_FUNCTION_ERROR_CODE
241
241
  }, serverError), {
@@ -250,7 +250,7 @@ function _type_of$7(obj) {
250
250
  */ function internalServerError(messageOrError) {
251
251
  var _serverError_message;
252
252
  var serverError = partialServerError(messageOrError);
253
- return new HttpsError('internal', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'internal error', _object_spread_props$e(_object_spread$j({
253
+ return new HttpsError('internal', (_serverError_message = serverError.message) !== null && _serverError_message !== void 0 ? _serverError_message : 'internal error', _object_spread_props$e(_object_spread$l({
254
254
  status: 500,
255
255
  code: INTERNAL_SERVER_ERROR_CODE
256
256
  }, serverError), {
@@ -410,7 +410,11 @@ function _type_of$7(obj) {
410
410
  * Converts a Firebase Admin {@link admin.auth.DecodedIdToken} into a normalized {@link FirebaseAuthToken}.
411
411
  *
412
412
  * Maps Firebase Admin token fields (snake_case) to the application's token interface (camelCase),
413
- * including email, phone, and sign-in timestamps.
413
+ * including email, phone, and sign-in timestamps. `auth_time`/`iat` are Unix seconds per the
414
+ * Firebase Admin types, so they are converted to milliseconds before being formatted. Missing
415
+ * or non-finite values map to `undefined` (the {@link FirebaseAuthToken} fields are optional) —
416
+ * synthetic tokens built from OIDC bearer auth do not always carry those claims, and we must
417
+ * not throw `RangeError("Invalid time value")` from this path.
414
418
  *
415
419
  * @param token - The decoded ID token from Firebase Admin Auth.
416
420
  * @returns A normalized {@link FirebaseAuthToken} with camelCase fields.
@@ -425,10 +429,20 @@ function _type_of$7(obj) {
425
429
  email: token.email,
426
430
  emailVerified: token.email_verified,
427
431
  phoneNumber: token.phone_number,
428
- lastSignInTime: new Date(token.auth_time).toISOString(),
429
- lastRefreshTime: new Date(token.iat).toISOString()
432
+ lastSignInTime: toIsoStringFromUnixSeconds(token.auth_time),
433
+ lastRefreshTime: toIsoStringFromUnixSeconds(token.iat)
430
434
  };
431
435
  }
436
+ function toIsoStringFromUnixSeconds(value) {
437
+ var result;
438
+ if (typeof value === 'number' && Number.isFinite(value)) {
439
+ var date = new Date(value * 1000);
440
+ if (Number.isFinite(date.getTime())) {
441
+ result = date.toISOString();
442
+ }
443
+ }
444
+ return result;
445
+ }
432
446
 
433
447
  function asyncGeneratorStep$h(gen, resolve, reject, _next, _throw, key, arg) {
434
448
  try {
@@ -973,7 +987,7 @@ function _non_iterable_rest$4() {
973
987
  function _non_iterable_spread$a() {
974
988
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
975
989
  }
976
- function _object_spread$i(target) {
990
+ function _object_spread$k(target) {
977
991
  for(var i = 1; i < arguments.length; i++){
978
992
  var source = arguments[i] != null ? arguments[i] : {};
979
993
  var ownKeys = Object.keys(source);
@@ -1405,7 +1419,7 @@ function _ts_generator$g(thisArg, body) {
1405
1419
  return _async_to_generator$g(function() {
1406
1420
  var claims;
1407
1421
  return _ts_generator$g(this, function(_state) {
1408
- claims = _object_spread$i({}, claimsToRetain, this._claimsForRolesChange(_to_consumable_array$a(roles)));
1422
+ claims = _object_spread$k({}, claimsToRetain, this._claimsForRolesChange(_to_consumable_array$a(roles)));
1409
1423
  return [
1410
1424
  2,
1411
1425
  this.setClaims(claims)
@@ -1449,7 +1463,7 @@ function _ts_generator$g(thisArg, body) {
1449
1463
  ];
1450
1464
  case 1:
1451
1465
  currentClaims = _state.sent();
1452
- newClaims = _object_spread$i({}, currentClaims, filterUndefinedValues(claims, false));
1466
+ newClaims = _object_spread$k({}, currentClaims, filterUndefinedValues(claims, false));
1453
1467
  newClaims = filterNullAndUndefinedValues(newClaims);
1454
1468
  return [
1455
1469
  2,
@@ -3218,7 +3232,7 @@ function _iterable_to_array$9(iter) {
3218
3232
  function _non_iterable_spread$9() {
3219
3233
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
3220
3234
  }
3221
- function _object_spread$h(target) {
3235
+ function _object_spread$j(target) {
3222
3236
  for(var i = 1; i < arguments.length; i++){
3223
3237
  var source = arguments[i] != null ? arguments[i] : {};
3224
3238
  var ownKeys = Object.keys(source);
@@ -3275,7 +3289,7 @@ function _unsupported_iterable_to_array$d(o, minLen) {
3275
3289
  }
3276
3290
  return result;
3277
3291
  }
3278
- var updateData = _object_spread$h({}, createUpdatesWithArrayFunction(union, FieldValue.arrayUnion), createUpdatesWithArrayFunction(remove, FieldValue.arrayRemove));
3292
+ var updateData = _object_spread$j({}, createUpdatesWithArrayFunction(union, FieldValue.arrayUnion), createUpdatesWithArrayFunction(remove, FieldValue.arrayRemove));
3279
3293
  return updateData;
3280
3294
  }
3281
3295
 
@@ -4125,7 +4139,7 @@ function _iterable_to_array$8(iter) {
4125
4139
  function _non_iterable_spread$8() {
4126
4140
  throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
4127
4141
  }
4128
- function _object_spread$g(target) {
4142
+ function _object_spread$i(target) {
4129
4143
  for(var i = 1; i < arguments.length; i++){
4130
4144
  var source = arguments[i] != null ? arguments[i] : {};
4131
4145
  var ownKeys = Object.keys(source);
@@ -4238,7 +4252,7 @@ var _obj;
4238
4252
  * const queryDriver = googleCloudFirestoreQueryDriver();
4239
4253
  * ```
4240
4254
  */ function googleCloudFirestoreQueryDriver() {
4241
- return _object_spread_props$d(_object_spread$g({}, firestoreClientQueryConstraintFunctionsDriver()), {
4255
+ return _object_spread_props$d(_object_spread$i({}, firestoreClientQueryConstraintFunctionsDriver()), {
4242
4256
  countDocs: function countDocs(query) {
4243
4257
  return query.count().get().then(function(x) {
4244
4258
  return x.data().count;
@@ -5444,7 +5458,7 @@ function _define_property$q(obj, key, value) {
5444
5458
  }
5445
5459
  return obj;
5446
5460
  }
5447
- function _object_spread$f(target) {
5461
+ function _object_spread$h(target) {
5448
5462
  for(var i = 1; i < arguments.length; i++){
5449
5463
  var source = arguments[i] != null ? arguments[i] : {};
5450
5464
  var ownKeys = Object.keys(source);
@@ -5622,7 +5636,7 @@ function _object_spread_props$c(target, source) {
5622
5636
  modelType: modelType,
5623
5637
  specifier: specifier
5624
5638
  });
5625
- return crudFn(_object_spread_props$c(_object_spread$f({}, request), {
5639
+ return crudFn(_object_spread_props$c(_object_spread$h({}, request), {
5626
5640
  specifier: specifier,
5627
5641
  data: request.data.data
5628
5642
  }));
@@ -6276,7 +6290,7 @@ function _inherits$2(subClass, superClass) {
6276
6290
  });
6277
6291
  if (superClass) _set_prototype_of$2(subClass, superClass);
6278
6292
  }
6279
- function _object_spread$e(target) {
6293
+ function _object_spread$g(target) {
6280
6294
  for(var i = 1; i < arguments.length; i++){
6281
6295
  var source = arguments[i] != null ? arguments[i] : {};
6282
6296
  var ownKeys = Object.keys(source);
@@ -6357,7 +6371,7 @@ function _is_native_reflect_construct$2() {
6357
6371
  {
6358
6372
  key: "handleOnCallAnalyticsEvent",
6359
6373
  value: function handleOnCallAnalyticsEvent(event) {
6360
- var properties = _object_spread$e(_object_spread_props$b(_object_spread$e({}, asAnalyticsEventData(event.properties)), {
6374
+ var properties = _object_spread$g(_object_spread_props$b(_object_spread$g({}, asAnalyticsEventData(event.properties)), {
6361
6375
  call: event.call,
6362
6376
  modelType: event.modelType,
6363
6377
  lifecycle: event.lifecycle
@@ -6487,7 +6501,7 @@ function _define_property$o(obj, key, value) {
6487
6501
  }
6488
6502
  return obj;
6489
6503
  }
6490
- function _object_spread$d(target) {
6504
+ function _object_spread$f(target) {
6491
6505
  for(var i = 1; i < arguments.length; i++){
6492
6506
  var source = arguments[i] != null ? arguments[i] : {};
6493
6507
  var ownKeys = Object.keys(source);
@@ -6568,7 +6582,7 @@ FirebaseServerAuthModule = __decorate([
6568
6582
  */ function provideFirebaseServerAuthService(provider) {
6569
6583
  var _provider_inject;
6570
6584
  return [
6571
- _object_spread_props$a(_object_spread$d({}, provider), {
6585
+ _object_spread_props$a(_object_spread$f({}, provider), {
6572
6586
  inject: (_provider_inject = provider.inject) !== null && _provider_inject !== void 0 ? _provider_inject : [
6573
6587
  FIREBASE_AUTH_TOKEN
6574
6588
  ]
@@ -6769,7 +6783,7 @@ function _define_property$n(obj, key, value) {
6769
6783
  }
6770
6784
  return obj;
6771
6785
  }
6772
- function _object_spread$c(target) {
6786
+ function _object_spread$e(target) {
6773
6787
  for(var i = 1; i < arguments.length; i++){
6774
6788
  var source = arguments[i] != null ? arguments[i] : {};
6775
6789
  var ownKeys = Object.keys(source);
@@ -6814,7 +6828,7 @@ function _object_spread_props$9(target, source) {
6814
6828
  * @param request - The base request to augment (must include the nestApplication reference).
6815
6829
  * @returns A new object combining the request properties with the nest context.
6816
6830
  */ function injectNestIntoRequest(nest, request) {
6817
- return _object_spread_props$9(_object_spread$c({}, request), {
6831
+ return _object_spread_props$9(_object_spread$e({}, request), {
6818
6832
  nest: nest
6819
6833
  });
6820
6834
  }
@@ -6828,7 +6842,7 @@ function _object_spread_props$9(target, source) {
6828
6842
  * @param request - The base request to augment.
6829
6843
  * @returns A new object combining the request properties with the application context.
6830
6844
  */ function injectNestApplicationContextIntoRequest(nestContext, request) {
6831
- return _object_spread_props$9(_object_spread$c({}, request), {
6845
+ return _object_spread_props$9(_object_spread$e({}, request), {
6832
6846
  nestApplication: nestContext
6833
6847
  });
6834
6848
  }
@@ -6893,6 +6907,21 @@ function _define_property$m(obj, key, value) {
6893
6907
  }
6894
6908
  return obj;
6895
6909
  }
6910
+ function _object_spread$d(target) {
6911
+ for(var i = 1; i < arguments.length; i++){
6912
+ var source = arguments[i] != null ? arguments[i] : {};
6913
+ var ownKeys = Object.keys(source);
6914
+ if (typeof Object.getOwnPropertySymbols === "function") {
6915
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
6916
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
6917
+ }));
6918
+ }
6919
+ ownKeys.forEach(function(key) {
6920
+ _define_property$m(target, key, source[key]);
6921
+ });
6922
+ }
6923
+ return target;
6924
+ }
6896
6925
  function _ts_generator$a(thisArg, body) {
6897
6926
  var f, y, t, _ = {
6898
6927
  label: 0,
@@ -7051,14 +7080,17 @@ function _ts_generator$a(thisArg, body) {
7051
7080
  * @returns The handler's return value.
7052
7081
  */ function dispatch(params, auth, rawRequest) {
7053
7082
  return _async_to_generator$a(function() {
7054
- var _auth_oidcValidatedToken, callableRequest, appRequest, contextRequest;
7083
+ var _auth_token, _auth_oidcValidatedToken, callableRequest, appRequest, contextRequest;
7055
7084
  return _ts_generator$a(this, function(_state) {
7056
- // Build a synthetic CallableRequest that the dispatch chain expects
7085
+ // Build a synthetic CallableRequest that the dispatch chain expects. Layer the
7086
+ // OIDC-validated claim subset over the base token so standard JWT claims
7087
+ // (`iat`, `auth_time`, `email`, …) survive — the callModel chain and any
7088
+ // `authContextInfo` consumer downstream rely on them being present.
7057
7089
  callableRequest = {
7058
7090
  data: params,
7059
7091
  auth: auth ? {
7060
7092
  uid: auth.uid,
7061
- token: (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {}
7093
+ token: _object_spread$d({}, (_auth_token = auth.token) !== null && _auth_token !== void 0 ? _auth_token : {}, (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {})
7062
7094
  } : undefined,
7063
7095
  rawRequest: rawRequest,
7064
7096
  acceptsStreaming: false
@@ -7154,6 +7186,21 @@ function _define_property$l(obj, key, value) {
7154
7186
  }
7155
7187
  return obj;
7156
7188
  }
7189
+ function _object_spread$c(target) {
7190
+ for(var i = 1; i < arguments.length; i++){
7191
+ var source = arguments[i] != null ? arguments[i] : {};
7192
+ var ownKeys = Object.keys(source);
7193
+ if (typeof Object.getOwnPropertySymbols === "function") {
7194
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
7195
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
7196
+ }));
7197
+ }
7198
+ ownKeys.forEach(function(key) {
7199
+ _define_property$l(target, key, source[key]);
7200
+ });
7201
+ }
7202
+ return target;
7203
+ }
7157
7204
  function _ts_generator$9(thisArg, body) {
7158
7205
  var f, y, t, _ = {
7159
7206
  label: 0,
@@ -7408,17 +7455,26 @@ function _ts_generator$9(thisArg, body) {
7408
7455
  * Builds an {@link AuthDataRef} compatible with `useModel()` from the HTTP request auth.
7409
7456
  *
7410
7457
  * Uses the same synthetic auth pattern as {@link ModelApiDispatchService.dispatch}.
7458
+ * The OIDC-validated claim subset is layered over the base token so the synthetic
7459
+ * `auth.token` keeps standard JWT claims (`iat`, `auth_time`, `email`, …) that
7460
+ * downstream consumers like `authContextInfo` rely on.
7411
7461
  *
7412
7462
  * @param auth - The Firebase server auth data from the HTTP request, or undefined for unauthenticated requests.
7413
7463
  * @returns An object containing a synthetic {@link AuthData} for use with `useModel()`, or undefined auth.
7414
7464
  */ key: "_makeAuthRef",
7415
7465
  value: function _makeAuthRef(auth) {
7416
- var _ref, _auth_oidcValidatedToken;
7417
- return {
7418
- auth: auth ? {
7466
+ var synthetic;
7467
+ if (auth) {
7468
+ var _auth_token, _auth_oidcValidatedToken;
7469
+ var baseToken = (_auth_token = auth.token) !== null && _auth_token !== void 0 ? _auth_token : {};
7470
+ var oidcToken = (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : {};
7471
+ synthetic = {
7419
7472
  uid: auth.uid,
7420
- token: (_ref = (_auth_oidcValidatedToken = auth.oidcValidatedToken) !== null && _auth_oidcValidatedToken !== void 0 ? _auth_oidcValidatedToken : auth.token) !== null && _ref !== void 0 ? _ref : {}
7421
- } : undefined
7473
+ token: _object_spread$c({}, baseToken, oidcToken)
7474
+ };
7475
+ }
7476
+ return {
7477
+ auth: synthetic
7422
7478
  };
7423
7479
  }
7424
7480
  }
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/mailgun",
3
- "version": "13.11.8",
3
+ "version": "13.11.10",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.8",
6
- "@dereekb/firebase": "13.11.8",
7
- "@dereekb/firebase-server": "13.11.8",
8
- "@dereekb/date": "13.11.8",
9
- "@dereekb/nestjs": "13.11.8",
10
- "@dereekb/model": "13.11.8",
11
- "@dereekb/rxjs": "13.11.8",
12
- "@dereekb/util": "13.11.8"
5
+ "@dereekb/analytics": "13.11.10",
6
+ "@dereekb/firebase": "13.11.10",
7
+ "@dereekb/firebase-server": "13.11.10",
8
+ "@dereekb/date": "13.11.10",
9
+ "@dereekb/nestjs": "13.11.10",
10
+ "@dereekb/model": "13.11.10",
11
+ "@dereekb/rxjs": "13.11.10",
12
+ "@dereekb/util": "13.11.10"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/model",
3
- "version": "13.11.8",
3
+ "version": "13.11.10",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.8",
6
- "@dereekb/date": "13.11.8",
7
- "@dereekb/firebase": "13.11.8",
8
- "@dereekb/firebase-server": "13.11.8",
9
- "@dereekb/model": "13.11.8",
10
- "@dereekb/nestjs": "13.11.8",
11
- "@dereekb/rxjs": "13.11.8",
12
- "@dereekb/util": "13.11.8",
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
13
  "@nestjs/common": "^11.1.19",
14
14
  "@nestjs/config": "^4.0.4",
15
15
  "archiver": "^7.0.1",
package/oidc/index.cjs.js CHANGED
@@ -5283,7 +5283,7 @@ function _ts_generator$2(thisArg, body) {
5283
5283
  * @throws {HttpException} 400 when the consent interaction cannot be completed.
5284
5284
  */ function postConsent(uid, body, res) {
5285
5285
  return _async_to_generator$2(function() {
5286
- var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5286
+ var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, encounteredOIDCScopes, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, encounteredOIDCClaims, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, encounteredResourceScopes, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5287
5287
  return _ts_generator$2(this, function(_state) {
5288
5288
  switch(_state.label){
5289
5289
  case 0:
@@ -5353,9 +5353,15 @@ function _ts_generator$2(thisArg, body) {
5353
5353
  ];
5354
5354
  case 7:
5355
5355
  grant = _state.sent();
5356
+ // Encountered = scopes/claims already granted (or rejected) on the existing Grant. oidc-provider
5357
+ // excludes these from `missingOIDCScope` etc. when the consent prompt is re-shown via `prompt=consent`,
5358
+ // but the consent UI sources its checkbox list from the auth URL's `scope=` param (the full request set)
5359
+ // and re-submits them all. We accept already-encountered values as silent no-ops so a re-consent on a
5360
+ // client the user has previously authorized doesn't fail validation.
5361
+ encounteredOIDCScopes = grant.getOIDCScopeEncountered().split(' ').filter(Boolean);
5356
5362
  missingOIDCScope = (_prompt_details_missingOIDCScope = prompt.details.missingOIDCScope) !== null && _prompt_details_missingOIDCScope !== void 0 ? _prompt_details_missingOIDCScope : [];
5357
5363
  if (missingOIDCScope.length > 0) {
5358
- _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5364
+ _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES, encounteredOIDCScopes), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5359
5365
  if (granted.length > 0) {
5360
5366
  grant.addOIDCScope(granted.join(' '));
5361
5367
  }
@@ -5380,9 +5386,10 @@ function _ts_generator$2(thisArg, body) {
5380
5386
  }
5381
5387
  }
5382
5388
  }
5389
+ encounteredOIDCClaims = grant.getOIDCClaimsEncountered();
5383
5390
  missingOIDCClaims = (_prompt_details_missingOIDCClaims = prompt.details.missingOIDCClaims) !== null && _prompt_details_missingOIDCClaims !== void 0 ? _prompt_details_missingOIDCClaims : [];
5384
5391
  if (missingOIDCClaims.length > 0) {
5385
- _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5392
+ _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims, [], encounteredOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5386
5393
  if (granted1.length > 0) {
5387
5394
  grant.addOIDCClaims(granted1);
5388
5395
  }
@@ -5397,7 +5404,8 @@ function _ts_generator$2(thisArg, body) {
5397
5404
  _step_value = _sliced_to_array(_step1.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5398
5405
  ;
5399
5406
  requestedSubset = (_body_grantedResourceScopes = body.grantedResourceScopes) === null || _body_grantedResourceScopes === void 0 ? void 0 : _body_grantedResourceScopes[indicator];
5400
- _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5407
+ encounteredResourceScopes = grant.getResourceScopeEncountered(indicator).split(' ').filter(Boolean);
5408
+ _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset, [], encounteredResourceScopes), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5401
5409
  if (granted2.length > 0) {
5402
5410
  grant.addResourceScope(indicator, granted2.join(' '));
5403
5411
  }
@@ -5551,24 +5559,29 @@ exports.OidcInteractionController = __decorate([
5551
5559
  ], exports.OidcInteractionController);
5552
5560
  /**
5553
5561
  * Resolves the effective set to grant — and the complementary set to
5554
- * reject — from a missing set, an optional caller-provided subset, and
5555
- * an optional list of always-granted entries.
5562
+ * reject — from a missing set, an optional caller-provided subset, an
5563
+ * optional list of always-granted entries, and an optional list of
5564
+ * already-encountered entries (granted or rejected on the existing Grant).
5556
5565
  *
5557
- * Throws `400 BAD_REQUEST` if the requested subset contains entries that
5558
- * are not in the missing set (no privilege escalation).
5566
+ * Throws `400 BAD_REQUEST` if the requested subset contains an entry that
5567
+ * is in neither the missing set nor the already-encountered set (no
5568
+ * privilege escalation).
5559
5569
  *
5560
5570
  * - When `requestedSubset` is undefined → grants everything in `missing` (back-compat); rejects nothing.
5561
- * - When `requestedSubset` is provided → grants exactly that subset; rejects every other missing entry so
5562
- * oidc-provider does not re-prompt for them.
5571
+ * - When `requestedSubset` is provided → grants the intersection with `missing`; rejects every other missing
5572
+ * entry so oidc-provider does not re-prompt for them. Values in `alreadyEncountered` pass validation but
5573
+ * are not re-applied to the grant (no-op).
5563
5574
  * - Always-granted entries are union'd into `granted` (clamped to `missing`).
5564
5575
  *
5565
5576
  * @param missing - Entries the OIDC prompt indicated were missing for this consent.
5566
- * @param requestedSubset - Optional subset the caller wants to grant; must be a subset of `missing`.
5577
+ * @param requestedSubset - Optional subset the caller wants to grant; each value must be in `missing` or `alreadyEncountered`.
5567
5578
  * @param alwaysGranted - Entries that must be granted whenever they appear in `missing`, regardless of `requestedSubset`.
5579
+ * @param alreadyEncountered - Entries the existing Grant has previously granted or rejected. Tolerated as no-ops on re-consent.
5568
5580
  * @returns `granted` to add to the grant and `rejected` to record on the grant.
5569
5581
  */ function resolveEffectiveSubset(missing, requestedSubset) {
5570
- var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
5582
+ var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], alreadyEncountered = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [];
5571
5583
  var missingSet = new Set(missing);
5584
+ var encounteredSet = new Set(alreadyEncountered);
5572
5585
  var baseSelection;
5573
5586
  if (requestedSubset === undefined) {
5574
5587
  baseSelection = missing;
@@ -5577,7 +5590,7 @@ exports.OidcInteractionController = __decorate([
5577
5590
  try {
5578
5591
  for(var _iterator = requestedSubset[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5579
5592
  var value = _step.value;
5580
- if (!missingSet.has(value)) {
5593
+ if (!missingSet.has(value) && !encounteredSet.has(value)) {
5581
5594
  throw new common.HttpException('Granted value "'.concat(value, '" is not in the requested set.'), common.HttpStatus.BAD_REQUEST);
5582
5595
  }
5583
5596
  }
@@ -5595,7 +5608,11 @@ exports.OidcInteractionController = __decorate([
5595
5608
  }
5596
5609
  }
5597
5610
  }
5598
- baseSelection = requestedSubset;
5611
+ // Filter to `missing` only — already-encountered values pass validation but
5612
+ // do not need to be re-applied (oidc-provider's Grant tracks them already).
5613
+ baseSelection = requestedSubset.filter(function(value) {
5614
+ return missingSet.has(value);
5615
+ });
5599
5616
  }
5600
5617
  var grantedSet = new Set(baseSelection);
5601
5618
  var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
@@ -6582,6 +6599,7 @@ exports.oidcModelServerActions = oidcModelServerActions;
6582
6599
  exports.oidcModelServerActionsFactory = oidcModelServerActionsFactory;
6583
6600
  exports.oidcModuleConfigFactory = oidcModuleConfigFactory;
6584
6601
  exports.oidcModuleMetadata = oidcModuleMetadata;
6602
+ exports.resolveEffectiveSubset = resolveEffectiveSubset;
6585
6603
  exports.rotateOidcClientSecretFactory = rotateOidcClientSecretFactory;
6586
6604
  exports.rotatedJwksKeysQuery = rotatedJwksKeysQuery;
6587
6605
  exports.updateOidcClientFactory = updateOidcClientFactory;
package/oidc/index.esm.js CHANGED
@@ -5281,7 +5281,7 @@ function _ts_generator$2(thisArg, body) {
5281
5281
  * @throws {HttpException} 400 when the consent interaction cannot be completed.
5282
5282
  */ function postConsent(uid, body, res) {
5283
5283
  return _async_to_generator$2(function() {
5284
- var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5284
+ var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, encounteredOIDCScopes, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, encounteredOIDCClaims, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, encounteredResourceScopes, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5285
5285
  return _ts_generator$2(this, function(_state) {
5286
5286
  switch(_state.label){
5287
5287
  case 0:
@@ -5351,9 +5351,15 @@ function _ts_generator$2(thisArg, body) {
5351
5351
  ];
5352
5352
  case 7:
5353
5353
  grant = _state.sent();
5354
+ // Encountered = scopes/claims already granted (or rejected) on the existing Grant. oidc-provider
5355
+ // excludes these from `missingOIDCScope` etc. when the consent prompt is re-shown via `prompt=consent`,
5356
+ // but the consent UI sources its checkbox list from the auth URL's `scope=` param (the full request set)
5357
+ // and re-submits them all. We accept already-encountered values as silent no-ops so a re-consent on a
5358
+ // client the user has previously authorized doesn't fail validation.
5359
+ encounteredOIDCScopes = grant.getOIDCScopeEncountered().split(' ').filter(Boolean);
5354
5360
  missingOIDCScope = (_prompt_details_missingOIDCScope = prompt.details.missingOIDCScope) !== null && _prompt_details_missingOIDCScope !== void 0 ? _prompt_details_missingOIDCScope : [];
5355
5361
  if (missingOIDCScope.length > 0) {
5356
- _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5362
+ _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES, encounteredOIDCScopes), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5357
5363
  if (granted.length > 0) {
5358
5364
  grant.addOIDCScope(granted.join(' '));
5359
5365
  }
@@ -5378,9 +5384,10 @@ function _ts_generator$2(thisArg, body) {
5378
5384
  }
5379
5385
  }
5380
5386
  }
5387
+ encounteredOIDCClaims = grant.getOIDCClaimsEncountered();
5381
5388
  missingOIDCClaims = (_prompt_details_missingOIDCClaims = prompt.details.missingOIDCClaims) !== null && _prompt_details_missingOIDCClaims !== void 0 ? _prompt_details_missingOIDCClaims : [];
5382
5389
  if (missingOIDCClaims.length > 0) {
5383
- _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5390
+ _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims, [], encounteredOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5384
5391
  if (granted1.length > 0) {
5385
5392
  grant.addOIDCClaims(granted1);
5386
5393
  }
@@ -5395,7 +5402,8 @@ function _ts_generator$2(thisArg, body) {
5395
5402
  _step_value = _sliced_to_array(_step1.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5396
5403
  ;
5397
5404
  requestedSubset = (_body_grantedResourceScopes = body.grantedResourceScopes) === null || _body_grantedResourceScopes === void 0 ? void 0 : _body_grantedResourceScopes[indicator];
5398
- _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5405
+ encounteredResourceScopes = grant.getResourceScopeEncountered(indicator).split(' ').filter(Boolean);
5406
+ _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset, [], encounteredResourceScopes), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5399
5407
  if (granted2.length > 0) {
5400
5408
  grant.addResourceScope(indicator, granted2.join(' '));
5401
5409
  }
@@ -5549,24 +5557,29 @@ OidcInteractionController = __decorate([
5549
5557
  ], OidcInteractionController);
5550
5558
  /**
5551
5559
  * Resolves the effective set to grant — and the complementary set to
5552
- * reject — from a missing set, an optional caller-provided subset, and
5553
- * an optional list of always-granted entries.
5560
+ * reject — from a missing set, an optional caller-provided subset, an
5561
+ * optional list of always-granted entries, and an optional list of
5562
+ * already-encountered entries (granted or rejected on the existing Grant).
5554
5563
  *
5555
- * Throws `400 BAD_REQUEST` if the requested subset contains entries that
5556
- * are not in the missing set (no privilege escalation).
5564
+ * Throws `400 BAD_REQUEST` if the requested subset contains an entry that
5565
+ * is in neither the missing set nor the already-encountered set (no
5566
+ * privilege escalation).
5557
5567
  *
5558
5568
  * - When `requestedSubset` is undefined → grants everything in `missing` (back-compat); rejects nothing.
5559
- * - When `requestedSubset` is provided → grants exactly that subset; rejects every other missing entry so
5560
- * oidc-provider does not re-prompt for them.
5569
+ * - When `requestedSubset` is provided → grants the intersection with `missing`; rejects every other missing
5570
+ * entry so oidc-provider does not re-prompt for them. Values in `alreadyEncountered` pass validation but
5571
+ * are not re-applied to the grant (no-op).
5561
5572
  * - Always-granted entries are union'd into `granted` (clamped to `missing`).
5562
5573
  *
5563
5574
  * @param missing - Entries the OIDC prompt indicated were missing for this consent.
5564
- * @param requestedSubset - Optional subset the caller wants to grant; must be a subset of `missing`.
5575
+ * @param requestedSubset - Optional subset the caller wants to grant; each value must be in `missing` or `alreadyEncountered`.
5565
5576
  * @param alwaysGranted - Entries that must be granted whenever they appear in `missing`, regardless of `requestedSubset`.
5577
+ * @param alreadyEncountered - Entries the existing Grant has previously granted or rejected. Tolerated as no-ops on re-consent.
5566
5578
  * @returns `granted` to add to the grant and `rejected` to record on the grant.
5567
5579
  */ function resolveEffectiveSubset(missing, requestedSubset) {
5568
- var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
5580
+ var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [], alreadyEncountered = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [];
5569
5581
  var missingSet = new Set(missing);
5582
+ var encounteredSet = new Set(alreadyEncountered);
5570
5583
  var baseSelection;
5571
5584
  if (requestedSubset === undefined) {
5572
5585
  baseSelection = missing;
@@ -5575,7 +5588,7 @@ OidcInteractionController = __decorate([
5575
5588
  try {
5576
5589
  for(var _iterator = requestedSubset[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5577
5590
  var value = _step.value;
5578
- if (!missingSet.has(value)) {
5591
+ if (!missingSet.has(value) && !encounteredSet.has(value)) {
5579
5592
  throw new HttpException('Granted value "'.concat(value, '" is not in the requested set.'), HttpStatus.BAD_REQUEST);
5580
5593
  }
5581
5594
  }
@@ -5593,7 +5606,11 @@ OidcInteractionController = __decorate([
5593
5606
  }
5594
5607
  }
5595
5608
  }
5596
- baseSelection = requestedSubset;
5609
+ // Filter to `missing` only — already-encountered values pass validation but
5610
+ // do not need to be re-applied (oidc-provider's Grant tracks them already).
5611
+ baseSelection = requestedSubset.filter(function(value) {
5612
+ return missingSet.has(value);
5613
+ });
5597
5614
  }
5598
5615
  var grantedSet = new Set(baseSelection);
5599
5616
  var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
@@ -6529,4 +6546,4 @@ function _unsupported_iterable_to_array(o, minLen) {
6529
6546
  return fn;
6530
6547
  }
6531
6548
 
6532
- export { DEFAULT_APP_OAUTH_CONSENT_PATH_PART, DEFAULT_APP_OAUTH_INTERACTION_PATH, DEFAULT_APP_OAUTH_LOGIN_PATH_PART, DEFAULT_MAX_REQUESTED_LOGIN_DURATION_SECONDS, DEFAULT_MIN_REQUESTED_LOGIN_DURATION_SECONDS, DEFAULT_OIDC_CODE_CHALLENGE_METHODS, DEFAULT_OIDC_ID_TOKEN_SIGNING_ALG_VALUES, DEFAULT_OIDC_ISSUER_PATH, DEFAULT_OIDC_ROUTES, DEFAULT_OIDC_SUBJECT_TYPES, DEFAULT_OIDC_TOKEN_ENDPOINT_AUTH_METHODS, DEFAULT_OIDC_TOKEN_LIFETIMES, DEFAULT_ROTATED_KEY_MAX_AGE, FIREBASE_SERVER_OIDC_ROUTES_FOR_GLOBAL_ROUTE_EXCLUDE, GRANTABLE_MODEL_NAMES, JwksFirestoreCollections, JwksKeyDocument, JwksService, JwksServiceConfig, JwksServiceStorageConfig, OIDC_ENCRYPTED_PAYLOAD_FIELDS, OIDC_JWKS_ENCRYPTION_SECRET_ENV_KEY, OidcAccountService, OidcAccountServiceDelegate, OidcAccountServiceUserContext, OidcAuth, OidcAuthBearerTokenMiddleware, OidcAuthMiddlewareConfig, OidcClientService, OidcEncryptionService, OidcInteractionController, OidcInteractionService, OidcModelServerActions, OidcModuleConfig, OidcProviderConfigService, OidcProviderController, OidcServerFirestoreCollections, OidcService, OidcWellKnownController, activeJwksKeysQuery, appOidcModelModuleMetadata, applyOidcAuthMiddleware, applyOidcCorsMiddleware, createAdapterFactory, createOidcClientFactory, deleteOidcClientFactory, deleteOidcTokenFactory, getOidcScopesFromRequest, jwksKeyCollectionReference, jwksKeyConverter, jwksKeyFirestoreCollection, jwksKeyIdentity, jwksKeysWithStatusQuery, nonRetiredJwksKeysQuery, oidcCallModelScopePreAssert, oidcFirestoreCollectionsFactory, oidcModelServerActions, oidcModelServerActionsFactory, oidcModuleConfigFactory, oidcModuleMetadata, rotateOidcClientSecretFactory, rotatedJwksKeysQuery, updateOidcClientFactory };
6549
+ export { DEFAULT_APP_OAUTH_CONSENT_PATH_PART, DEFAULT_APP_OAUTH_INTERACTION_PATH, DEFAULT_APP_OAUTH_LOGIN_PATH_PART, DEFAULT_MAX_REQUESTED_LOGIN_DURATION_SECONDS, DEFAULT_MIN_REQUESTED_LOGIN_DURATION_SECONDS, DEFAULT_OIDC_CODE_CHALLENGE_METHODS, DEFAULT_OIDC_ID_TOKEN_SIGNING_ALG_VALUES, DEFAULT_OIDC_ISSUER_PATH, DEFAULT_OIDC_ROUTES, DEFAULT_OIDC_SUBJECT_TYPES, DEFAULT_OIDC_TOKEN_ENDPOINT_AUTH_METHODS, DEFAULT_OIDC_TOKEN_LIFETIMES, DEFAULT_ROTATED_KEY_MAX_AGE, FIREBASE_SERVER_OIDC_ROUTES_FOR_GLOBAL_ROUTE_EXCLUDE, GRANTABLE_MODEL_NAMES, JwksFirestoreCollections, JwksKeyDocument, JwksService, JwksServiceConfig, JwksServiceStorageConfig, OIDC_ENCRYPTED_PAYLOAD_FIELDS, OIDC_JWKS_ENCRYPTION_SECRET_ENV_KEY, OidcAccountService, OidcAccountServiceDelegate, OidcAccountServiceUserContext, OidcAuth, OidcAuthBearerTokenMiddleware, OidcAuthMiddlewareConfig, OidcClientService, OidcEncryptionService, OidcInteractionController, OidcInteractionService, OidcModelServerActions, OidcModuleConfig, OidcProviderConfigService, OidcProviderController, OidcServerFirestoreCollections, OidcService, OidcWellKnownController, activeJwksKeysQuery, appOidcModelModuleMetadata, applyOidcAuthMiddleware, applyOidcCorsMiddleware, createAdapterFactory, createOidcClientFactory, deleteOidcClientFactory, deleteOidcTokenFactory, getOidcScopesFromRequest, jwksKeyCollectionReference, jwksKeyConverter, jwksKeyFirestoreCollection, jwksKeyIdentity, jwksKeysWithStatusQuery, nonRetiredJwksKeysQuery, oidcCallModelScopePreAssert, oidcFirestoreCollectionsFactory, oidcModelServerActions, oidcModelServerActionsFactory, oidcModuleConfigFactory, oidcModuleMetadata, resolveEffectiveSubset, rotateOidcClientSecretFactory, rotatedJwksKeysQuery, updateOidcClientFactory };
package/oidc/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/oidc",
3
- "version": "13.11.8",
3
+ "version": "13.11.10",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.8",
6
- "@dereekb/date": "13.11.8",
7
- "@dereekb/firebase": "13.11.8",
8
- "@dereekb/firebase-server": "13.11.8",
9
- "@dereekb/model": "13.11.8",
10
- "@dereekb/nestjs": "13.11.8",
11
- "@dereekb/rxjs": "13.11.8",
12
- "@dereekb/util": "13.11.8",
13
- "@dereekb/zoho": "13.11.8",
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",
14
14
  "@nestjs/common": "^11.1.19",
15
15
  "@nestjs/config": "^4.0.4",
16
16
  "express": "^5.2.1",
@@ -66,3 +66,29 @@ export declare class OidcInteractionController {
66
66
  */
67
67
  private _verifyIdToken;
68
68
  }
69
+ /**
70
+ * Resolves the effective set to grant — and the complementary set to
71
+ * reject — from a missing set, an optional caller-provided subset, an
72
+ * optional list of always-granted entries, and an optional list of
73
+ * already-encountered entries (granted or rejected on the existing Grant).
74
+ *
75
+ * Throws `400 BAD_REQUEST` if the requested subset contains an entry that
76
+ * is in neither the missing set nor the already-encountered set (no
77
+ * privilege escalation).
78
+ *
79
+ * - When `requestedSubset` is undefined → grants everything in `missing` (back-compat); rejects nothing.
80
+ * - When `requestedSubset` is provided → grants the intersection with `missing`; rejects every other missing
81
+ * entry so oidc-provider does not re-prompt for them. Values in `alreadyEncountered` pass validation but
82
+ * are not re-applied to the grant (no-op).
83
+ * - Always-granted entries are union'd into `granted` (clamped to `missing`).
84
+ *
85
+ * @param missing - Entries the OIDC prompt indicated were missing for this consent.
86
+ * @param requestedSubset - Optional subset the caller wants to grant; each value must be in `missing` or `alreadyEncountered`.
87
+ * @param alwaysGranted - Entries that must be granted whenever they appear in `missing`, regardless of `requestedSubset`.
88
+ * @param alreadyEncountered - Entries the existing Grant has previously granted or rejected. Tolerated as no-ops on re-consent.
89
+ * @returns `granted` to add to the grant and `rejected` to record on the grant.
90
+ */
91
+ export declare function resolveEffectiveSubset(missing: readonly string[], requestedSubset: readonly string[] | undefined, alwaysGranted?: readonly string[], alreadyEncountered?: readonly string[]): {
92
+ granted: string[];
93
+ rejected: string[];
94
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server",
3
- "version": "13.11.8",
3
+ "version": "13.11.10",
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.8",
48
- "@dereekb/date": "13.11.8",
49
- "@dereekb/dbx-core": "13.11.8",
50
- "@dereekb/firebase": "13.11.8",
51
- "@dereekb/model": "13.11.8",
52
- "@dereekb/nestjs": "13.11.8",
53
- "@dereekb/rxjs": "13.11.8",
54
- "@dereekb/util": "13.11.8",
55
- "@dereekb/zoho": "13.11.8",
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",
56
56
  "@google-cloud/firestore": "^7.11.6",
57
57
  "@google-cloud/storage": "^7.19.0",
58
58
  "@nestjs/common": "^11.1.19",
@@ -14,7 +14,11 @@ export interface AuthDataRef<T extends AuthData = AuthData> {
14
14
  * Converts a Firebase Admin {@link admin.auth.DecodedIdToken} into a normalized {@link FirebaseAuthToken}.
15
15
  *
16
16
  * Maps Firebase Admin token fields (snake_case) to the application's token interface (camelCase),
17
- * including email, phone, and sign-in timestamps.
17
+ * including email, phone, and sign-in timestamps. `auth_time`/`iat` are Unix seconds per the
18
+ * Firebase Admin types, so they are converted to milliseconds before being formatted. Missing
19
+ * or non-finite values map to `undefined` (the {@link FirebaseAuthToken} fields are optional) —
20
+ * synthetic tokens built from OIDC bearer auth do not always carry those claims, and we must
21
+ * not throw `RangeError("Invalid time value")` from this path.
18
22
  *
19
23
  * @param token - The decoded ID token from Firebase Admin Auth.
20
24
  * @returns A normalized {@link FirebaseAuthToken} with camelCase fields.
@@ -65,6 +65,9 @@ export declare class ModelApiGetService {
65
65
  * Builds an {@link AuthDataRef} compatible with `useModel()` from the HTTP request auth.
66
66
  *
67
67
  * Uses the same synthetic auth pattern as {@link ModelApiDispatchService.dispatch}.
68
+ * The OIDC-validated claim subset is layered over the base token so the synthetic
69
+ * `auth.token` keeps standard JWT claims (`iat`, `auth_time`, `email`, …) that
70
+ * downstream consumers like `authContextInfo` rely on.
68
71
  *
69
72
  * @param auth - The Firebase server auth data from the HTTP request, or undefined for unauthenticated requests.
70
73
  * @returns An object containing a synthetic {@link AuthData} for use with `useModel()`, or undefined auth.
package/test/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/test",
3
- "version": "13.11.8",
3
+ "version": "13.11.10",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.8",
6
- "@dereekb/date": "13.11.8",
7
- "@dereekb/firebase": "13.11.8",
8
- "@dereekb/firebase-server": "13.11.8",
9
- "@dereekb/firebase-server/oidc": "13.11.8",
10
- "@dereekb/model": "13.11.8",
11
- "@dereekb/nestjs": "13.11.8",
12
- "@dereekb/rxjs": "13.11.8",
13
- "@dereekb/util": "13.11.8",
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",
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.8"
26
+ "@dereekb/nestjs": "13.11.10"
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.8",
3
+ "version": "13.11.10",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.8",
6
- "@dereekb/date": "13.11.8",
7
- "@dereekb/model": "13.11.8",
8
- "@dereekb/nestjs": "13.11.8",
9
- "@dereekb/rxjs": "13.11.8",
10
- "@dereekb/firebase": "13.11.8",
11
- "@dereekb/util": "13.11.8",
12
- "@dereekb/zoho": "13.11.8"
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"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",