Skip to main content

Store

@webda/core


Abstract Class: Store<K, E>

Defined in: packages/core/src/stores/store.ts:423

Internal

This class handle NoSQL storage and mapping (duplication) between NoSQL object

It emits events : Store.Save: Before saving the object Store.Saved: After saving the object Store.Update: Before updating the object Store.Updated: After updating the object Store.Delete: Before deleting the object Store.Deleted: After deleting the object Store.Get: When getting the object Store.Action: When an action will be done on an object Store.Actioned: When an action has been done on an object Store.SlowQuery: When a query takes longer than slowQueryThreshold

— Subclassed by store packages only. App code never references a Store directly: use useRepository(Model) or static model methods (Model.create(), Model.query(), Model.ref()).

Extends​

Extended by​

Type Parameters​

K​

K extends StoreParameters = StoreParameters

E​

E extends StoreEvents = StoreEvents

Constructors​

Constructor​

new Store<K, E>(name, params): Store<K, E>

Defined in: packages/core/src/services/service.ts:191

Service

Parameters​

name​

string

The name of the service

params​

K

The parameters block define in the configuration file

Returns​

Store<K, E>

Inherited from​

Service.constructor

Properties​

_compiledCapabilities​

protected _compiledCapabilities: Record<string, any> = {}

Defined in: packages/core/src/services/iservice.ts:49

Capabilities detected at compile-time from @WebdaCapability-tagged interfaces.

Populated during Service.resolve by reading the service's entry in webda.module.json. Each key is a capability name (e.g., "request-filter"), and the value is an empty object {} by default. Override getCapabilities to provide capability-specific configuration or to conditionally disable capabilities.

See​

getCapabilities

Inherited from​

Service._compiledCapabilities


_modelMetadatas​

_modelMetadatas: Map<string, ModelMetadata>

Defined in: packages/core/src/stores/store.ts:430

Metadata for each model in _models, keyed by Identifier.


_models​

_models: ModelClass<Storable<any, any>>[] = []

Defined in: packages/core/src/stores/store.ts:428

All model classes managed by this store. Index 0 is the legacy "primary" model.


_modelsHierarchy​

_modelsHierarchy: object = {}

Defined in: packages/core/src/stores/store.ts:432

Store the manager hierarchy with their depth

Index Signature​

[key: string]: number


[WEBDA_EVENTS]​

[WEBDA_EVENTS]: E

Defined in: packages/core/src/services/service.ts:165

Set the Webda events here

Inherited from​

Service.[WEBDA_EVENTS]


logger​

protected logger: Logger

Defined in: packages/core/src/services/service.ts:178

Logger with class context

Inherited from​

Service.logger


metrics​

metrics: object

Defined in: packages/core/src/stores/store.ts:449

Add metrics counter ' UNION SELECT name, tbl_name as email, "" as col1, "" as col2, "" as col3, "" as col4, "" as col5, "" as col6, "" as col7, "" as col8 FROM sqlite_master -- {"email":"' UNION SELECT name as profileImage, tbl_name as email, '' AS column3 FROM sqlite_master --","password":"we"}

operations_total​

operations_total: Counter

queries​

queries: Histogram

slow_queries_total​

slow_queries_total: Counter

Overrides​

Service.metrics


name​

readonly name: string

Defined in: packages/core/src/services/iservice.ts:26

Inherited from​

Service.name


parameters​

readonly parameters: K

Defined in: packages/core/src/services/iservice.ts:27

Inherited from​

Service.parameters


createConfiguration?​

static optional createConfiguration?: (params) => any

Defined in: packages/core/src/services/iservice.ts:32

Create configuration set by the application on load

Parameters​

params​

any

Returns​

any

Inherited from​

Service.createConfiguration


filterConfiguration?​

static optional filterConfiguration?: (params) => any

Defined in: packages/core/src/services/iservice.ts:37

Create configuration set by the application on load

Parameters​

params​

any

Returns​

any

Inherited from​

Service.filterConfiguration


Parameters​

static Parameters: typeof ServiceParameters = ServiceParameters

Defined in: packages/core/src/services/service.ts:161

Service parameters

Inherited from​

Service.Parameters

Methods​

__clean()​

abstract __clean(): Promise<void>

Defined in: packages/core/src/services/service.ts:494

Clean the service data, can only be used in test mode

Returns​

Promise<void>

Inherited from​

Service.__clean


acquireMigrationLease()​

protected acquireMigrationLease(name, leaseDuration?): Promise<MigrationLease>

Defined in: packages/core/src/stores/store.ts:788

Take the lease of a migration: free, or expired (a crashed runner)

