bruce-models 2.0.9 → 2.1.1
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/bruce-models.es5.js +96 -206
- package/dist/bruce-models.es5.js.map +1 -1
- package/dist/bruce-models.umd.js +95 -205
- package/dist/bruce-models.umd.js.map +1 -1
- package/dist/lib/common/cache.js +66 -187
- package/dist/lib/common/cache.js.map +1 -1
- package/dist/lib/entity/entity.js +15 -5
- package/dist/lib/entity/entity.js.map +1 -1
- package/dist/types/common/cache.d.ts +0 -2
- package/dist/types/entity/entity.d.ts +2 -1
- package/package.json +1 -1
package/dist/bruce-models.umd.js
CHANGED
|
@@ -3140,259 +3140,125 @@
|
|
|
3140
3140
|
});
|
|
3141
3141
|
});
|
|
3142
3142
|
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
* Generates a Bruce compatible UID.
|
|
3146
|
-
* @returns
|
|
3147
|
-
*/
|
|
3148
|
-
function UId() {
|
|
3149
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
|
|
3150
|
-
const r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8);
|
|
3151
|
-
return v.toString(16);
|
|
3152
|
-
});
|
|
3153
|
-
}
|
|
3154
|
-
ObjectUtils.UId = UId;
|
|
3155
|
-
})(exports.ObjectUtils || (exports.ObjectUtils = {}));
|
|
3156
|
-
|
|
3157
|
-
class CacheDictionary {
|
|
3143
|
+
const CACHE_VERSION_PREFIX = "v2_";
|
|
3144
|
+
class CacheUtil {
|
|
3158
3145
|
constructor(id) {
|
|
3159
|
-
this.memory = Object.create(null);
|
|
3160
|
-
if (!id) {
|
|
3161
|
-
id = "BRUCE_UI_MODELS_CACHE_DICT_" + exports.ObjectUtils.UId();
|
|
3162
|
-
}
|
|
3163
|
-
this.id = id;
|
|
3164
3146
|
this.store = localforage.createInstance({
|
|
3165
|
-
name: id
|
|
3147
|
+
name: CACHE_VERSION_PREFIX + id,
|
|
3166
3148
|
});
|
|
3149
|
+
this.inMemoryPromises = {};
|
|
3150
|
+
this.keyVersions = {};
|
|
3167
3151
|
}
|
|
3168
|
-
|
|
3169
|
-
return this.id;
|
|
3170
|
-
}
|
|
3171
|
-
GetItems() {
|
|
3152
|
+
Set(key, value, duration = 300000) {
|
|
3172
3153
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3173
|
-
if (
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
// We can clean this every first time we load.
|
|
3181
|
-
const now = new Date().getTime();
|
|
3182
|
-
for (const item of raw) {
|
|
3183
|
-
if (item.duration > -1 && (now - item.created) / 1000 > item.duration) {
|
|
3184
|
-
if (item.inMemory) {
|
|
3185
|
-
this.memory[item.key] = null;
|
|
3186
|
-
delete this.memory[item.key];
|
|
3187
|
-
}
|
|
3188
|
-
else {
|
|
3189
|
-
yield this.store.removeItem(item.key);
|
|
3190
|
-
}
|
|
3191
|
-
}
|
|
3154
|
+
if (value instanceof Promise) {
|
|
3155
|
+
this.inMemoryPromises[key] = value;
|
|
3156
|
+
const currentVersion = (this.keyVersions[key] = (this.keyVersions[key] || 0) + 1);
|
|
3157
|
+
value
|
|
3158
|
+
.then((resolvedValue) => {
|
|
3159
|
+
if (this.keyVersions[key] === currentVersion) {
|
|
3160
|
+
this.Set(key, resolvedValue, duration);
|
|
3192
3161
|
}
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3197
|
-
});
|
|
3198
|
-
}
|
|
3199
|
-
GetKeys() {
|
|
3200
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3201
|
-
return (yield this.GetItems()).map(x => "" + x.key);
|
|
3202
|
-
});
|
|
3203
|
-
}
|
|
3204
|
-
Set(key, value, duration) {
|
|
3205
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3206
|
-
key = "" + key;
|
|
3207
|
-
const items = yield this.GetItems();
|
|
3208
|
-
const itemIndex = items.findIndex(x => x.key == key);
|
|
3209
|
-
if (itemIndex > -1) {
|
|
3210
|
-
const item = items[itemIndex];
|
|
3211
|
-
if (item.inMemory) {
|
|
3212
|
-
this.memory[item.key] = null;
|
|
3213
|
-
delete this.memory[item.key];
|
|
3214
|
-
}
|
|
3215
|
-
else {
|
|
3216
|
-
yield this.store.removeItem(item.key);
|
|
3217
|
-
}
|
|
3218
|
-
items.splice(itemIndex, 1);
|
|
3219
|
-
}
|
|
3220
|
-
const item = {
|
|
3221
|
-
key: key,
|
|
3222
|
-
duration: duration,
|
|
3223
|
-
created: new Date().getTime(),
|
|
3224
|
-
inMemory: false
|
|
3225
|
-
};
|
|
3226
|
-
// Short duration, keep in memory.
|
|
3227
|
-
if (duration < 60) {
|
|
3228
|
-
item.inMemory = true;
|
|
3229
|
-
this.memory[item.key] = value;
|
|
3230
|
-
}
|
|
3231
|
-
// Let's resolve and store the value in local-storage.
|
|
3232
|
-
// If resolution crashes then we'll keep retaining that in memory.
|
|
3233
|
-
else if (value instanceof Promise) {
|
|
3234
|
-
value.then((x) => __awaiter(this, void 0, void 0, function* () {
|
|
3235
|
-
try {
|
|
3236
|
-
const items = yield this.GetItems();
|
|
3237
|
-
const item = items.find(x => x.key == key);
|
|
3238
|
-
if (!item) {
|
|
3239
|
-
console.log("Item was removed from cache before promise resolved.", key, items);
|
|
3240
|
-
return;
|
|
3241
|
-
}
|
|
3242
|
-
try {
|
|
3243
|
-
yield this.store.setItem(item.key, x);
|
|
3244
|
-
item.inMemory = false;
|
|
3245
|
-
this.memory[item.key] = null;
|
|
3246
|
-
delete this.memory[item.key];
|
|
3247
|
-
yield this.store.setItem(this.id, items);
|
|
3248
|
-
}
|
|
3249
|
-
catch (e) {
|
|
3250
|
-
console.warn(e);
|
|
3251
|
-
}
|
|
3252
|
-
}
|
|
3253
|
-
catch (e) {
|
|
3254
|
-
console.warn(e);
|
|
3162
|
+
})
|
|
3163
|
+
.catch((error) => {
|
|
3164
|
+
if (this.keyVersions[key] === currentVersion) {
|
|
3165
|
+
this.Set(key, error, duration);
|
|
3255
3166
|
}
|
|
3256
|
-
})
|
|
3257
|
-
|
|
3258
|
-
|
|
3167
|
+
})
|
|
3168
|
+
.finally(() => {
|
|
3169
|
+
delete this.inMemoryPromises[key];
|
|
3170
|
+
});
|
|
3259
3171
|
}
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
this.memory[item.key] = value;
|
|
3267
|
-
console.warn(e);
|
|
3268
|
-
}
|
|
3172
|
+
else {
|
|
3173
|
+
const item = {
|
|
3174
|
+
value,
|
|
3175
|
+
expiry: Date.now() + duration,
|
|
3176
|
+
};
|
|
3177
|
+
yield this.store.setItem(key, item);
|
|
3269
3178
|
}
|
|
3270
|
-
items.push(item);
|
|
3271
|
-
yield this.store.setItem(this.id, items);
|
|
3272
|
-
this.items = items;
|
|
3273
3179
|
});
|
|
3274
3180
|
}
|
|
3275
|
-
|
|
3181
|
+
Get(key) {
|
|
3276
3182
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3277
|
-
key
|
|
3278
|
-
|
|
3279
|
-
const index = items.findIndex(x => x.key == key);
|
|
3280
|
-
if (index >= 0) {
|
|
3281
|
-
const item = items[index];
|
|
3282
|
-
if (item.inMemory) {
|
|
3283
|
-
this.memory[item.key] = null;
|
|
3284
|
-
delete this.memory[item.key];
|
|
3285
|
-
}
|
|
3286
|
-
else {
|
|
3287
|
-
this.store.removeItem(item.key);
|
|
3288
|
-
}
|
|
3289
|
-
items.splice(index, 1);
|
|
3290
|
-
this.store.setItem(this.id, items);
|
|
3183
|
+
if (this.inMemoryPromises[key]) {
|
|
3184
|
+
return this.inMemoryPromises[key];
|
|
3291
3185
|
}
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
Clear() {
|
|
3296
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3297
|
-
const items = yield this.GetItems();
|
|
3298
|
-
for (const item of items) {
|
|
3299
|
-
if (item.inMemory) {
|
|
3300
|
-
this.store.removeItem(item.key);
|
|
3301
|
-
}
|
|
3186
|
+
const item = (yield this.store.getItem(key));
|
|
3187
|
+
if (!item) {
|
|
3188
|
+
return null;
|
|
3302
3189
|
}
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3190
|
+
if (Date.now() > item.expiry) {
|
|
3191
|
+
yield this.store.removeItem(key);
|
|
3192
|
+
return null;
|
|
3193
|
+
}
|
|
3194
|
+
return item.value;
|
|
3306
3195
|
});
|
|
3307
3196
|
}
|
|
3308
|
-
|
|
3197
|
+
ClearCache(pattern, mode = "equals") {
|
|
3309
3198
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3310
|
-
|
|
3311
|
-
const
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3199
|
+
const keys = yield this.store.keys();
|
|
3200
|
+
const checkFuncs = {
|
|
3201
|
+
equals: (key) => key === pattern,
|
|
3202
|
+
contains: (key) => key.includes(pattern),
|
|
3203
|
+
startswith: (key) => key.startsWith(pattern),
|
|
3204
|
+
};
|
|
3205
|
+
const check = checkFuncs[mode];
|
|
3206
|
+
if (!check) {
|
|
3207
|
+
throw new Error("Invalid mode");
|
|
3316
3208
|
}
|
|
3317
|
-
|
|
3318
|
-
|
|
3209
|
+
for (const key of keys) {
|
|
3210
|
+
if (check(key)) {
|
|
3211
|
+
yield this.store.removeItem(key);
|
|
3212
|
+
}
|
|
3319
3213
|
}
|
|
3320
|
-
const
|
|
3321
|
-
|
|
3322
|
-
|
|
3214
|
+
for (const key in this.inMemoryPromises) {
|
|
3215
|
+
if (check(key)) {
|
|
3216
|
+
delete this.inMemoryPromises[key];
|
|
3217
|
+
this.keyVersions[key]++;
|
|
3218
|
+
}
|
|
3323
3219
|
}
|
|
3324
|
-
return raw;
|
|
3325
3220
|
});
|
|
3326
3221
|
}
|
|
3327
3222
|
}
|
|
3328
3223
|
class CacheControl {
|
|
3329
3224
|
constructor(id) {
|
|
3330
3225
|
this.Disabled = false;
|
|
3331
|
-
this.data = new
|
|
3226
|
+
this.data = new CacheUtil(id);
|
|
3332
3227
|
}
|
|
3333
3228
|
/**
|
|
3334
3229
|
* @param id
|
|
3335
3230
|
* @param data
|
|
3336
3231
|
* @param duration seconds to keep the data in cache. -1 for infinite.
|
|
3337
3232
|
*/
|
|
3338
|
-
Set(id, data, duration =
|
|
3233
|
+
Set(id, data, duration = 300) {
|
|
3339
3234
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3340
|
-
|
|
3235
|
+
const durationMs = duration === -1 ? undefined : duration * 1000;
|
|
3236
|
+
return this.data.Set(String(id), data, durationMs);
|
|
3341
3237
|
});
|
|
3342
3238
|
}
|
|
3343
3239
|
Get(id) {
|
|
3344
3240
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3345
|
-
return this.data.
|
|
3241
|
+
return (yield this.data.Get(String(id)));
|
|
3346
3242
|
});
|
|
3347
3243
|
}
|
|
3348
3244
|
Clear() {
|
|
3349
3245
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3350
|
-
return this.data.
|
|
3246
|
+
return this.data.ClearCache("");
|
|
3351
3247
|
});
|
|
3352
3248
|
}
|
|
3353
3249
|
Remove(id) {
|
|
3354
3250
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3355
|
-
return this.data.
|
|
3251
|
+
return this.data.ClearCache(String(id), "equals");
|
|
3356
3252
|
});
|
|
3357
3253
|
}
|
|
3358
3254
|
RemoveByStartsWith(text) {
|
|
3359
3255
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3360
|
-
|
|
3361
|
-
for (const item of items) {
|
|
3362
|
-
if (item.key.startsWith(text)) {
|
|
3363
|
-
yield this.data.Remove(item.key);
|
|
3364
|
-
}
|
|
3365
|
-
}
|
|
3256
|
+
return this.data.ClearCache(text, "startswith");
|
|
3366
3257
|
});
|
|
3367
3258
|
}
|
|
3368
3259
|
RemoveByContains(text) {
|
|
3369
3260
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3370
|
-
|
|
3371
|
-
for (const item of items) {
|
|
3372
|
-
if (item.key.includes(text)) {
|
|
3373
|
-
yield this.data.Remove(item.key);
|
|
3374
|
-
}
|
|
3375
|
-
}
|
|
3376
|
-
});
|
|
3377
|
-
}
|
|
3378
|
-
GetKeys() {
|
|
3379
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3380
|
-
if (this.Disabled) {
|
|
3381
|
-
return [];
|
|
3382
|
-
}
|
|
3383
|
-
const items = yield this.data.GetItems();
|
|
3384
|
-
return items.map(x => x.key);
|
|
3385
|
-
});
|
|
3386
|
-
}
|
|
3387
|
-
GetValues() {
|
|
3388
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3389
|
-
if (this.Disabled) {
|
|
3390
|
-
return [];
|
|
3391
|
-
}
|
|
3392
|
-
const items = yield this.data.GetItems();
|
|
3393
|
-
const keys = items.map(x => x.key);
|
|
3394
|
-
const values = yield Promise.all(keys.map(key => this.data.GetData(key)));
|
|
3395
|
-
return values.filter(x => x != null);
|
|
3261
|
+
return this.data.ClearCache(text, "contains");
|
|
3396
3262
|
});
|
|
3397
3263
|
}
|
|
3398
3264
|
}
|
|
@@ -4636,6 +4502,20 @@
|
|
|
4636
4502
|
Color.ColorFromStr = ColorFromStr;
|
|
4637
4503
|
})(exports.Color || (exports.Color = {}));
|
|
4638
4504
|
|
|
4505
|
+
(function (ObjectUtils) {
|
|
4506
|
+
/**
|
|
4507
|
+
* Generates a Bruce compatible UID.
|
|
4508
|
+
* @returns
|
|
4509
|
+
*/
|
|
4510
|
+
function UId() {
|
|
4511
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
|
|
4512
|
+
const r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8);
|
|
4513
|
+
return v.toString(16);
|
|
4514
|
+
});
|
|
4515
|
+
}
|
|
4516
|
+
ObjectUtils.UId = UId;
|
|
4517
|
+
})(exports.ObjectUtils || (exports.ObjectUtils = {}));
|
|
4518
|
+
|
|
4639
4519
|
/**
|
|
4640
4520
|
* Utility to help with parsing and wrapping Bruce paths.
|
|
4641
4521
|
*/
|
|
@@ -4695,24 +4575,34 @@
|
|
|
4695
4575
|
})(exports.PathUtils || (exports.PathUtils = {}));
|
|
4696
4576
|
|
|
4697
4577
|
(function (Entity) {
|
|
4698
|
-
function GetCacheKey(entityId, expandLocation) {
|
|
4699
|
-
|
|
4578
|
+
function GetCacheKey(entityId, entityTypeId, expandLocation) {
|
|
4579
|
+
if (!entityTypeId) {
|
|
4580
|
+
entityTypeId = "";
|
|
4581
|
+
}
|
|
4582
|
+
return `${exports.Api.ECacheKey.Entity}${exports.Api.ECacheKey.Id}${entityId}${String(entityTypeId)}${String(Boolean(expandLocation))}`;
|
|
4700
4583
|
}
|
|
4701
4584
|
Entity.GetCacheKey = GetCacheKey;
|
|
4702
4585
|
function Get(params) {
|
|
4703
4586
|
return __awaiter(this, void 0, void 0, function* () {
|
|
4704
|
-
const { api, entityId, req: reqParams, expandLocation } = params;
|
|
4587
|
+
const { api, entityId, req: reqParams, expandLocation, entityTypeId } = params;
|
|
4705
4588
|
if (!entityId) {
|
|
4706
4589
|
throw ("Entity ID is required.");
|
|
4707
4590
|
}
|
|
4708
|
-
const key = GetCacheKey(entityId, expandLocation);
|
|
4591
|
+
const key = GetCacheKey(entityId, entityTypeId, expandLocation);
|
|
4709
4592
|
const cacheData = yield api.GetCacheItem(key, reqParams);
|
|
4710
4593
|
if (cacheData) {
|
|
4711
4594
|
return cacheData;
|
|
4712
4595
|
}
|
|
4713
4596
|
const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
|
|
4714
4597
|
try {
|
|
4715
|
-
const
|
|
4598
|
+
const urlParams = new URLSearchParams();
|
|
4599
|
+
if (expandLocation) {
|
|
4600
|
+
urlParams.append("$expand", "location");
|
|
4601
|
+
}
|
|
4602
|
+
if (entityTypeId) {
|
|
4603
|
+
urlParams.append("BruceEntityType", entityTypeId);
|
|
4604
|
+
}
|
|
4605
|
+
const data = yield api.GET(`entity/${entityId}?${urlParams.toString()}`, exports.Api.PrepReqParams(reqParams));
|
|
4716
4606
|
res({
|
|
4717
4607
|
entity: data
|
|
4718
4608
|
});
|