@rpcbase/db 0.136.0 → 0.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/ensureMongooseConnection.d.ts.map +1 -1
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +144 -8
  5. package/dist/index.js.map +1 -1
  6. package/dist/migrations/20260814090000-baseline-global.d.ts +3 -0
  7. package/dist/migrations/20260814090000-baseline-global.d.ts.map +1 -0
  8. package/dist/migrations/20260814090100-baseline-tenant.d.ts +3 -0
  9. package/dist/migrations/20260814090100-baseline-tenant.d.ts.map +1 -0
  10. package/dist/migrations/currentResources.d.ts +2 -0
  11. package/dist/migrations/currentResources.d.ts.map +1 -0
  12. package/dist/migrations/index.d.ts +5 -0
  13. package/dist/migrations/index.d.ts.map +1 -0
  14. package/dist/migrations/index.js +479 -0
  15. package/dist/migrations/index.js.map +1 -0
  16. package/dist/migrations/resources.d.ts +2 -0
  17. package/dist/migrations/resources.d.ts.map +1 -0
  18. package/dist/migrations/rtsChanges.d.ts +2 -0
  19. package/dist/migrations/rtsChanges.d.ts.map +1 -0
  20. package/dist/models/RBRtsChange.d.ts.map +1 -1
  21. package/dist/models/RBTenant.d.ts +8 -0
  22. package/dist/models/RBTenant.d.ts.map +1 -1
  23. package/dist/models/RBTenantSubscriptionEvent.d.ts +11 -11
  24. package/dist/models/RBTenantSubscriptionProjection.d.ts +1 -1
  25. package/dist/modelsApi.d.ts.map +1 -1
  26. package/dist/mongoResources.d.ts +7 -0
  27. package/dist/mongoResources.d.ts.map +1 -0
  28. package/dist/registerModels.d.ts +6 -1
  29. package/dist/registerModels.d.ts.map +1 -1
  30. package/dist/rtsChanges-xIGFCLGa.js +7 -0
  31. package/dist/rtsChanges-xIGFCLGa.js.map +1 -0
  32. package/dist/tenantProvisioning.d.ts +15 -0
  33. package/dist/tenantProvisioning.d.ts.map +1 -0
  34. package/package.json +9 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ensureMongooseConnection.d.ts","sourceRoot":"","sources":["../src/ensureMongooseConnection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAwB/B,eAAO,MAAM,wBAAwB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CA+B1F,CAAA"}