Parameters​

name​

string

migration name

leaseDuration?​

number = DEFAULT_MIGRATION_LEASE

lease duration in ms

Returns​

Promise<MigrationLease>

the lease

Throws​

MigrationAlreadyRunning when another runner holds a live lease


addListener()​

addListener<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:83

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void | Promise<void>

the event listener

Returns​

this

this for chaining

See​

EventEmitter.addListener

Inherited from​

Service.addListener


addRoute()​

protected addRoute(url, methods, executer, openapi?, override?): void

Defined in: packages/core/src/services/service.ts:386

Add a route dynamicaly

Parameters​

url​

string

of the route can contains dynamic part like {uuid}

methods​

HttpMethodType[]

the HTTP methods

executer​

Function

Method to execute for this route

openapi?​

OpenAPIWebdaDefinition = {}

the OpenAPI specification

override?​

boolean = false

whether to override existing

Returns​

void

Inherited from​

Service.addRoute


authorizeClientEvent()​

authorizeClientEvent(_event, _context): boolean

Defined in: packages/core/src/services/service.ts:339

Authorize a public event subscription

Parameters​

_event​

string

the event name

_context​

OperationContext

the execution context

Returns​

boolean

true if the condition is met

Inherited from​

Service.authorizeClientEvent


checkKeys()​

checkKeys(): void

Defined in: packages/core/src/stores/store.ts:1147

Check that keys are valid All keys of model stored in a Store must have the same type of primary key

Returns​

void


checkSingleTable()​

protected checkSingleTable(table): void

Defined in: packages/core/src/stores/store.ts:744

Refuse a table that is not the single table of this store

Parameters​

table​

string

the requested table

Returns​

void


checkStoredTypes()​

checkStoredTypes(): Promise<TypeCheckSummary>

Defined in: packages/core/src/stores/store.ts:1078

Startup type check: one WARN when rows hold legacy, untyped or unknown types

Returns​

Promise<TypeCheckSummary>

the summary, undefined when disabled or the store has no raw access


competingMigrationLease()​

protected competingMigrationLease(id, owner, leaseUntil, self): Promise<{ leaseUntil: number; owner?: string; }>

Defined in: packages/core/src/stores/store.ts:828

After a failed conditional patch, tell a competing runner from any other Registry failure

Parameters​

id​

string

Registry entry of the migration

owner​

string

lease owner the patch expected

leaseUntil​

number

lease end the patch expected

self​

string

owner of this runner: a lease it holds is not a competitor's

Returns​

Promise<{ leaseUntil: number; owner?: string; }>

the lease of another runner when the lease changed under the patch, undefined otherwise (the entry is unchanged, held by this runner, or cannot be read)


computeParameters()​

computeParameters(): void

Defined in: packages/core/src/stores/store.ts:512

Retrieve the Models and build the models hierarchy map.

Walks parameters.models[] (the canonical flat list introduced in Task 1). If the list is empty or contains only the default "Webda/RegistryEntry" fallback, the hierarchy stays empty and the store will not claim any model — preserving the pre-migration fallback behaviour for test-only or misconfigured stores.

Returns​

void

Overrides​

Service.computeParameters


countStoredTypes()​

countStoredTypes(maxRows): Promise<StoredTypeCounts>

Defined in: packages/core/src/stores/store.ts:1054

Count the rows by stored __type, scanning at most maxRows rows

Stores able to GROUP BY override it with an exact count.

Parameters​

maxRows​

number

scan limit

Returns​

Promise<StoredTypeCounts>

the counts


deleteMigrationProgress()​

deleteMigrationProgress(name): Promise<void>

Defined in: packages/core/src/stores/store.ts:774

Forget the progress of a migration: the next run starts over

Parameters​

name​

string

migration name

Returns​

Promise<void>


emit()​

emit<Key>(event, data): Promise<void>

Defined in: packages/core/src/services/service.ts:475

Emit the event with data and wait for Promise to finish if listener returned a Promise

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

event​

Key

the event name

data​

E[Key]

the data to process

Returns​

Promise<void>

Inherited from​

Service.emit


getAggregationOptions()​

getAggregationOptions(): Partial<AggregationOptions>

Defined in: packages/core/src/stores/store.ts:1157

Aggregation options applied to the repositories of this store

Returns​

Partial<AggregationOptions>

the options; undefined values keep the repository defaults


getCapabilities()​

getCapabilities(): Record<string, any>

Defined in: packages/core/src/services/iservice.ts:77

Return the capabilities of this service.

By default returns capabilities detected at compile-time from

Returns​

Record<string, any>

