@rpcbase/db 0.137.0 → 0.139.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.
- package/dist/ensureMongooseConnection.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -8
- package/dist/index.js.map +1 -1
- package/dist/migrations/20260814090000-baseline-global.d.ts +3 -0
- package/dist/migrations/20260814090000-baseline-global.d.ts.map +1 -0
- package/dist/migrations/20260814090100-baseline-tenant.d.ts +3 -0
- package/dist/migrations/20260814090100-baseline-tenant.d.ts.map +1 -0
- package/dist/migrations/20260816090000-runtime-rts-retention.d.ts +3 -0
- package/dist/migrations/20260816090000-runtime-rts-retention.d.ts.map +1 -0
- package/dist/migrations/baselineResources.d.ts +2 -0
- package/dist/migrations/baselineResources.d.ts.map +1 -0
- package/dist/migrations/currentResources.d.ts +2 -0
- package/dist/migrations/currentResources.d.ts.map +1 -0
- package/dist/migrations/index.d.ts +5 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +543 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/resources.d.ts +2 -0
- package/dist/migrations/resources.d.ts.map +1 -0
- package/dist/migrations/rtsChanges.d.ts +2 -0
- package/dist/migrations/rtsChanges.d.ts.map +1 -0
- package/dist/migrations/runtimeRtsRetentionResources.d.ts +2 -0
- package/dist/migrations/runtimeRtsRetentionResources.d.ts.map +1 -0
- package/dist/models/RBRtsChange.d.ts.map +1 -1
- package/dist/models/RBTenant.d.ts +8 -0
- package/dist/models/RBTenant.d.ts.map +1 -1
- package/dist/models/RBTenantSubscriptionEvent.d.ts +11 -11
- package/dist/models/RBTenantSubscriptionProjection.d.ts +1 -1
- package/dist/modelsApi.d.ts.map +1 -1
- package/dist/mongoResources.d.ts +7 -0
- package/dist/mongoResources.d.ts.map +1 -0
- package/dist/registerModels.d.ts +6 -1
- package/dist/registerModels.d.ts.map +1 -1
- package/dist/rtsChanges-xIGFCLGa.js +7 -0
- package/dist/rtsChanges-xIGFCLGa.js.map +1 -0
- package/dist/tenantProvisioning.d.ts +18 -0
- package/dist/tenantProvisioning.d.ts.map +1 -0
- package/package.json +13 -3
|
@@ -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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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,101 @@ var createTenantBillingStorage = (params) => {
|
|
|
3091
3134
|
};
|
|
3092
3135
|
};
|
|
3093
3136
|
//#endregion
|
|
3094
|
-
|
|
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) {
|
|
3221
|
+
if ((await Tenant.findOne?.({ tenantId: tenant.tenantId }))?.provisioningStatus !== "active") throw new Error(`Tenant ${tenant.tenantId} provisioning state changed before activation`);
|
|
3222
|
+
}
|
|
3223
|
+
} catch (error) {
|
|
3224
|
+
await Tenant.updateOne({ tenantId: tenant.tenantId }, { $set: {
|
|
3225
|
+
provisioningStatus: "failed",
|
|
3226
|
+
provisioningError: errorMessage(error)
|
|
3227
|
+
} });
|
|
3228
|
+
throw error;
|
|
3229
|
+
}
|
|
3230
|
+
};
|
|
3231
|
+
//#endregion
|
|
3232
|
+
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
3233
|
|
|
3096
3234
|
//# sourceMappingURL=index.js.map
|