1
+ {"version":3,"file":"ensureMongooseConnection.d.ts","sourceRoot":"","sources":["../src/ensureMongooseConnection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAwB/B,eAAO,MAAM,wBAAwB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAkC1F,CAAA"}
package/dist/index.d.ts CHANGED
@@ -10,4 +10,7 @@ export * from './billingStorage';
10
10
  export * from './modelsApi';
11
11
  export * from './tenantFilesystemDb';
12
12
  export * from './transactions';
13
+ export * from './mongoResources';
14
+ export * from './tenantProvisioning';
15
+ export { getFrameworkModelSchemas, getRegisteredModels } from './registerModels';
13
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,OAAO,CAAA;AAErB,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,OAAO,CAAA;AAErB,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { buildAbility, buildAbilityFromSession, can, getAccessibleByQuery, getRegisteredPolicies, getTenantRolesFromSessionUser, hasRegisteredPolicy, registerPoliciesFromModules, registerPolicy } from "./acl/index.js";
2
+ import { t as rtsChangesTtlSeconds } from "./rtsChanges-xIGFCLGa.js";
2
3
  import { a as makeZE164Phone, c as buildLocaleFallbackChain, d as zI18nString, f as zLocalizedString, i as E164_PHONE_REGEX, l as resolveLocalizedString, n as extendZod, o as zE164Phone, r as E164_PHONE_OR_EMPTY_REGEX, s as LANGUAGE_CODE_REGEX, t as z, u as withLocalizedStringFallback } from "./zod-DSnhyNso.js";
3
4
  import "./model.js";
4
5
  import { getMongoDirectConnection, getMongoUrl } from "./mongo.js";
@@ -10,6 +11,7 @@ import { SUBSCRIPTION_CHANGE_DIRECTIONS, SUBSCRIPTION_EVENT_TYPES, SUBSCRIPTION_
10
11
  import { createHmac, timingSafeEqual } from "node:crypto";
11
12
  import assert from "assert";
12
13
  import { AsyncLocalStorage } from "node:async_hooks";
14
+ import { defineMongoResources } from "@rpcbase/migrations";
13
15
  //#region \0rolldown/runtime.js
14
16
  var __defProp = Object.defineProperty;
15
17
  var __exportAll = (all, no_symbols) => {
@@ -163,7 +165,15 @@ var RBUserSchema = new Schema$1({
163
165
  var ZRBTenant = z$1.object({
164
166
  tenantId: z$1.string(),
165
167
  parentTenantId: z$1.string().optional(),
166
- name: z$1.string().optional()
168
+ name: z$1.string().optional(),
169
+ provisioningStatus: z$1.enum([
170
+ "initializing",
171
+ "active",
172
+ "failed"
173
+ ]).optional(),
174
+ provisioningError: z$1.string().optional(),
175
+ provisioningStartedAt: z$1.date().optional(),
176
+ provisionedAt: z$1.date().optional()
167
177
  });
168
178
  var RBTenantSchema = new Schema$1({
169
179
  tenantId: {
@@ -173,7 +183,18 @@ var RBTenantSchema = new Schema$1({
173
183
  index: true
174
184
  },
175
185
  parentTenantId: { type: String },
176
- name: { type: String }
186
+ name: { type: String },
187
+ provisioningStatus: {
188
+ type: String,
189
+ enum: [
190
+ "initializing",
191
+ "active",
192
+ "failed"
193
+ ]
194
+ },
195
+ provisioningError: { type: String },
196
+ provisioningStartedAt: { type: Date },
197
+ provisionedAt: { type: Date }
177
198
  });
178
199
  //#endregion
179
200
  //#region src/models/RBTenantSubscriptionEvent.ts
@@ -563,8 +584,6 @@ var RBRtsCounterSchema = new Schema$1({
563
584
  }, { versionKey: false });
564
585
  //#endregion
565
586
  //#region src/models/RBRtsChange.ts
566
- var ttlSecondsRaw = process.env.RB_RTS_CHANGES_TTL_S ?? "";
567
- var ttlSeconds = Number.isFinite(Number(ttlSecondsRaw)) ? Math.max(60, Math.floor(Number(ttlSecondsRaw))) : 3600 * 24 * 30;
568
587
  var ZRBRtsChangeOp = z$1.enum(["delete", "reset_model"]);
569
588
  var ZRBRtsChange = z$1.object({
570
589
  seq: z$1.number().int().min(0),
@@ -599,7 +618,7 @@ var RBRtsChangeSchema = new Schema$1({
599
618
  }
600
619
  }, { versionKey: false });
601
620
  RBRtsChangeSchema.index({ seq: 1 }, { unique: true });
602
- RBRtsChangeSchema.index({ ts: 1 }, { expireAfterSeconds: ttlSeconds });
621
+ RBRtsChangeSchema.index({ ts: 1 }, { expireAfterSeconds: rtsChangesTtlSeconds });
603
622
  //#endregion
604
623
  //#region src/models/RBUploadSession.ts
605
624
  var ZRBUploadSessionStatus = z$1.enum([
@@ -2234,10 +2253,13 @@ var ensureMongooseConnection = async (dbName) => {
2234
2253
  }
2235
2254
  if (!rootConnection) {
2236
2255
  const mongoUrl = getMongoUrl();
2256
+ const manageResourcesWithMigrations = process.env.NODE_ENV === "production";
2237
2257
  rootConnection = mongoose$1.createConnection(mongoUrl, {
2238
2258
  sanitizeFilter: true,
2239
2259
  dbName: normalizedDbName,
2240
- directConnection: getMongoDirectConnection()
2260
+ directConnection: getMongoDirectConnection(),
2261
+ autoCreate: !manageResourcesWithMigrations,
2262
+ autoIndex: !manageResourcesWithMigrations
2241
2263
  });
2242
2264
  }
2243
2265
  await waitForOpen(rootConnection);
@@ -2451,6 +2473,22 @@ var buildSchemasFromModules = (modules) => Object.entries(modules).filter(([key]
2451
2473
  schema
2452
2474
  };
2453
2475
  });
2476
+ var getFrameworkModelSchemas = () => {
2477
+ const tenant = {};
2478
+ const global = {};
2479
+ for (const { modelName, schema } of buildSchemasFromModules(models_exports)) {
2480
+ const cloned = schema.clone();
2481
+ if (DEFAULT_GLOBAL_RB_MODEL_NAMES_SET.has(modelName)) registerSchema(global, tenant, modelName, cloned, "global");
2482
+ else {
2483
+ applyTenantPlugins(cloned);
2484
+ registerSchema(tenant, global, modelName, cloned, "tenant");
2485
+ }
2486
+ }
2487
+ return {
2488
+ tenant,
2489
+ global
2490
+ };
2491
+ };
2454
2492
  var registerModels = ({ tenant, global }, options = {}) => {
2455
2493
  installMongooseAclDriver();
2456
2494
  registerPoliciesFromModules(models_exports);
@@ -2884,7 +2922,12 @@ var loadModelFromDb = async (modelName, dbName, scope) => {
2884
2922
  assert(schema, `Model ${modelName} not registered. Available models: ${Object.keys(schemas).join(", ")}`);
2885
2923
  const modelConnection = await ensureMongooseConnection(dbName);
2886
2924
  if (!modelConnection.models[modelName]) await runWithUnsafeMongooseAclDriver(async () => {
2887
- await modelConnection.model(modelName, schema).init();
2925
+ if (process.env.NODE_ENV === "production") {
2926
+ schema.set("autoCreate", false);
2927
+ schema.set("autoIndex", false);
2928
+ }
2929
+ const model = modelConnection.model(modelName, schema);
2930
+ if (process.env.NODE_ENV !== "production") await model.init();
2888
2931
  });
2889
2932
  return modelConnection.models[modelName];
2890
2933
  };
@@ -3091,6 +3134,99 @@ var createTenantBillingStorage = (params) => {
3091
3134
  };
3092
3135
  };
3093
3136
  //#endregion
3094
- export { E164_PHONE_OR_EMPTY_REGEX, E164_PHONE_REGEX, LANGUAGE_CODE_REGEX, PaginationValidationError, RBNotificationDeliveryPolicy, RBNotificationDeliverySchema, RBNotificationPolicy, RBNotificationSchema, RBNotificationSettingsPolicy, RBNotificationSettingsSchema, RBOAuthRequestSchema, RBRtsChangeSchema, RBRtsCounterSchema, RBTenantSchema, RBTenantSubscriptionEventSchema, RBTenantSubscriptionProjectionSchema, RBUploadChunkSchema, RBUploadSessionPolicy, RBUploadSessionSchema, RBUserSchema, Schema, ZRBNotification, ZRBNotificationDelivery, ZRBNotificationDigestFrequency, ZRBNotificationPlatformPayload, ZRBNotificationSettings, ZRBNotificationTopicPreference, ZRBOAuthRequest, ZRBRtsChange, ZRBRtsChangeOp, ZRBRtsCounter, ZRBTenant, ZRBTenantSubscriptionChangeDirection, ZRBTenantSubscriptionEvent, ZRBTenantSubscriptionEventSource, ZRBTenantSubscriptionEventType, ZRBTenantSubscriptionIntervalUnit, ZRBTenantSubscriptionProjection, ZRBTenantSubscriptionScope, ZRBTenantSubscriptionStatus, ZRBTenantSubscriptionType, ZRBUploadAccessScope, ZRBUploadChunk, ZRBUploadDeduplication, ZRBUploadSession, ZRBUploadSessionStatus, ZRBUser, buildAbility, buildAbilityFromSession, buildLocaleFallbackChain, buildSearchTextStage, can, createModels, createTenantBillingStorage, ensureSearchIndex, extendMongooseSchema, extendZod, getAccessibleByQuery, getRegisteredPolicies, getTenantFilesystemDb, getTenantFilesystemDbFromCtx, getTenantFilesystemDbName, getTenantIdFromLoadModelCtx, getTenantRolesFromSessionUser, hasRegisteredPolicy, isPaginationValidationError, localizedStringField, makeZE164Phone, model, models, mongoPaginationPlugin, mongoose, omitMongooseSchemaPaths, registerPoliciesFromModules, registerPolicy, resolveLocalizedString, searchMetaProjection, withLocalizedStringFallback, withTransaction, z, zE164Phone, zI18nString, zLocalizedString };
3137
+ //#region src/mongoResources.ts
3138
+ var collectionNameForModel = (modelName, schema) => {
3139
+ const configured = schema.options.collection?.trim();
3140
+ if (configured) return configured;
3141
+ const pluralize = mongoose$1.pluralize();
3142
+ return pluralize ? pluralize(modelName) : modelName;
3143
+ };
3144
+ var generatedIndexName = (key) => Object.entries(key).map(([path, direction]) => `${path}_${String(direction)}`).join("_");
3145
+ var observableIndexOptions = /* @__PURE__ */ new Set([
3146
+ "2dsphereIndexVersion",
3147
+ "bits",
3148
+ "bucketSize",
3149
+ "collation",
3150
+ "default_language",
3151
+ "expireAfterSeconds",
3152
+ "hidden",
3153
+ "language_override",
3154
+ "max",
3155
+ "min",
3156
+ "partialFilterExpression",
3157
+ "sparse",
3158
+ "storageEngine",
3159
+ "textIndexVersion",
3160
+ "unique",
3161
+ "weights",
3162
+ "wildcardProjection"
3163
+ ]);
3164
+ var extractMongoResourcesFromSchemas = (options) => {
3165
+ const schemas = Object.entries(options.schemas).filter((entry) => entry[1] instanceof mongoose$1.Schema).map(([exportName, schema]) => [exportName.replace(/Schema$/, ""), schema]);
3166
+ const collections = schemas.map(([modelName, schema]) => ({
3167
+ scope: options.scope,
3168
+ name: collectionNameForModel(modelName, schema)
3169
+ }));
3170
+ const indexes = [];
3171
+ for (const [modelName, schema] of schemas) {
3172
+ const collection = collectionNameForModel(modelName, schema);
3173
+ for (const [key, indexOptions] of schema.indexes()) {
3174
+ const documentKey = key;
3175
+ const name = typeof indexOptions.name === "string" && indexOptions.name.trim() ? indexOptions.name.trim() : generatedIndexName(documentKey);
3176
+ const normalizedOptions = Object.fromEntries(Object.entries(indexOptions).filter(([option, value]) => observableIndexOptions.has(option) && value !== void 0));
3177
+ indexes.push({
3178
+ scope: options.scope,
3179
+ collection,
3180
+ name,
3181
+ key: documentKey,
3182
+ ...Object.keys(normalizedOptions).length > 0 ? { options: normalizedOptions } : {}
3183
+ });
3184
+ }
3185
+ }
3186
+ return defineMongoResources({
3187
+ collections,
3188
+ indexes
3189
+ });
3190
+ };
3191
+ //#endregion
3192
+ //#region src/tenantProvisioning.ts
3193
+ var tenantProvisioner;
3194
+ var configureTenantMigrationProvisioner = (provisioner) => {
3195
+ tenantProvisioner = provisioner;
3196
+ return () => {
3197
+ if (tenantProvisioner === provisioner) tenantProvisioner = void 0;
3198
+ };
3199
+ };
3200
+ var errorMessage = (error) => (error instanceof Error ? error.message : String(error)).slice(0, 8e3);
3201
+ var createProvisionedTenant = async (Tenant, tenant) => {
3202
+ await Tenant.create({
3203
+ ...tenant,
3204
+ provisioningStatus: "initializing",
3205
+ provisioningStartedAt: /* @__PURE__ */ new Date()
3206
+ });
3207
+ try {
3208
+ if (tenantProvisioner) await tenantProvisioner(tenant.tenantId);
3209
+ else if (process.env.NODE_ENV === "production") throw new Error("No tenant migration provisioner is configured");
3210
+ const activation = await Tenant.updateOne({
3211
+ tenantId: tenant.tenantId,
3212
+ provisioningStatus: "initializing"
3213
+ }, {
3214
+ $set: {
3215
+ provisioningStatus: "active",
3216
+ provisionedAt: /* @__PURE__ */ new Date()
3217
+ },
3218
+ $unset: { provisioningError: "" }
3219
+ });
3220
+ if (activation.matchedCount !== void 0 && activation.matchedCount !== 1) throw new Error(`Tenant ${tenant.tenantId} provisioning state changed before activation`);
3221
+ } catch (error) {
3222
+ await Tenant.updateOne({ tenantId: tenant.tenantId }, { $set: {
3223
+ provisioningStatus: "failed",
3224
+ provisioningError: errorMessage(error)
3225
+ } });
3226
+ throw error;
3227
+ }
3228
+ };
3229
+ //#endregion
3230
+ export { E164_PHONE_OR_EMPTY_REGEX, E164_PHONE_REGEX, LANGUAGE_CODE_REGEX, PaginationValidationError, RBNotificationDeliveryPolicy, RBNotificationDeliverySchema, RBNotificationPolicy, RBNotificationSchema, RBNotificationSettingsPolicy, RBNotificationSettingsSchema, RBOAuthRequestSchema, RBRtsChangeSchema, RBRtsCounterSchema, RBTenantSchema, RBTenantSubscriptionEventSchema, RBTenantSubscriptionProjectionSchema, RBUploadChunkSchema, RBUploadSessionPolicy, RBUploadSessionSchema, RBUserSchema, Schema, ZRBNotification, ZRBNotificationDelivery, ZRBNotificationDigestFrequency, ZRBNotificationPlatformPayload, ZRBNotificationSettings, ZRBNotificationTopicPreference, ZRBOAuthRequest, ZRBRtsChange, ZRBRtsChangeOp, ZRBRtsCounter, ZRBTenant, ZRBTenantSubscriptionChangeDirection, ZRBTenantSubscriptionEvent, ZRBTenantSubscriptionEventSource, ZRBTenantSubscriptionEventType, ZRBTenantSubscriptionIntervalUnit, ZRBTenantSubscriptionProjection, ZRBTenantSubscriptionScope, ZRBTenantSubscriptionStatus, ZRBTenantSubscriptionType, ZRBUploadAccessScope, ZRBUploadChunk, ZRBUploadDeduplication, ZRBUploadSession, ZRBUploadSessionStatus, ZRBUser, buildAbility, buildAbilityFromSession, buildLocaleFallbackChain, buildSearchTextStage, can, configureTenantMigrationProvisioner, createModels, createProvisionedTenant, createTenantBillingStorage, ensureSearchIndex, extendMongooseSchema, extendZod, extractMongoResourcesFromSchemas, getAccessibleByQuery, getFrameworkModelSchemas, getRegisteredModels, getRegisteredPolicies, getTenantFilesystemDb, getTenantFilesystemDbFromCtx, getTenantFilesystemDbName, getTenantIdFromLoadModelCtx, getTenantRolesFromSessionUser, hasRegisteredPolicy, isPaginationValidationError, localizedStringField, makeZE164Phone, model, models, mongoPaginationPlugin, mongoose, omitMongooseSchemaPaths, registerPoliciesFromModules, registerPolicy, resolveLocalizedString, searchMetaProjection, withLocalizedStringFallback, withTransaction, z, zE164Phone, zI18nString, zLocalizedString };
3095
3231
 
3096
3232
  //# sourceMappingURL=index.js.map