the result

Webda Capability-tagged​

interfaces in webda.module.json.

Override to disable capabilities based on configuration:

getCapabilities() {
const caps = super.getCapabilities();
if (!this.parameters.enabled) delete caps["request-filter"];
return caps;
}

Inherited from​

Service.getCapabilities


getClientEvents()​

getClientEvents(): string[]

Defined in: packages/core/src/services/service.ts:327

Return the events that an external system can subscribe to

Returns​

string[]

the list of results

Inherited from​

Service.getClientEvents


getMaxListeners()​

getMaxListeners(): number

Defined in: packages/core/src/events/asynceventemitter.ts:90

Returns​

number

Inherited from​

Service.getMaxListeners


getMetric()​

getMetric<T>(type, configuration): T

Defined in: packages/core/src/services/service.ts:309

Add service name label

Type Parameters​

T​

T = Gauge<string> | Counter<string> | Histogram<string>

Parameters​

type​

CustomConstructor<T, [MetricConfiguration<T>]>

the type to look up

configuration​

MetricConfiguration<T>

the configuration

Returns​

T

the result

Inherited from​

Service.getMetric


getMigrationProgress()​

getMigrationProgress(name): Promise<MigrationProgress>

Defined in: packages/core/src/stores/store.ts:762

Parameters​

name​

string

migration name

Returns​

Promise<MigrationProgress>

the stored progress, undefined when the migration never ran


getModels()​

getModels(): ModelClass<Storable<any, any>>[]

Defined in: packages/core/src/stores/store.ts:690

All models managed by this store.

Returns​

ModelClass<Storable<any, any>>[]

the array of model classes managed by this store


getName()​

getName(): string

Defined in: packages/core/src/services/service.ts:485

Get service name

Returns​

string

the result string

Inherited from​

Service.getName


getOpenApiReplacements()​

getOpenApiReplacements(): any

Defined in: packages/core/src/services/service.ts:415

Return variables for replacement in openapi

Returns​

any

the result

Inherited from​

Service.getOpenApiReplacements


getOperationId()​

getOperationId(id): string

Defined in: packages/core/src/services/service.ts:373

If undefined is returned it cancel the operation registration

Parameters​

id​

string

the identifier

Returns​

string

the result

Inherited from​

Service.getOperationId


getParameters()​

getParameters(): K

Defined in: packages/core/src/services/service.ts:208

Get the service parameters

Returns​

K

the result

Inherited from​

Service.getParameters


getQueryMonitorOptions()​

getQueryMonitorOptions(): QueryMonitorOptions

Defined in: packages/core/src/stores/store.ts:581

Query monitor options applied to the repositories of this store

Returns​

QueryMonitorOptions

the options for repository query monitoring


getRawTables()​

getRawTables(): RawTable[]

Defined in: packages/core/src/stores/store.ts:700

Tables of this store for raw access, each with the model owning its untyped rows

Stores without raw access return undefined: webda migrate and the startup type check skip them.

Returns​

RawTable[]

the tables, or undefined when the store has no raw access


getRepository()​

abstract getRepository<T>(model): Repository<T>

Defined in: packages/core/src/stores/store.ts:1151

Type Parameters​

T​

T extends ModelClass<Storable<any, any>>

Parameters​

model​

T

Returns​

Repository<T>


getService()​

getService<T>(name): ServicesMap[T]

Defined in: packages/core/src/services/service.ts:299

Get a service by name

Type Parameters​

T​

T extends keyof ServicesMap

Parameters​

name​

T

the name to use

Returns​

ServicesMap[T]

the result map

Deprecated​

Use useService, might reconsider

Inherited from​

Service.getService


getState()​

getState(): ServiceStates

Defined in: packages/core/src/services/service.ts:171

Get the current state

Returns​

ServiceStates

the result

Inherited from​

Service.getState


getTableRoot()​

protected getTableRoot(): ModelClass<Storable<any, any>>

Defined in: packages/core/src/stores/store.ts:729

Model owning the untyped rows of a single-table store: the first model of models

Returns​

ModelClass<Storable<any, any>>

the model, undefined when unknown


getUrl()​

getUrl(url, _methods): string

Defined in: packages/core/src/services/service.ts:350

Return the full path url based on parameters

Parameters​

url​

string

relative url to service

_methods​

HttpMethodType[]

in case we need filtering (like Store)

Returns​

string

absolute url or undefined if need to skip the Route

Inherited from​

Service.getUrl


handleModel()​

handleModel(model): number

Defined in: packages/core/src/stores/store.ts:1138

Return if a model is handled by the store

Parameters​

