@utilarium/overcontext 0.0.7 → 0.0.8-dev.20260226040805.d18adcf
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/README.md +5 -1
- package/dist/index.cjs +805 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/fjell/fs-adapter.d.ts +35 -0
- package/dist/storage/fjell/fs-adapter.js +212 -0
- package/dist/storage/fjell/fs-adapter.js.map +1 -0
- package/dist/storage/fjell/fs-provider.d.ts +3 -0
- package/dist/storage/fjell/fs-provider.js +13 -0
- package/dist/storage/fjell/fs-provider.js.map +1 -0
- package/dist/storage/fjell/gcs-adapter.d.ts +40 -0
- package/dist/storage/fjell/gcs-adapter.js +249 -0
- package/dist/storage/fjell/gcs-adapter.js.map +1 -0
- package/dist/storage/fjell/gcs-provider.d.ts +3 -0
- package/dist/storage/fjell/gcs-provider.js +14 -0
- package/dist/storage/fjell/gcs-provider.js.map +1 -0
- package/dist/storage/fjell/index.d.ts +7 -0
- package/dist/storage/fjell/memory-adapter.d.ts +27 -0
- package/dist/storage/fjell/memory-adapter.js +150 -0
- package/dist/storage/fjell/memory-adapter.js.map +1 -0
- package/dist/storage/fjell/provider.d.ts +37 -0
- package/dist/storage/fjell/provider.js +141 -0
- package/dist/storage/fjell/provider.js.map +1 -0
- package/dist/storage/fjell/types.d.ts +50 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/observable.js +36 -1
- package/dist/storage/observable.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs-adapter.js","sources":["../../../src/storage/fjell/gcs-adapter.ts"],"sourcesContent":["import { createPrimaryGCSLibrary } from '@fjell/lib-gcs';\nimport type { GCSLibrary } from '@fjell/lib-gcs';\nimport type { EntityFilter } from '../interface';\nimport type { FjellBackendAdapter, FjellGcsProviderConfig } from './types';\n\ntype RawRecord = Record<string, unknown>;\ntype GcsFileLike = { name?: string };\ntype GcsBucketLike = { getFiles(options?: Record<string, unknown>): Promise<[GcsFileLike[]]> };\ntype GcsStorageLike = { bucket(name: string): GcsBucketLike };\n\n/**\n * GCS-backed Fjell adapter.\n * Uses one lib-gcs Library instance per namespace/type pair.\n */\nexport class FjellGcsAdapter implements FjellBackendAdapter {\n private readonly libraries = new Map<string, GCSLibrary<any, string>>();\n private readonly config: FjellGcsProviderConfig;\n private readonly defaultNamespace = 'default';\n private initialized = false;\n\n constructor(config: FjellGcsProviderConfig) {\n this.config = config;\n }\n\n async initialize(): Promise<void> {\n // Prime libraries for known types in the default namespace.\n for (const type of this.config.registry.types()) {\n this.getLibrary(type);\n }\n this.initialized = true;\n }\n\n async dispose(): Promise<void> {\n this.libraries.clear();\n this.initialized = false;\n }\n\n async isAvailable(): Promise<boolean> {\n return this.initialized;\n }\n\n async get(type: string, id: string, namespace?: string): Promise<RawRecord | undefined> {\n const library = this.getLibrary(type, namespace);\n const key = this.toPriKey(type, id);\n const item = await library.operations.get(key);\n if (!item) {\n return undefined;\n }\n return this.normalizeFromFjell(item as RawRecord, type, id);\n }\n\n async getAll(type: string, namespace?: string): Promise<RawRecord[]> {\n const library = this.getLibrary(type, namespace);\n const result = await library.operations.all();\n return result.items.map(item => this.normalizeFromFjell(item as RawRecord, type));\n }\n\n async create(type: string, item: RawRecord, namespace?: string): Promise<RawRecord> {\n const id = String(item.id ?? '');\n const library = this.getLibrary(type, namespace);\n const key = this.toPriKey(type, id);\n const created = await library.operations.create(this.toFjellItem(type, id, item), { key });\n return this.normalizeFromFjell(created as RawRecord, type, id);\n }\n\n async update(type: string, id: string, item: RawRecord, namespace?: string): Promise<RawRecord> {\n const library = this.getLibrary(type, namespace);\n const key = this.toPriKey(type, id);\n const updated = await library.operations.update(key, this.toFjellItem(type, id, item));\n return this.normalizeFromFjell(updated as RawRecord, type, id);\n }\n\n async remove(type: string, id: string, namespace?: string): Promise<boolean> {\n const existing = await this.get(type, id, namespace);\n if (!existing) {\n return false;\n }\n const library = this.getLibrary(type, namespace);\n const key = this.toPriKey(type, id);\n await library.operations.remove(key);\n return true;\n }\n\n async find(type: string, filter: EntityFilter, namespace?: string): Promise<RawRecord[]> {\n let results = await this.getAll(type, namespace);\n\n if (filter.ids && filter.ids.length > 0) {\n const ids = new Set(filter.ids);\n results = results.filter(item => ids.has(String(item.id)));\n }\n\n if (filter.search) {\n const search = filter.search.toLowerCase();\n results = results.filter(item => {\n const name = String(item.name ?? '').toLowerCase();\n const notes = String(item.notes ?? '').toLowerCase();\n return name.includes(search) || notes.includes(search);\n });\n }\n\n if (filter.offset && filter.offset > 0) {\n results = results.slice(filter.offset);\n }\n\n if (filter.limit && filter.limit >= 0) {\n results = results.slice(0, filter.limit);\n }\n\n return results;\n }\n\n async exists(type: string, id: string, namespace?: string): Promise<boolean> {\n const existing = await this.get(type, id, namespace);\n return Boolean(existing);\n }\n\n async count(type: string, filter?: EntityFilter, namespace?: string): Promise<number> {\n if (!filter) {\n const all = await this.getAll(type, namespace);\n return all.length;\n }\n const results = await this.find(type, filter, namespace);\n return results.length;\n }\n\n async listNamespaces(): Promise<string[]> {\n const names = await this.listObjectNames(this.objectPrefix());\n const knownTypes = new Set(this.config.registry.types());\n const namespaces = new Set<string>();\n\n for (const name of names) {\n const rel = this.relativeObjectPath(name);\n if (!rel) {\n continue;\n }\n const [firstSegment] = rel.split('/');\n if (!firstSegment || knownTypes.has(firstSegment)) {\n continue;\n }\n namespaces.add(firstSegment);\n }\n\n return Array.from(namespaces);\n }\n\n async namespaceExists(namespace: string): Promise<boolean> {\n const prefix = this.objectPrefix(namespace);\n const names = await this.listObjectNames(prefix);\n return names.length > 0;\n }\n\n async listTypes(namespace?: string): Promise<string[]> {\n const ns = this.resolveNamespace(namespace);\n const prefix = this.objectPrefix(ns);\n const names = await this.listObjectNames(prefix);\n const types = new Set<string>();\n\n for (const name of names) {\n const rel = this.relativeObjectPath(name);\n if (!rel || !rel.startsWith(`${ns}/`)) {\n continue;\n }\n\n const parts = rel.split('/');\n if (parts.length >= 2 && parts[1]) {\n types.add(parts[1]);\n }\n }\n\n return Array.from(types);\n }\n\n private libraryKey(type: string, namespace?: string): string {\n return `${this.resolveNamespace(namespace)}:${type}`;\n }\n\n private resolveNamespace(namespace?: string): string {\n return namespace ?? this.defaultNamespace;\n }\n\n private getLibrary(type: string, namespace?: string): GCSLibrary<any, string> {\n const key = this.libraryKey(type, namespace);\n const existing = this.libraries.get(key);\n if (existing) {\n return existing;\n }\n\n const ns = this.resolveNamespace(namespace);\n const libBasePath = this.joinPath(this.normalizeBasePath(this.config.basePath), ns);\n const library = createPrimaryGCSLibrary(type, type, {\n bucketName: this.config.bucketName,\n basePath: libBasePath,\n storage: this.config.storage,\n useJsonExtension: true,\n querySafety: this.config.querySafety,\n });\n this.libraries.set(key, library);\n return library;\n }\n\n private toPriKey(type: string, id: string): { kt: string; pk: string } {\n return { kt: type, pk: id };\n }\n\n private toFjellItem(type: string, id: string, item: RawRecord): RawRecord {\n return {\n ...item,\n id,\n type,\n };\n }\n\n private normalizeFromFjell(item: RawRecord, type: string, idFromKey?: string): RawRecord {\n const raw = { ...item };\n delete raw.key;\n delete raw.events;\n delete raw.aggs;\n delete raw.refs;\n\n const key = item.key as { pk?: string | number } | undefined;\n const id = idFromKey ?? (typeof raw.id === 'string' ? raw.id : key?.pk);\n\n return {\n ...raw,\n id: id ? String(id) : '',\n type: (typeof raw.type === 'string' ? raw.type : type),\n };\n }\n\n private objectPrefix(...parts: string[]): string {\n const normalizedBase = this.normalizeBasePath(this.config.basePath);\n const segments = [normalizedBase, ...parts].filter(Boolean);\n return segments.length > 0 ? `${segments.join('/')}/` : '';\n }\n\n private joinPath(...parts: string[]): string {\n return parts.filter(Boolean).join('/');\n }\n\n private normalizeBasePath(basePath?: string): string {\n if (!basePath) {\n return '';\n }\n return basePath.replace(/^\\/+|\\/+$/g, '');\n }\n\n private relativeObjectPath(fullName: string): string {\n const base = this.normalizeBasePath(this.config.basePath);\n if (!base) {\n return fullName;\n }\n return fullName.startsWith(`${base}/`) ? fullName.slice(base.length + 1) : fullName;\n }\n\n private async listObjectNames(prefix: string): Promise<string[]> {\n const storage = this.config.storage as unknown as GcsStorageLike | undefined;\n if (!storage) {\n return [];\n }\n\n const bucket = storage.bucket(this.config.bucketName);\n const [files] = await bucket.getFiles({ prefix });\n return files.map(file => file.name ?? '').filter(Boolean);\n }\n}\n"],"names":["FjellGcsAdapter","initialize","type","config","registry","types","getLibrary","initialized","dispose","libraries","clear","isAvailable","get","id","namespace","library","key","toPriKey","item","operations","undefined","normalizeFromFjell","getAll","result","all","items","map","create","String","created","toFjellItem","update","updated","remove","existing","find","filter","results","ids","length","Set","has","search","toLowerCase","name","notes","includes","offset","slice","limit","exists","Boolean","count","listNamespaces","names","listObjectNames","objectPrefix","knownTypes","namespaces","rel","relativeObjectPath","firstSegment","split","add","Array","from","namespaceExists","prefix","listTypes","ns","resolveNamespace","startsWith","parts","libraryKey","defaultNamespace","libBasePath","joinPath","normalizeBasePath","basePath","createPrimaryGCSLibrary","bucketName","storage","useJsonExtension","querySafety","set","kt","pk","idFromKey","raw","events","aggs","refs","normalizedBase","segments","join","replace","fullName","base","bucket","files","getFiles","file","Map"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FjellStorageProvider } from './provider.js';
|
|
2
|
+
import { FjellGcsAdapter } from './gcs-adapter.js';
|
|
3
|
+
|
|
4
|
+
async function createFjellGcsProvider(config) {
|
|
5
|
+
var _config_name;
|
|
6
|
+
const adapter = new FjellGcsAdapter(config);
|
|
7
|
+
const location = config.basePath ? `gs://${config.bucketName}/${config.basePath}` : `gs://${config.bucketName}`;
|
|
8
|
+
const provider = new FjellStorageProvider(adapter, config.registry, (_config_name = config.name) !== null && _config_name !== void 0 ? _config_name : 'fjell-gcs', location);
|
|
9
|
+
await provider.initialize();
|
|
10
|
+
return provider;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { createFjellGcsProvider };
|
|
14
|
+
//# sourceMappingURL=gcs-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs-provider.js","sources":["../../../src/storage/fjell/gcs-provider.ts"],"sourcesContent":["import type { StorageProvider } from '../interface';\nimport { FjellStorageProvider } from './provider';\nimport { FjellGcsAdapter } from './gcs-adapter';\nimport type { FjellGcsProviderConfig } from './types';\n\nexport async function createFjellGcsProvider(config: FjellGcsProviderConfig): Promise<StorageProvider> {\n const adapter = new FjellGcsAdapter(config);\n const location = config.basePath\n ? `gs://${config.bucketName}/${config.basePath}`\n : `gs://${config.bucketName}`;\n const provider = new FjellStorageProvider(\n adapter,\n config.registry,\n config.name ?? 'fjell-gcs',\n location,\n );\n await provider.initialize();\n return provider;\n}\n"],"names":["createFjellGcsProvider","config","adapter","FjellGcsAdapter","location","basePath","bucketName","provider","FjellStorageProvider","registry","name","initialize"],"mappings":";;;AAKO,eAAeA,uBAAuBC,MAA8B,EAAA;AAQnEA,IAAAA,IAAAA,YAAAA;IAPJ,MAAMC,OAAAA,GAAU,IAAIC,eAAAA,CAAgBF,MAAAA,CAAAA;IACpC,MAAMG,QAAAA,GAAWH,OAAOI,QAAQ,GAC1B,CAAC,KAAK,EAAEJ,OAAOK,UAAU,CAAC,CAAC,EAAEL,MAAAA,CAAOI,QAAQ,CAAA,CAAE,GAC9C,CAAC,KAAK,EAAEJ,MAAAA,CAAOK,UAAU,CAAA,CAAE;AACjC,IAAA,MAAMC,QAAAA,GAAW,IAAIC,oBAAAA,CACjBN,OAAAA,EACAD,MAAAA,CAAOQ,QAAQ,EAAA,CACfR,YAAAA,GAAAA,MAAAA,CAAOS,IAAI,MAAA,IAAA,IAAXT,YAAAA,KAAAA,MAAAA,GAAAA,eAAe,WAAA,EACfG,QAAAA,CAAAA;AAEJ,IAAA,MAAMG,SAASI,UAAU,EAAA;IACzB,OAAOJ,QAAAA;AACX;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { FjellBackendAdapter, FjellFsProviderConfig, FjellGcsProviderConfig } from './types';
|
|
2
|
+
export { FjellStorageProvider } from './provider';
|
|
3
|
+
export { MemoryFjellAdapter } from './memory-adapter';
|
|
4
|
+
export { FjellFsAdapter } from './fs-adapter';
|
|
5
|
+
export { createFjellFsProvider } from './fs-provider';
|
|
6
|
+
export { FjellGcsAdapter } from './gcs-adapter';
|
|
7
|
+
export { createFjellGcsProvider } from './gcs-provider';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FjellBackendAdapter } from './types';
|
|
2
|
+
import { EntityFilter } from '../interface';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory implementation of FjellBackendAdapter for testing.
|
|
5
|
+
* Stores entities in a nested Map: namespaceKey:type -> id -> entity data.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MemoryFjellAdapter implements FjellBackendAdapter {
|
|
8
|
+
private store;
|
|
9
|
+
private initialized;
|
|
10
|
+
private defaultNamespace;
|
|
11
|
+
private bucketKey;
|
|
12
|
+
private getBucket;
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
dispose(): Promise<void>;
|
|
15
|
+
isAvailable(): Promise<boolean>;
|
|
16
|
+
get(type: string, id: string, namespace?: string): Promise<Record<string, unknown> | undefined>;
|
|
17
|
+
getAll(type: string, namespace?: string): Promise<Record<string, unknown>[]>;
|
|
18
|
+
create(type: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>>;
|
|
19
|
+
update(type: string, id: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>>;
|
|
20
|
+
remove(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
21
|
+
find(type: string, filter: EntityFilter, namespace?: string): Promise<Record<string, unknown>[]>;
|
|
22
|
+
exists(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
23
|
+
count(type: string, filter?: EntityFilter, namespace?: string): Promise<number>;
|
|
24
|
+
listNamespaces(): Promise<string[]>;
|
|
25
|
+
namespaceExists(namespace: string): Promise<boolean>;
|
|
26
|
+
listTypes(namespace?: string): Promise<string[]>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* In-memory implementation of FjellBackendAdapter for testing.
|
|
16
|
+
* Stores entities in a nested Map: namespaceKey:type -> id -> entity data.
|
|
17
|
+
*/ class MemoryFjellAdapter {
|
|
18
|
+
bucketKey(type, namespace) {
|
|
19
|
+
return `${namespace !== null && namespace !== void 0 ? namespace : this.defaultNamespace}:${type}`;
|
|
20
|
+
}
|
|
21
|
+
getBucket(type, namespace) {
|
|
22
|
+
const key = this.bucketKey(type, namespace);
|
|
23
|
+
let bucket = this.store.get(key);
|
|
24
|
+
if (!bucket) {
|
|
25
|
+
bucket = new Map();
|
|
26
|
+
this.store.set(key, bucket);
|
|
27
|
+
}
|
|
28
|
+
return bucket;
|
|
29
|
+
}
|
|
30
|
+
async initialize() {
|
|
31
|
+
this.initialized = true;
|
|
32
|
+
}
|
|
33
|
+
async dispose() {
|
|
34
|
+
this.store.clear();
|
|
35
|
+
this.initialized = false;
|
|
36
|
+
}
|
|
37
|
+
async isAvailable() {
|
|
38
|
+
return this.initialized;
|
|
39
|
+
}
|
|
40
|
+
async get(type, id, namespace) {
|
|
41
|
+
const bucket = this.getBucket(type, namespace);
|
|
42
|
+
const item = bucket.get(id);
|
|
43
|
+
return item ? {
|
|
44
|
+
...item
|
|
45
|
+
} : undefined;
|
|
46
|
+
}
|
|
47
|
+
async getAll(type, namespace) {
|
|
48
|
+
const bucket = this.getBucket(type, namespace);
|
|
49
|
+
return Array.from(bucket.values()).map((item)=>({
|
|
50
|
+
...item
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
async create(type, item, namespace) {
|
|
54
|
+
const bucket = this.getBucket(type, namespace);
|
|
55
|
+
const id = item.id;
|
|
56
|
+
const stored = {
|
|
57
|
+
...item
|
|
58
|
+
};
|
|
59
|
+
bucket.set(id, stored);
|
|
60
|
+
return {
|
|
61
|
+
...stored
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async update(type, id, item, namespace) {
|
|
65
|
+
const bucket = this.getBucket(type, namespace);
|
|
66
|
+
const stored = {
|
|
67
|
+
...item
|
|
68
|
+
};
|
|
69
|
+
bucket.set(id, stored);
|
|
70
|
+
return {
|
|
71
|
+
...stored
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async remove(type, id, namespace) {
|
|
75
|
+
const bucket = this.getBucket(type, namespace);
|
|
76
|
+
return bucket.delete(id);
|
|
77
|
+
}
|
|
78
|
+
async find(type, filter, namespace) {
|
|
79
|
+
const all = await this.getAll(type, namespace);
|
|
80
|
+
let results = all;
|
|
81
|
+
if (filter.ids) {
|
|
82
|
+
const idSet = new Set(filter.ids);
|
|
83
|
+
results = results.filter((item)=>idSet.has(item.id));
|
|
84
|
+
}
|
|
85
|
+
if (filter.search) {
|
|
86
|
+
const term = filter.search.toLowerCase();
|
|
87
|
+
results = results.filter((item)=>{
|
|
88
|
+
var _item_name, _item_notes;
|
|
89
|
+
const name = (_item_name = item.name) !== null && _item_name !== void 0 ? _item_name : '';
|
|
90
|
+
const notes = (_item_notes = item.notes) !== null && _item_notes !== void 0 ? _item_notes : '';
|
|
91
|
+
return name.toLowerCase().includes(term) || notes.toLowerCase().includes(term);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (filter.offset) {
|
|
95
|
+
results = results.slice(filter.offset);
|
|
96
|
+
}
|
|
97
|
+
if (filter.limit) {
|
|
98
|
+
results = results.slice(0, filter.limit);
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
async exists(type, id, namespace) {
|
|
103
|
+
const bucket = this.getBucket(type, namespace);
|
|
104
|
+
return bucket.has(id);
|
|
105
|
+
}
|
|
106
|
+
async count(type, filter, namespace) {
|
|
107
|
+
if (filter) {
|
|
108
|
+
const results = await this.find(type, filter, namespace);
|
|
109
|
+
return results.length;
|
|
110
|
+
}
|
|
111
|
+
const bucket = this.getBucket(type, namespace);
|
|
112
|
+
return bucket.size;
|
|
113
|
+
}
|
|
114
|
+
async listNamespaces() {
|
|
115
|
+
const namespaces = new Set();
|
|
116
|
+
for (const key of this.store.keys()){
|
|
117
|
+
const ns = key.split(':')[0];
|
|
118
|
+
if (this.store.get(key).size > 0) {
|
|
119
|
+
namespaces.add(ns);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return Array.from(namespaces);
|
|
123
|
+
}
|
|
124
|
+
async namespaceExists(namespace) {
|
|
125
|
+
for (const [key, bucket] of this.store.entries()){
|
|
126
|
+
if (key.startsWith(`${namespace}:`) && bucket.size > 0) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
async listTypes(namespace) {
|
|
133
|
+
const ns = namespace !== null && namespace !== void 0 ? namespace : this.defaultNamespace;
|
|
134
|
+
const types = new Set();
|
|
135
|
+
for (const [key, bucket] of this.store.entries()){
|
|
136
|
+
if (key.startsWith(`${ns}:`) && bucket.size > 0) {
|
|
137
|
+
types.add(key.split(':')[1]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return Array.from(types);
|
|
141
|
+
}
|
|
142
|
+
constructor(){
|
|
143
|
+
_define_property(this, "store", new Map());
|
|
144
|
+
_define_property(this, "initialized", false);
|
|
145
|
+
_define_property(this, "defaultNamespace", 'default');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export { MemoryFjellAdapter };
|
|
150
|
+
//# sourceMappingURL=memory-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-adapter.js","sources":["../../../src/storage/fjell/memory-adapter.ts"],"sourcesContent":["import type { FjellBackendAdapter } from './types';\nimport type { EntityFilter } from '../interface';\n\n/**\n * In-memory implementation of FjellBackendAdapter for testing.\n * Stores entities in a nested Map: namespaceKey:type -> id -> entity data.\n */\nexport class MemoryFjellAdapter implements FjellBackendAdapter {\n private store = new Map<string, Map<string, Record<string, unknown>>>();\n private initialized = false;\n private defaultNamespace = 'default';\n\n private bucketKey(type: string, namespace?: string): string {\n return `${namespace ?? this.defaultNamespace}:${type}`;\n }\n\n private getBucket(type: string, namespace?: string): Map<string, Record<string, unknown>> {\n const key = this.bucketKey(type, namespace);\n let bucket = this.store.get(key);\n if (!bucket) {\n bucket = new Map();\n this.store.set(key, bucket);\n }\n return bucket;\n }\n\n async initialize(): Promise<void> {\n this.initialized = true;\n }\n\n async dispose(): Promise<void> {\n this.store.clear();\n this.initialized = false;\n }\n\n async isAvailable(): Promise<boolean> {\n return this.initialized;\n }\n\n async get(type: string, id: string, namespace?: string): Promise<Record<string, unknown> | undefined> {\n const bucket = this.getBucket(type, namespace);\n const item = bucket.get(id);\n return item ? { ...item } : undefined;\n }\n\n async getAll(type: string, namespace?: string): Promise<Record<string, unknown>[]> {\n const bucket = this.getBucket(type, namespace);\n return Array.from(bucket.values()).map(item => ({ ...item }));\n }\n\n async create(type: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>> {\n const bucket = this.getBucket(type, namespace);\n const id = item.id as string;\n const stored = { ...item };\n bucket.set(id, stored);\n return { ...stored };\n }\n\n async update(type: string, id: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>> {\n const bucket = this.getBucket(type, namespace);\n const stored = { ...item };\n bucket.set(id, stored);\n return { ...stored };\n }\n\n async remove(type: string, id: string, namespace?: string): Promise<boolean> {\n const bucket = this.getBucket(type, namespace);\n return bucket.delete(id);\n }\n\n async find(type: string, filter: EntityFilter, namespace?: string): Promise<Record<string, unknown>[]> {\n const all = await this.getAll(type, namespace);\n let results = all;\n\n if (filter.ids) {\n const idSet = new Set(filter.ids);\n results = results.filter(item => idSet.has(item.id as string));\n }\n\n if (filter.search) {\n const term = filter.search.toLowerCase();\n results = results.filter(item => {\n const name = (item.name as string) ?? '';\n const notes = (item.notes as string) ?? '';\n return name.toLowerCase().includes(term) || notes.toLowerCase().includes(term);\n });\n }\n\n if (filter.offset) {\n results = results.slice(filter.offset);\n }\n\n if (filter.limit) {\n results = results.slice(0, filter.limit);\n }\n\n return results;\n }\n\n async exists(type: string, id: string, namespace?: string): Promise<boolean> {\n const bucket = this.getBucket(type, namespace);\n return bucket.has(id);\n }\n\n async count(type: string, filter?: EntityFilter, namespace?: string): Promise<number> {\n if (filter) {\n const results = await this.find(type, filter, namespace);\n return results.length;\n }\n const bucket = this.getBucket(type, namespace);\n return bucket.size;\n }\n\n async listNamespaces(): Promise<string[]> {\n const namespaces = new Set<string>();\n for (const key of this.store.keys()) {\n const ns = key.split(':')[0];\n if (this.store.get(key)!.size > 0) {\n namespaces.add(ns);\n }\n }\n return Array.from(namespaces);\n }\n\n async namespaceExists(namespace: string): Promise<boolean> {\n for (const [key, bucket] of this.store.entries()) {\n if (key.startsWith(`${namespace}:`) && bucket.size > 0) {\n return true;\n }\n }\n return false;\n }\n\n async listTypes(namespace?: string): Promise<string[]> {\n const ns = namespace ?? this.defaultNamespace;\n const types = new Set<string>();\n for (const [key, bucket] of this.store.entries()) {\n if (key.startsWith(`${ns}:`) && bucket.size > 0) {\n types.add(key.split(':')[1]);\n }\n }\n return Array.from(types);\n }\n}\n"],"names":["MemoryFjellAdapter","bucketKey","type","namespace","defaultNamespace","getBucket","key","bucket","store","get","Map","set","initialize","initialized","dispose","clear","isAvailable","id","item","undefined","getAll","Array","from","values","map","create","stored","update","remove","delete","find","filter","all","results","ids","idSet","Set","has","search","term","toLowerCase","name","notes","includes","offset","slice","limit","exists","count","length","size","listNamespaces","namespaces","keys","ns","split","add","namespaceExists","entries","startsWith","listTypes","types"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { StorageProvider, EntityFilter } from '../interface';
|
|
2
|
+
import { FjellBackendAdapter } from './types';
|
|
3
|
+
import { SchemaRegistry } from '../../schema/registry';
|
|
4
|
+
import { BaseEntity } from '../../schema/base';
|
|
5
|
+
/**
|
|
6
|
+
* StorageProvider backed by a FjellBackendAdapter.
|
|
7
|
+
* Delegates all persistence to the adapter and handles
|
|
8
|
+
* entity <-> raw record conversion at the boundary.
|
|
9
|
+
*/
|
|
10
|
+
export declare class FjellStorageProvider implements StorageProvider {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly location: string;
|
|
13
|
+
readonly registry: SchemaRegistry;
|
|
14
|
+
private adapter;
|
|
15
|
+
constructor(adapter: FjellBackendAdapter, registry: SchemaRegistry, name: string, location: string);
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
dispose(): Promise<void>;
|
|
18
|
+
isAvailable(): Promise<boolean>;
|
|
19
|
+
get<T extends BaseEntity>(type: string, id: string, namespace?: string): Promise<T | undefined>;
|
|
20
|
+
getAll<T extends BaseEntity>(type: string, namespace?: string): Promise<T[]>;
|
|
21
|
+
find<T extends BaseEntity>(filter: EntityFilter): Promise<T[]>;
|
|
22
|
+
exists(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
23
|
+
count(filter: EntityFilter): Promise<number>;
|
|
24
|
+
save<T extends BaseEntity>(entity: T, namespace?: string): Promise<T>;
|
|
25
|
+
delete(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
26
|
+
saveBatch<T extends BaseEntity>(entities: T[], namespace?: string): Promise<T[]>;
|
|
27
|
+
deleteBatch(refs: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
id: string;
|
|
30
|
+
}>, namespace?: string): Promise<number>;
|
|
31
|
+
listNamespaces(): Promise<string[]>;
|
|
32
|
+
namespaceExists(namespace: string): Promise<boolean>;
|
|
33
|
+
listTypes(namespace?: string): Promise<string[]>;
|
|
34
|
+
private toEntity;
|
|
35
|
+
private toRaw;
|
|
36
|
+
private resolveFilterTypes;
|
|
37
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* StorageProvider backed by a FjellBackendAdapter.
|
|
16
|
+
* Delegates all persistence to the adapter and handles
|
|
17
|
+
* entity <-> raw record conversion at the boundary.
|
|
18
|
+
*/ class FjellStorageProvider {
|
|
19
|
+
async initialize() {
|
|
20
|
+
return this.adapter.initialize();
|
|
21
|
+
}
|
|
22
|
+
async dispose() {
|
|
23
|
+
return this.adapter.dispose();
|
|
24
|
+
}
|
|
25
|
+
async isAvailable() {
|
|
26
|
+
return this.adapter.isAvailable();
|
|
27
|
+
}
|
|
28
|
+
async get(type, id, namespace) {
|
|
29
|
+
const raw = await this.adapter.get(type, id, namespace);
|
|
30
|
+
return raw ? this.toEntity(raw) : undefined;
|
|
31
|
+
}
|
|
32
|
+
async getAll(type, namespace) {
|
|
33
|
+
const raws = await this.adapter.getAll(type, namespace);
|
|
34
|
+
return raws.map((r)=>this.toEntity(r));
|
|
35
|
+
}
|
|
36
|
+
async find(filter) {
|
|
37
|
+
const types = this.resolveFilterTypes(filter);
|
|
38
|
+
const results = [];
|
|
39
|
+
for (const type of types){
|
|
40
|
+
const typeFilter = {
|
|
41
|
+
...filter,
|
|
42
|
+
type
|
|
43
|
+
};
|
|
44
|
+
const raws = await this.adapter.find(type, typeFilter, filter.namespace);
|
|
45
|
+
results.push(...raws.map((r)=>this.toEntity(r)));
|
|
46
|
+
}
|
|
47
|
+
if (filter.limit && results.length > filter.limit) {
|
|
48
|
+
return results.slice(0, filter.limit);
|
|
49
|
+
}
|
|
50
|
+
return results;
|
|
51
|
+
}
|
|
52
|
+
async exists(type, id, namespace) {
|
|
53
|
+
return this.adapter.exists(type, id, namespace);
|
|
54
|
+
}
|
|
55
|
+
async count(filter) {
|
|
56
|
+
const types = this.resolveFilterTypes(filter);
|
|
57
|
+
let total = 0;
|
|
58
|
+
for (const type of types){
|
|
59
|
+
const typeFilter = {
|
|
60
|
+
...filter,
|
|
61
|
+
type
|
|
62
|
+
};
|
|
63
|
+
total += await this.adapter.count(type, typeFilter, filter.namespace);
|
|
64
|
+
}
|
|
65
|
+
return total;
|
|
66
|
+
}
|
|
67
|
+
async save(entity, namespace) {
|
|
68
|
+
const raw = this.toRaw(entity);
|
|
69
|
+
const entityExists = await this.adapter.exists(entity.type, entity.id, namespace);
|
|
70
|
+
const result = entityExists ? await this.adapter.update(entity.type, entity.id, raw, namespace) : await this.adapter.create(entity.type, raw, namespace);
|
|
71
|
+
return this.toEntity(result);
|
|
72
|
+
}
|
|
73
|
+
async delete(type, id, namespace) {
|
|
74
|
+
return this.adapter.remove(type, id, namespace);
|
|
75
|
+
}
|
|
76
|
+
async saveBatch(entities, namespace) {
|
|
77
|
+
return Promise.all(entities.map((e)=>this.save(e, namespace)));
|
|
78
|
+
}
|
|
79
|
+
async deleteBatch(refs, namespace) {
|
|
80
|
+
let deleted = 0;
|
|
81
|
+
for (const ref of refs){
|
|
82
|
+
const removed = await this.adapter.remove(ref.type, ref.id, namespace);
|
|
83
|
+
if (removed) deleted++;
|
|
84
|
+
}
|
|
85
|
+
return deleted;
|
|
86
|
+
}
|
|
87
|
+
async listNamespaces() {
|
|
88
|
+
return this.adapter.listNamespaces();
|
|
89
|
+
}
|
|
90
|
+
async namespaceExists(namespace) {
|
|
91
|
+
return this.adapter.namespaceExists(namespace);
|
|
92
|
+
}
|
|
93
|
+
async listTypes(namespace) {
|
|
94
|
+
return this.adapter.listTypes(namespace);
|
|
95
|
+
}
|
|
96
|
+
toEntity(raw) {
|
|
97
|
+
const entity = {
|
|
98
|
+
...raw
|
|
99
|
+
};
|
|
100
|
+
if (raw.createdAt && typeof raw.createdAt === 'string') {
|
|
101
|
+
entity.createdAt = new Date(raw.createdAt);
|
|
102
|
+
}
|
|
103
|
+
if (raw.updatedAt && typeof raw.updatedAt === 'string') {
|
|
104
|
+
entity.updatedAt = new Date(raw.updatedAt);
|
|
105
|
+
}
|
|
106
|
+
return entity;
|
|
107
|
+
}
|
|
108
|
+
toRaw(entity) {
|
|
109
|
+
const raw = {
|
|
110
|
+
...entity
|
|
111
|
+
};
|
|
112
|
+
if (entity.createdAt) {
|
|
113
|
+
raw.createdAt = entity.createdAt.toISOString();
|
|
114
|
+
}
|
|
115
|
+
if (entity.updatedAt) {
|
|
116
|
+
raw.updatedAt = entity.updatedAt.toISOString();
|
|
117
|
+
}
|
|
118
|
+
return raw;
|
|
119
|
+
}
|
|
120
|
+
resolveFilterTypes(filter) {
|
|
121
|
+
if (filter.type) {
|
|
122
|
+
return Array.isArray(filter.type) ? filter.type : [
|
|
123
|
+
filter.type
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
return this.registry.types();
|
|
127
|
+
}
|
|
128
|
+
constructor(adapter, registry, name, location){
|
|
129
|
+
_define_property(this, "name", void 0);
|
|
130
|
+
_define_property(this, "location", void 0);
|
|
131
|
+
_define_property(this, "registry", void 0);
|
|
132
|
+
_define_property(this, "adapter", void 0);
|
|
133
|
+
this.adapter = adapter;
|
|
134
|
+
this.registry = registry;
|
|
135
|
+
this.name = name;
|
|
136
|
+
this.location = location;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { FjellStorageProvider };
|
|
141
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../../../src/storage/fjell/provider.ts"],"sourcesContent":["import type { StorageProvider, EntityFilter } from '../interface';\nimport type { FjellBackendAdapter } from './types';\nimport type { SchemaRegistry } from '../../schema/registry';\nimport type { BaseEntity } from '../../schema/base';\n\n/**\n * StorageProvider backed by a FjellBackendAdapter.\n * Delegates all persistence to the adapter and handles\n * entity <-> raw record conversion at the boundary.\n */\nexport class FjellStorageProvider implements StorageProvider {\n readonly name: string;\n readonly location: string;\n readonly registry: SchemaRegistry;\n private adapter: FjellBackendAdapter;\n\n constructor(\n adapter: FjellBackendAdapter,\n registry: SchemaRegistry,\n name: string,\n location: string,\n ) {\n this.adapter = adapter;\n this.registry = registry;\n this.name = name;\n this.location = location;\n }\n\n async initialize(): Promise<void> {\n return this.adapter.initialize();\n }\n\n async dispose(): Promise<void> {\n return this.adapter.dispose();\n }\n\n async isAvailable(): Promise<boolean> {\n return this.adapter.isAvailable();\n }\n\n async get<T extends BaseEntity>(\n type: string,\n id: string,\n namespace?: string,\n ): Promise<T | undefined> {\n const raw = await this.adapter.get(type, id, namespace);\n return raw ? this.toEntity<T>(raw) : undefined;\n }\n\n async getAll<T extends BaseEntity>(\n type: string,\n namespace?: string,\n ): Promise<T[]> {\n const raws = await this.adapter.getAll(type, namespace);\n return raws.map(r => this.toEntity<T>(r));\n }\n\n async find<T extends BaseEntity>(filter: EntityFilter): Promise<T[]> {\n const types = this.resolveFilterTypes(filter);\n const results: T[] = [];\n\n for (const type of types) {\n const typeFilter = { ...filter, type };\n const raws = await this.adapter.find(type, typeFilter, filter.namespace);\n results.push(...raws.map(r => this.toEntity<T>(r)));\n }\n\n if (filter.limit && results.length > filter.limit) {\n return results.slice(0, filter.limit);\n }\n\n return results;\n }\n\n async exists(type: string, id: string, namespace?: string): Promise<boolean> {\n return this.adapter.exists(type, id, namespace);\n }\n\n async count(filter: EntityFilter): Promise<number> {\n const types = this.resolveFilterTypes(filter);\n let total = 0;\n\n for (const type of types) {\n const typeFilter = { ...filter, type };\n total += await this.adapter.count(type, typeFilter, filter.namespace);\n }\n\n return total;\n }\n\n async save<T extends BaseEntity>(entity: T, namespace?: string): Promise<T> {\n const raw = this.toRaw(entity);\n const entityExists = await this.adapter.exists(entity.type, entity.id, namespace);\n const result = entityExists\n ? await this.adapter.update(entity.type, entity.id, raw, namespace)\n : await this.adapter.create(entity.type, raw, namespace);\n return this.toEntity<T>(result);\n }\n\n async delete(type: string, id: string, namespace?: string): Promise<boolean> {\n return this.adapter.remove(type, id, namespace);\n }\n\n async saveBatch<T extends BaseEntity>(entities: T[], namespace?: string): Promise<T[]> {\n return Promise.all(entities.map(e => this.save(e, namespace)));\n }\n\n async deleteBatch(\n refs: Array<{ type: string; id: string }>,\n namespace?: string,\n ): Promise<number> {\n let deleted = 0;\n for (const ref of refs) {\n const removed = await this.adapter.remove(ref.type, ref.id, namespace);\n if (removed) deleted++;\n }\n return deleted;\n }\n\n async listNamespaces(): Promise<string[]> {\n return this.adapter.listNamespaces();\n }\n\n async namespaceExists(namespace: string): Promise<boolean> {\n return this.adapter.namespaceExists(namespace);\n }\n\n async listTypes(namespace?: string): Promise<string[]> {\n return this.adapter.listTypes(namespace);\n }\n\n private toEntity<T extends BaseEntity>(raw: Record<string, unknown>): T {\n const entity = { ...raw } as T;\n if (raw.createdAt && typeof raw.createdAt === 'string') {\n (entity as Record<string, unknown>).createdAt = new Date(raw.createdAt as string);\n }\n if (raw.updatedAt && typeof raw.updatedAt === 'string') {\n (entity as Record<string, unknown>).updatedAt = new Date(raw.updatedAt as string);\n }\n return entity;\n }\n\n private toRaw(entity: BaseEntity): Record<string, unknown> {\n const raw = { ...entity } as Record<string, unknown>;\n if (entity.createdAt) {\n raw.createdAt = entity.createdAt.toISOString();\n }\n if (entity.updatedAt) {\n raw.updatedAt = entity.updatedAt.toISOString();\n }\n return raw;\n }\n\n private resolveFilterTypes(filter: EntityFilter): string[] {\n if (filter.type) {\n return Array.isArray(filter.type) ? filter.type : [filter.type];\n }\n return this.registry.types();\n }\n}\n"],"names":["FjellStorageProvider","initialize","adapter","dispose","isAvailable","get","type","id","namespace","raw","toEntity","undefined","getAll","raws","map","r","find","filter","types","resolveFilterTypes","results","typeFilter","push","limit","length","slice","exists","count","total","save","entity","toRaw","entityExists","result","update","create","delete","remove","saveBatch","entities","Promise","all","e","deleteBatch","refs","deleted","ref","removed","listNamespaces","namespaceExists","listTypes","createdAt","Date","updatedAt","toISOString","Array","isArray","registry","name","location"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SchemaRegistry } from '../../schema/registry';
|
|
2
|
+
import { EntityFilter } from '../interface';
|
|
3
|
+
import { Storage } from '@google-cloud/storage';
|
|
4
|
+
/**
|
|
5
|
+
* Minimal interface that any Fjellgrunn backend must satisfy
|
|
6
|
+
* to back a FjellStorageProvider.
|
|
7
|
+
*
|
|
8
|
+
* Designed to abstract over @fjell/lib-fs and @fjell/lib-gcs
|
|
9
|
+
* without leaking backend-specific details into the provider.
|
|
10
|
+
*/
|
|
11
|
+
export interface FjellBackendAdapter {
|
|
12
|
+
initialize(): Promise<void>;
|
|
13
|
+
dispose(): Promise<void>;
|
|
14
|
+
isAvailable(): Promise<boolean>;
|
|
15
|
+
get(type: string, id: string, namespace?: string): Promise<Record<string, unknown> | undefined>;
|
|
16
|
+
getAll(type: string, namespace?: string): Promise<Record<string, unknown>[]>;
|
|
17
|
+
create(type: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>>;
|
|
18
|
+
update(type: string, id: string, item: Record<string, unknown>, namespace?: string): Promise<Record<string, unknown>>;
|
|
19
|
+
remove(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
20
|
+
find(type: string, filter: EntityFilter, namespace?: string): Promise<Record<string, unknown>[]>;
|
|
21
|
+
exists(type: string, id: string, namespace?: string): Promise<boolean>;
|
|
22
|
+
count(type: string, filter?: EntityFilter, namespace?: string): Promise<number>;
|
|
23
|
+
listNamespaces(): Promise<string[]>;
|
|
24
|
+
namespaceExists(namespace: string): Promise<boolean>;
|
|
25
|
+
listTypes(namespace?: string): Promise<string[]>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration for the filesystem-backed Fjellgrunn provider.
|
|
29
|
+
*/
|
|
30
|
+
export interface FjellFsProviderConfig {
|
|
31
|
+
basePath: string;
|
|
32
|
+
registry: SchemaRegistry;
|
|
33
|
+
name?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configuration for the GCS-backed Fjellgrunn provider.
|
|
37
|
+
*/
|
|
38
|
+
export interface FjellGcsProviderConfig {
|
|
39
|
+
bucketName: string;
|
|
40
|
+
basePath?: string;
|
|
41
|
+
registry: SchemaRegistry;
|
|
42
|
+
name?: string;
|
|
43
|
+
storage?: Storage;
|
|
44
|
+
querySafety?: {
|
|
45
|
+
maxScanFiles?: number;
|
|
46
|
+
warnThreshold?: number;
|
|
47
|
+
disableQueryOperations?: boolean;
|
|
48
|
+
downloadConcurrency?: number;
|
|
49
|
+
};
|
|
50
|
+
}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -13,7 +13,15 @@
|
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
15
|
return {
|
|
16
|
-
|
|
16
|
+
get name () {
|
|
17
|
+
return provider.name;
|
|
18
|
+
},
|
|
19
|
+
get location () {
|
|
20
|
+
return provider.location;
|
|
21
|
+
},
|
|
22
|
+
get registry () {
|
|
23
|
+
return provider.registry;
|
|
24
|
+
},
|
|
17
25
|
subscribe (handler) {
|
|
18
26
|
handlers.add(handler);
|
|
19
27
|
return ()=>handlers.delete(handler);
|
|
@@ -33,6 +41,24 @@
|
|
|
33
41
|
handlers.clear(); // Clear all handlers to prevent memory leaks
|
|
34
42
|
await provider.dispose();
|
|
35
43
|
},
|
|
44
|
+
async isAvailable () {
|
|
45
|
+
return provider.isAvailable();
|
|
46
|
+
},
|
|
47
|
+
async get (type, id, namespace) {
|
|
48
|
+
return provider.get(type, id, namespace);
|
|
49
|
+
},
|
|
50
|
+
async getAll (type, namespace) {
|
|
51
|
+
return provider.getAll(type, namespace);
|
|
52
|
+
},
|
|
53
|
+
async find (filter) {
|
|
54
|
+
return provider.find(filter);
|
|
55
|
+
},
|
|
56
|
+
async exists (type, id, namespace) {
|
|
57
|
+
return provider.exists(type, id, namespace);
|
|
58
|
+
},
|
|
59
|
+
async count (filter) {
|
|
60
|
+
return provider.count(filter);
|
|
61
|
+
},
|
|
36
62
|
async save (entity, namespace) {
|
|
37
63
|
const existing = await provider.get(entity.type, entity.id, namespace);
|
|
38
64
|
const saved = await provider.save(entity, namespace);
|
|
@@ -91,6 +117,15 @@
|
|
|
91
117
|
deletedCount: count
|
|
92
118
|
});
|
|
93
119
|
return count;
|
|
120
|
+
},
|
|
121
|
+
async listNamespaces () {
|
|
122
|
+
return provider.listNamespaces();
|
|
123
|
+
},
|
|
124
|
+
async namespaceExists (namespace) {
|
|
125
|
+
return provider.namespaceExists(namespace);
|
|
126
|
+
},
|
|
127
|
+
async listTypes (namespace) {
|
|
128
|
+
return provider.listTypes(namespace);
|
|
94
129
|
}
|
|
95
130
|
};
|
|
96
131
|
};
|