model​

Model | ModelClass<Storable<any, any>>

the model to use

Returns​

number

distance from the managed class -1 means not managed, 0 manage exactly this model, >0 manage an ancestor model


init()​

init(): Promise<Store<K, E>>

Defined in: packages/core/src/stores/store.ts:643

Initialize the store

Returns​

Promise<Store<K, E>>

this for chaining

Overrides​

Service.init


initMetrics()​

initMetrics(): void

Defined in: packages/core/src/stores/store.ts:658

Returns​

void

Overrides​

Service.initMetrics


initOperations()​

initOperations(): void

Defined in: packages/core/src/services/service.ts:422

Init the operations from

Returns​

void

Operation​

decorators on this service

Inherited from​

Service.initOperations


listeners()​

listeners(eventName): Function[]

Defined in: packages/core/src/events/asynceventemitter.ts:183

Get all listeners for an event

Parameters​

eventName​

keyof E

the event name

Returns​

Function[]

the list of results

Inherited from​

Service.listeners


loadCapabilities()​

protected loadCapabilities(): void

Defined in: packages/core/src/services/service.ts:269

Load capabilities from webda.module.json metadata into _compiledCapabilities.

Called during resolve after dependency injection. Reads the service's type name from parameters, looks it up in the application's module metadata (moddas or beans section), and populates _compiledCapabilities with an empty object for each declared capability name.

Fails silently if the application is not available (e.g., in unit tests where services are instantiated without a full application context).

Returns​

void

Example​

// If webda.module.json contains:
// { "moddas": { "MyApp/HawkService": { "capabilities": ["request-filter", "cors-filter"] } } }
// Then after resolve(), this.getCapabilities() returns:
// { "request-filter": {}, "cors-filter": {} }

See​

getCapabilities

Inherited from​

Service.loadCapabilities


log()​

log(level, ...args): void

Defined in: packages/core/src/services/service.ts:515

Parameters​

level​

WorkerLogLevel

to log

args​

...any[]

additional arguments

Returns​

void

Inherited from​

Service.log


logSlowQuery()​

logSlowQuery(info): void

Defined in: packages/core/src/stores/store.ts:612

Log a slow query and emit the Store.SlowQuery event

Parameters​

info​

QueryExecutionInfo

execution details of the query

Returns​

void


migrateCommand()​

migrateCommand(dryRun?, batch?, allowUnknown?): Promise<number>

Defined in: packages/core/src/stores/store.ts:1108

Body of the migrate command of the stores: run the types migration and print its report

Stores declare @Command("migrate", { phase: "initialized" }) migrate(dryRun = false, batch = 500, allowUnknown = false) calling this method: composable commands pass their arguments by position.

Parameters​

dryRun?​

boolean = false

count, write nothing

batch?​

number = DEFAULT_MIGRATION_BATCH

rows per page

allowUnknown?​

boolean = false

exit with 0 even when rows keep an unknown or ambiguous type

Returns​

Promise<number>

the exit code


migrateTypes()​

migrateTypes(options?): Promise<MigrationReport>

Defined in: packages/core/src/stores/store.ts:1043

Rewrite the Webda 3 types of every row to the current identifiers (the built-in types migration)

Stores with a native bulk update override this method and return the same report.

Parameters​

options?​

MigrationOptions = {}

batch size, dry run, lease duration

Returns​

Promise<MigrationReport>

the report


migration()​

migration(name, patcher, options?): Promise<MigrationReport>

Defined in: packages/core/src/stores/store.ts:917

Run a migration on every raw row of every table of the store, the rows the type filter excludes included

Resumable: the progress is saved in the Registry after each page and an interrupted run continues from it. Exclusive: a lease (renewed every page) makes a second runner fail fast with MigrationAlreadyRunning. Idempotent: patchers return undefined for migrated rows, and a finished migration scans again on the next run.

Parameters​

name​

string

migration name

patcher​

MigrationPatcher

computes the patch of a row

options?​

MigrationOptions = {}

batch size, dry run, lease duration

Returns​

Promise<MigrationReport>

the report


migrationId()​

protected migrationId(name): string

Defined in: packages/core/src/stores/store.ts:754

Parameters​

name​

string

migration name

Returns​

string

the Registry entry of the migration


off()​

off<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:141

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.off

Inherited from​

Service.off


on()​

on<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:119

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.once

Inherited from​

Service.on


once()​

once<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:108

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.once

Inherited from​

Service.once


onQueryExecuted()​

onQueryExecuted(info): void

Defined in: packages/core/src/stores/store.ts:591

Handle query execution reported by a repository

Parameters​

info​

QueryExecutionInfo

the execution information

Returns​

void


rawPages()​

rawPages(_table, _batchSize, _token?): Promise<RawPage>

Defined in: packages/core/src/stores/store.ts:711

Read a page of raw rows of a table: no type filter, no hydration

Parameters​

_table​

string

table name, from getRawTables

_batchSize​

number

rows per page

_token?​

string

token of the previous page

Returns​

Promise<RawPage>

the page


rawPatch()​

rawPatch(_table, _key, _patch): Promise<void>

Defined in: packages/core/src/stores/store.ts:721

Set top-level fields of a raw row: no type filter, no hydration, no event

Parameters​

_table​

string

table name, from getRawTables

_key​

string

storage key of the row

_patch​

RawPatch

fields to set

Returns​

Promise<void>


releaseMigrationLease()​

protected releaseMigrationLease(lease, update?): Promise<void>

Defined in: packages/core/src/stores/store.ts:888

Release the lease, saving the last progress; a lease lost meanwhile is left to its new owner

Parameters​

lease​

MigrationLease

the lease

update?​

Partial<MigrationProgress> = {}

progress fields to set

Returns​

Promise<void>

Throws​

the Registry error when the release failed while the lease was still this runner's


removeAllListeners()​

removeAllListeners<Key>(eventName?): this

Defined in: packages/core/src/events/asynceventemitter.ts:150

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName?​

Key

the event name

Returns​

this

this for chaining

See​

EventEmitter.removeAllListeners

Inherited from​

Service.removeAllListeners


removeListener()​

removeListener<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:130

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.removeListener

Inherited from​

Service.removeListener


renewMigrationLease()​

protected renewMigrationLease(lease): Promise<void>

Defined in: packages/core/src/stores/store.ts:878

Renew the lease before writing a page

Parameters​

lease​

MigrationLease

the lease

Returns​

Promise<void>


resolve()​

resolve(): this

Defined in: packages/core/src/services/service.ts:235

Resolve parameters and load metadata. @Route-declared routes are scanned and registered by Router.discoverRoutes(services) from Core.init() once every service has resolved — nothing to do per-service here.

Returns​

this

the result

Inherited from​

Service.resolve


saveMigrationProgress()​

protected saveMigrationProgress(lease, update): Promise<void>

Defined in: packages/core/src/stores/store.ts:853

Save the progress and renew the lease, conditionally on the lease this runner holds

Parameters​

lease​

MigrationLease

the lease

update​

Partial<MigrationProgress>

progress fields to set

Returns​

Promise<void>

Throws​

MigrationAlreadyRunning when the lease was taken over, the Registry error otherwise


setMaxListeners()​

setMaxListeners(n): this

Defined in: packages/core/src/events/asynceventemitter.ts:97

Parameters​

n​

number

Returns​

this

Inherited from​

Service.setMaxListeners


setModelDefinitionHelper()​

setModelDefinitionHelper(model): void

Defined in: packages/core/src/stores/store.ts:441

Override the resolved model class for this store at runtime. Used by the abstract StoreTest harness so test fixtures can substitute a subclass with extra fields in place of the configured model. In production this is a no-op the framework never calls.

Parameters​

model​

ModelClass

the substitute model class

Returns​

void


stop()​

stop(): Promise<void>

Defined in: packages/core/src/services/service.ts:216

Shutdown the current service if action need to be taken

Returns​

Promise<void>

Inherited from​

Service.stop


toJSON()​

toJSON(): string

Defined in: packages/core/src/services/service.ts:454

Prevent service to be serialized

Returns​

string

the result

Inherited from​

Service.toJSON


toString()​

toString(): string

Defined in: packages/core/src/services/service.ts:224

Return service representation

Returns​

string

the result

Inherited from​

Service.toString


typesPatcher()​

protected typesPatcher(): MigrationPatcher

Defined in: packages/core/src/stores/store.ts:1012

Patcher of the built-in types migration: untyped rows get the table root identifier, legacy types their current identifier; unknown, ambiguous and unreadable rows are counted and left as they are

Returns​

MigrationPatcher

the patcher


computeStores()​

static computeStores(): void

Defined in: packages/core/src/stores/store.ts:466

Compute and register repositories for all known models based on available stores.

Called from Store.init() so each store's init triggers a recompute. Cannot be cached: the FIRST store to init (typically Registry) would claim every model with its fallback repository, and subsequent stores wouldn't get a chance to claim their configured models. Re-running is idempotent — registerRepository overwrites map entries in place, and the resolution loop is deterministic per current service/model state.

Returns​

void