@milaboratories/pl-tree 1.9.23 → 1.10.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.
@@ -1 +1 @@
1
- {"version":3,"file":"state.cjs","names":["ChangeSource","KeyedChangeSource","NullResourceId","PlTreeEntry"],"sources":["../src/state.ts"],"sourcesContent":["import type {\n BasicResourceData,\n FieldData,\n FieldStatus,\n FieldType,\n KeyValue,\n OptionalResourceId,\n ResourceData,\n ResourceId,\n ResourceKind,\n ResourceType,\n} from \"@milaboratories/pl-client\";\nimport {\n isNotNullResourceId,\n isNullResourceId,\n NullResourceId,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource, KeyedChangeSource } from \"@milaboratories/computable\";\nimport { PlTreeEntry } from \"./accessors\";\nimport type { ValueAndError } from \"./value_and_error\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { cachedDecode, cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { FieldTraversalStep, GetFieldStep } from \"./traversal_ops\";\nimport type { FinalResourceDataPredicate } from \"@milaboratories/pl-client\";\n\nexport type ExtendedResourceData = ResourceData & {\n kv: KeyValue[];\n};\n\nexport class TreeStateUpdateError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nclass PlTreeField implements FieldData {\n readonly change = new ChangeSource();\n\n constructor(\n public readonly name: string,\n public type: FieldType,\n public value: OptionalResourceId,\n public error: OptionalResourceId,\n public status: FieldStatus,\n public valueIsFinal: boolean,\n /** Last version of resource this field was observed, used to garbage collect fields in tree patching procedure */\n public resourceVersion: number,\n ) {}\n\n get state(): FieldData {\n return {\n name: this.name,\n type: this.type,\n status: this.status,\n value: this.value,\n error: this.error,\n valueIsFinal: this.valueIsFinal,\n };\n }\n}\n\nconst InitialResourceVersion = 0;\n\nexport type ResourceDataWithFinalState = ResourceData & {\n finalState: boolean;\n};\n\n/** Never store instances of this class, always get fresh instance from {@link PlTreeState} */\nexport class PlTreeResource implements ResourceDataWithFinalState {\n /** Tracks number of other resources referencing this resource. Used to perform garbage collection in tree patching procedure */\n refCount: number = 0;\n\n /** Increments each time resource is checked for difference with new state */\n version: number = InitialResourceVersion;\n /** Set to resource version when resource state, or it's fields have changed */\n dataVersion: number = InitialResourceVersion;\n\n readonly fieldsMap: Map<string, PlTreeField> = new Map();\n\n readonly kv = new Map<string, Uint8Array>();\n\n readonly resourceRemoved = new ChangeSource();\n\n // following change source are removed when resource is marked as final\n\n finalChanged? = new ChangeSource();\n\n resourceStateChange? = new ChangeSource();\n\n lockedChange? = new ChangeSource();\n inputAndServiceFieldListChanged? = new ChangeSource();\n outputFieldListChanged? = new ChangeSource();\n dynamicFieldListChanged? = new ChangeSource();\n\n // kvChangedGlobal? = new ChangeSource();\n kvChangedPerKey? = new KeyedChangeSource();\n\n readonly id: ResourceId;\n originalResourceId: OptionalResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n private dataAsString?: string;\n private dataAsJson?: unknown;\n\n error: OptionalResourceId;\n\n inputsLocked: boolean;\n outputsLocked: boolean;\n resourceReady: boolean;\n finalFlag: boolean;\n\n /** Set externally by the tree, using {@link FinalResourceDataPredicate} */\n _finalState: boolean = false;\n\n private readonly logger?: MiLogger;\n\n constructor(initialState: BasicResourceData, logger?: MiLogger) {\n this.id = initialState.id;\n this.originalResourceId = initialState.originalResourceId;\n this.kind = initialState.kind;\n this.type = initialState.type;\n this.data = initialState.data;\n this.error = initialState.error;\n this.inputsLocked = initialState.inputsLocked;\n this.outputsLocked = initialState.outputsLocked;\n this.resourceReady = initialState.resourceReady;\n this.finalFlag = initialState.final;\n this.logger = logger;\n }\n\n // TODO add logging\n\n private info(msg: string) {\n if (this.logger !== undefined) this.logger.info(msg);\n }\n\n private warn(msg: string) {\n if (this.logger !== undefined) this.logger.warn(msg);\n }\n\n get final(): boolean {\n return this.finalFlag;\n }\n\n get finalState(): boolean {\n return this._finalState;\n }\n\n get fields(): FieldData[] {\n return [...this.fieldsMap.values()];\n }\n\n public getField(\n watcher: Watcher,\n _step:\n | (Omit<GetFieldStep, \"errorIfFieldNotFound\"> & { errorIfFieldNotFound: true })\n | (Omit<GetFieldStep, \"errorIfFieldNotSet\"> & { errorIfFieldNotSet: true }),\n onUnstable: (marker: string) => void,\n ): ValueAndError<ResourceId>;\n public getField(\n watcher: Watcher,\n _step: string | GetFieldStep,\n onUnstable: (marker: string) => void,\n ): ValueAndError<ResourceId> | undefined;\n public getField(\n watcher: Watcher,\n _step: string | GetFieldStep,\n onUnstable: (marker: string) => void = () => {},\n ): ValueAndError<ResourceId> | undefined {\n const step: FieldTraversalStep = typeof _step === \"string\" ? { field: _step } : _step;\n\n const field = this.fieldsMap.get(step.field);\n if (field === undefined) {\n if (step.errorIfFieldNotFound || step.errorIfFieldNotSet)\n throw new Error(\n `Field \"${step.field}\" not found in resource ${resourceIdToString(this.id)}`,\n );\n\n if (!this.inputsLocked) this.inputAndServiceFieldListChanged?.attachWatcher(watcher);\n else if (step.assertFieldType === \"Service\" || step.assertFieldType === \"Input\") {\n if (step.allowPermanentAbsence)\n // stable absence of field\n return undefined;\n else throw new Error(`Service or input field not found ${step.field}.`);\n }\n\n if (!this.outputsLocked) this.outputFieldListChanged?.attachWatcher(watcher);\n else if (step.assertFieldType === \"Output\") {\n if (step.allowPermanentAbsence)\n // stable absence of field\n return undefined;\n else throw new Error(`Output field not found ${step.field}.`);\n }\n\n this.dynamicFieldListChanged?.attachWatcher(watcher);\n if (!this._finalState && !step.stableIfNotFound) onUnstable(\"field_not_found:\" + step.field);\n\n return undefined;\n } else {\n if (step.assertFieldType !== undefined && field.type !== step.assertFieldType)\n throw new Error(\n `Unexpected field type: expected ${step.assertFieldType} but got ${field.type} for the field name ${step.field}`,\n );\n\n const ret = {} as ValueAndError<ResourceId>;\n if (isNotNullResourceId(field.value)) ret.value = field.value;\n if (isNotNullResourceId(field.error)) ret.error = field.error;\n if (ret.value === undefined && ret.error === undefined)\n // this method returns value and error of the field, thus those values are considered to be accessed;\n // any existing but not resolved field here is considered to be unstable, in the sense it is\n // considered to acquire some resolved value eventually\n onUnstable(\"field_not_resolved:\" + step.field);\n field.change.attachWatcher(watcher);\n return ret;\n }\n }\n\n public getInputsLocked(watcher: Watcher): boolean {\n if (!this.inputsLocked)\n // reverse transition can't happen, so there is no reason to wait for value to change\n this.resourceStateChange?.attachWatcher(watcher);\n return this.inputsLocked;\n }\n\n public getOutputsLocked(watcher: Watcher): boolean {\n if (!this.outputsLocked)\n // reverse transition can't happen, so there is no reason to wait for value to change\n this.resourceStateChange?.attachWatcher(watcher);\n return this.outputsLocked;\n }\n\n public get isReadyOrError(): boolean {\n return (\n this.error !== NullResourceId ||\n this.resourceReady ||\n this.originalResourceId !== NullResourceId\n );\n }\n\n public getIsFinal(watcher: Watcher): boolean {\n this.finalChanged?.attachWatcher(watcher);\n return this._finalState;\n }\n\n public getIsReadyOrError(watcher: Watcher): boolean {\n if (!this.isReadyOrError)\n // reverse transition can't happen, so there is no reason to wait for value to change if it is already true\n this.resourceStateChange?.attachWatcher(watcher);\n return this.isReadyOrError;\n }\n\n public getError(watcher: Watcher): ResourceId | undefined {\n if (isNullResourceId(this.error)) {\n this.resourceStateChange?.attachWatcher(watcher);\n return undefined;\n } else {\n // reverse transition can't happen, so there is no reason to wait for value to change, if error already set\n return this.error;\n }\n }\n\n public listInputFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type === \"Input\" || field.type === \"Service\") ret.push(name);\n });\n if (!this.inputsLocked) this.inputAndServiceFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public listOutputFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type === \"Output\") ret.push(name);\n });\n if (!this.outputsLocked) this.outputFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public listDynamicFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type !== \"Input\" && field.type !== \"Output\") ret.push(name);\n });\n this.dynamicFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public getKeyValue(watcher: Watcher, key: string): Uint8Array | undefined {\n this.kvChangedPerKey?.attachWatcher(key, watcher);\n return this.kv.get(key);\n }\n\n public getKeyValueString(watcher: Watcher, key: string): string | undefined {\n const bytes = this.getKeyValue(watcher, key);\n if (bytes === undefined) return undefined;\n return cachedDecode(bytes);\n }\n\n public getKeyValueAsJson<T = unknown>(watcher: Watcher, key: string): T | undefined {\n const bytes = this.getKeyValue(watcher, key);\n if (bytes === undefined) return undefined;\n return cachedDeserialize(bytes);\n }\n\n public getDataAsString(): string | undefined {\n if (this.data === undefined) return undefined;\n if (this.dataAsString === undefined) this.dataAsString = cachedDecode(this.data);\n return this.dataAsString;\n }\n\n public getDataAsJson<T = unknown>(): T | undefined {\n if (this.data === undefined) return undefined;\n if (this.dataAsJson === undefined) this.dataAsJson = cachedDeserialize(this.data);\n return this.dataAsJson as T;\n }\n\n verifyReadyState() {\n if (this.resourceReady && !this.inputsLocked)\n throw new Error(\n `ready without input or output lock: ${stringifyWithResourceId(this.basicState)}`,\n );\n }\n\n get basicState(): BasicResourceData {\n return {\n id: this.id,\n kind: this.kind,\n type: this.type,\n data: this.data,\n resourceReady: this.resourceReady,\n inputsLocked: this.inputsLocked,\n outputsLocked: this.outputsLocked,\n error: this.error,\n originalResourceId: this.originalResourceId,\n final: this.finalFlag,\n };\n }\n\n get extendedState(): ExtendedResourceData {\n return {\n ...this.basicState,\n fields: this.fields,\n kv: Array.from(this.kv.entries()).map(([key, value]) => ({ key, value })),\n };\n }\n\n /** Called when {@link FinalResourceDataPredicate} returns true for the state. */\n markFinal() {\n if (this._finalState) return;\n\n this._finalState = true;\n notEmpty(this.finalChanged).markChanged(\"marked final\");\n this.finalChanged = undefined;\n this.resourceStateChange = undefined;\n this.dynamicFieldListChanged = undefined;\n this.inputAndServiceFieldListChanged = undefined;\n this.outputFieldListChanged = undefined;\n this.lockedChange = undefined;\n // this.kvChangedGlobal = undefined;\n this.kvChangedPerKey = undefined;\n }\n\n /** Used for invalidation */\n markAllChanged() {\n this.fieldsMap.forEach((field) => field.change.markChanged(\"marked all changed\"));\n this.finalChanged?.markChanged(\"marked all changed\");\n this.resourceStateChange?.markChanged(\"marked all changed\");\n this.lockedChange?.markChanged(\"marked all changed\");\n this.inputAndServiceFieldListChanged?.markChanged(\"marked all changed\");\n this.outputFieldListChanged?.markChanged(\"marked all changed\");\n this.dynamicFieldListChanged?.markChanged(\"marked all changed\");\n // this.kvChangedGlobal?.markChanged('marked all changed');\n this.kvChangedPerKey?.markAllChanged(\"marked all changed\");\n this.resourceRemoved.markChanged(\"marked all changed\");\n }\n}\n\nexport class PlTreeState {\n /** resource heap */\n private resources: Map<ResourceId, PlTreeResource> = new Map();\n private readonly resourcesAdded = new ChangeSource();\n /** Resets to false if any invalid state transitions are registered,\n * after that tree will produce errors for any read or write operations */\n private _isValid: boolean = true;\n private invalidationMessage?: string;\n\n constructor(\n /** This will be the only resource not deleted during GC round */\n public readonly root: ResourceId,\n public readonly isFinalPredicate: FinalResourceDataPredicate,\n ) {}\n\n public forEachResource(cb: (res: ResourceDataWithFinalState) => void): void {\n this.resources.forEach((v) => cb(v));\n }\n\n private checkValid() {\n if (!this._isValid) throw new Error(this.invalidationMessage ?? \"tree is in invalid state\");\n }\n\n public get(watcher: Watcher, rid: ResourceId): PlTreeResource {\n this.checkValid();\n const res = this.resources.get(rid);\n if (res === undefined) {\n // to make recovery from resource not found possible, considering some\n // race conditions, where computable is created before tree is updated\n this.resourcesAdded.attachWatcher(watcher);\n throw new Error(`resource ${resourceIdToString(rid)} not found in the tree`);\n }\n res.resourceRemoved.attachWatcher(watcher);\n return res;\n }\n\n updateFromResourceData(resourceData: ExtendedResourceData[], allowOrphanInputs: boolean = false) {\n this.checkValid();\n\n // All resources for which recount should be incremented, first are aggregated in this list\n const incrementRefs: ResourceId[] = [];\n const decrementRefs: ResourceId[] = [];\n\n // patching / creating resources\n for (const rd of resourceData) {\n let resource = this.resources.get(rd.id);\n\n const statBeforeMutation = resource?.basicState;\n const unexpectedTransitionError = (reason: string): never => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fields, ...rdWithoutFields } = rd;\n this.invalidateTree();\n throw new TreeStateUpdateError(\n `Unexpected resource state transition (${reason}): ${stringifyWithResourceId(\n rdWithoutFields,\n )} -> ${stringifyWithResourceId(statBeforeMutation)}`,\n );\n };\n\n if (resource !== undefined) {\n // updating existing resource\n\n if (resource.finalState)\n unexpectedTransitionError(\"resource state can\\t be updated after it is marked as final\");\n\n let changed = false;\n // updating resource version, even if it was not changed\n resource.version += 1;\n\n // duplicate / original\n if (resource.originalResourceId !== rd.originalResourceId) {\n if (resource.originalResourceId !== NullResourceId)\n unexpectedTransitionError(\"originalResourceId can't change after it is set\");\n resource.originalResourceId = rd.originalResourceId;\n // duplicate status of the resource counts as ready for the external observer\n notEmpty(resource.resourceStateChange).markChanged(\n `originalResourceId changed for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // error\n if (resource.error !== rd.error) {\n if (isNotNullResourceId(resource.error))\n unexpectedTransitionError(\"resource can't change attached error after it is set\");\n resource.error = rd.error;\n incrementRefs.push(resource.error as ResourceId);\n notEmpty(resource.resourceStateChange).markChanged(\n `error changed for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // updating fields\n for (const fd of rd.fields) {\n let field = resource.fieldsMap.get(fd.name);\n\n if (!field) {\n // new field\n\n field = new PlTreeField(\n fd.name,\n fd.type,\n fd.value,\n fd.error,\n fd.status,\n fd.valueIsFinal,\n resource.version,\n );\n if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);\n if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);\n\n if (fd.type === \"Input\" || fd.type === \"Service\") {\n if (resource.inputsLocked)\n unexpectedTransitionError(\n `adding ${fd.type} (${fd.name}) field while inputs locked`,\n );\n notEmpty(resource.inputAndServiceFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n } else if (fd.type === \"Output\") {\n if (resource.outputsLocked)\n unexpectedTransitionError(\n `adding ${fd.type} (${fd.name}) field while outputs locked`,\n );\n notEmpty(resource.outputFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n } else {\n notEmpty(resource.dynamicFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n }\n\n resource.fieldsMap.set(fd.name, field);\n\n changed = true;\n } else {\n // change of old field\n\n // in principle this transition is possible, see assertions below\n if (field.type !== fd.type) {\n if (field.type !== \"Dynamic\")\n unexpectedTransitionError(`field changed type ${field.type} -> ${fd.type}`);\n notEmpty(resource.dynamicFieldListChanged).markChanged(\n `field ${fd.name} changed type from Dynamic to ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n if (field.type === \"Input\" || field.type === \"Service\") {\n if (resource.inputsLocked)\n unexpectedTransitionError(\n `adding input field \"${fd.name}\", while corresponding list is locked`,\n );\n notEmpty(resource.inputAndServiceFieldListChanged).markChanged(\n `field ${fd.name} changed to type ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n }\n if (field.type === \"Output\") {\n if (resource.outputsLocked)\n unexpectedTransitionError(\n `adding output field \"${fd.name}\", while corresponding list is locked`,\n );\n notEmpty(resource.outputFieldListChanged).markChanged(\n `field ${fd.name} changed to type ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n }\n field.type = fd.type;\n field.change.markChanged(\n `field ${fd.name} type changed to ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field value\n if (field.value !== fd.value) {\n if (isNotNullResourceId(field.value)) decrementRefs.push(field.value);\n field.value = fd.value;\n if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);\n field.change.markChanged(\n `field ${fd.name} value changed in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field error\n if (field.error !== fd.error) {\n if (isNotNullResourceId(field.error)) decrementRefs.push(field.error);\n field.error = fd.error;\n if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);\n field.change.markChanged(\n `field ${fd.name} error changed in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field status\n if (field.status !== fd.status) {\n field.status = fd.status;\n field.change.markChanged(\n `field ${fd.name} status changed to ${fd.status} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field valueIsFinal flag\n if (field.valueIsFinal !== fd.valueIsFinal) {\n field.valueIsFinal = fd.valueIsFinal;\n field.change.markChanged(\n `field ${fd.name} valueIsFinal changed to ${fd.valueIsFinal} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n field.resourceVersion = resource.version;\n }\n }\n\n // detecting removed fields\n resource.fieldsMap.forEach((field, fieldName, fields) => {\n if (field.resourceVersion !== resource!.version) {\n if (field.type === \"Input\" || field.type === \"Service\" || field.type === \"Output\")\n unexpectedTransitionError(`removal of ${field.type} field ${fieldName}`);\n field.change.markChanged(\n `dynamic field ${fieldName} removed from ${resourceIdToString(resource!.id)}`,\n );\n fields.delete(fieldName);\n\n if (isNotNullResourceId(field.value)) decrementRefs.push(field.value);\n if (isNotNullResourceId(field.error)) decrementRefs.push(field.error);\n\n notEmpty(resource!.dynamicFieldListChanged).markChanged(\n `dynamic field ${fieldName} removed from ${resourceIdToString(resource!.id)}`,\n );\n }\n });\n\n // inputsLocked\n if (resource.inputsLocked !== rd.inputsLocked) {\n if (resource.inputsLocked) unexpectedTransitionError(\"inputs unlocking is not permitted\");\n resource.inputsLocked = rd.inputsLocked;\n notEmpty(resource.lockedChange).markChanged(\n `inputs locked for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // outputsLocked\n if (resource.outputsLocked !== rd.outputsLocked) {\n if (resource.outputsLocked)\n unexpectedTransitionError(\"outputs unlocking is not permitted\");\n resource.outputsLocked = rd.outputsLocked;\n notEmpty(resource.lockedChange).markChanged(\n `outputs locked for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // ready flag\n if (resource.resourceReady !== rd.resourceReady) {\n const readyStateBefore = resource.resourceReady;\n resource.resourceReady = rd.resourceReady;\n resource.verifyReadyState();\n if (!resource.isReadyOrError)\n unexpectedTransitionError(\n `resource can't lose it's ready or error state (ready state before ${readyStateBefore})`,\n );\n notEmpty(resource.resourceStateChange).markChanged(\n `ready flag changed to ${rd.resourceReady} for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // syncing kv\n for (const kv of rd.kv) {\n const current = resource.kv.get(kv.key);\n if (current === undefined) {\n resource.kv.set(kv.key, kv.value);\n notEmpty(resource.kvChangedPerKey).markChanged(\n kv.key,\n `kv added for ${resourceIdToString(resource.id)}: ${kv.key}`,\n );\n } else if (Buffer.compare(current, kv.value) !== 0) {\n resource.kv.set(kv.key, kv.value);\n notEmpty(resource.kvChangedPerKey).markChanged(\n kv.key,\n `kv changed for ${resourceIdToString(resource.id)}: ${kv.key}`,\n );\n }\n }\n\n if (resource.kv.size > rd.kv.length) {\n // only it this case it makes sense to check for deletions\n const newStateKeys = new Set(rd.kv.map((kv) => kv.key));\n\n // deleting keys not present in resource anymore\n resource.kv.forEach((_value, key, map) => {\n if (!newStateKeys.has(key)) {\n map.delete(key);\n notEmpty(resource!.kvChangedPerKey).markChanged(\n key,\n `kv deleted for ${resourceIdToString(resource!.id)}: ${key}`,\n );\n }\n });\n }\n\n if (changed) {\n // if resource was changed, updating resource data version\n resource.dataVersion = resource.version;\n if (this.isFinalPredicate(resource)) resource.markFinal();\n }\n } else {\n // creating new resource\n\n resource = new PlTreeResource(rd);\n resource.verifyReadyState();\n if (isNotNullResourceId(resource.error)) incrementRefs.push(resource.error);\n for (const fd of rd.fields) {\n const field = new PlTreeField(\n fd.name,\n fd.type,\n fd.value,\n fd.error,\n fd.status,\n fd.valueIsFinal,\n InitialResourceVersion,\n );\n if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);\n if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);\n resource.fieldsMap.set(fd.name, field);\n }\n\n // adding kv\n for (const kv of rd.kv) resource.kv.set(kv.key, kv.value);\n\n // checking that resource is final, and if so, marking it\n if (this.isFinalPredicate(resource)) resource.markFinal();\n\n // adding the resource to the heap\n this.resources.set(resource.id, resource);\n this.resourcesAdded.markChanged(`new resource ${resourceIdToString(resource.id)} added`);\n }\n }\n\n // applying refCount increments\n for (const rid of incrementRefs) {\n const res = this.resources.get(rid);\n if (!res) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan resource ${rid}`);\n }\n res.refCount++;\n }\n\n // recursively applying refCount decrements / doing garbage collection\n let currentRefs = decrementRefs;\n while (currentRefs.length > 0) {\n const nextRefs: ResourceId[] = [];\n for (const rid of currentRefs) {\n const res = this.resources.get(rid);\n if (!res) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan resource ${rid}`);\n }\n res.refCount--;\n\n // garbage collection\n if (res.refCount === 0 && res.id !== this.root) {\n // removing fields\n res.fieldsMap.forEach((field) => {\n if (isNotNullResourceId(field.value)) nextRefs.push(field.value);\n if (isNotNullResourceId(field.error)) nextRefs.push(field.error);\n field.change.markChanged(\n `field ${field.name} removed during garbage collection of ${resourceIdToString(res.id)}`,\n );\n });\n if (isNotNullResourceId(res.error)) nextRefs.push(res.error);\n res.resourceRemoved.markChanged(\n `resource removed during garbage collection: ${resourceIdToString(res.id)}`,\n );\n this.resources.delete(rid);\n }\n }\n currentRefs = nextRefs;\n }\n\n // checking for orphans (maybe removed in the future)\n if (!allowOrphanInputs) {\n for (const rd of resourceData) {\n if (!this.resources.has(rd.id)) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan input resource ${rd.id}`);\n }\n }\n }\n }\n\n /** @deprecated use \"entry\" instead */\n public accessor(rid: ResourceId = this.root): PlTreeEntry {\n this.checkValid();\n return this.entry(rid);\n }\n\n public entry(rid: ResourceId = this.root): PlTreeEntry {\n this.checkValid();\n return new PlTreeEntry({ treeProvider: () => this }, rid);\n }\n\n public invalidateTree(msg?: string) {\n this._isValid = false;\n this.invalidationMessage = msg;\n this.resources.forEach((res) => {\n res.markAllChanged();\n });\n }\n\n public dumpState(): ExtendedResourceData[] {\n return Array.from(this.resources.values()).map((res) => res.extendedState);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"state.cjs","names":["ChangeSource","KeyedChangeSource","NullSignedResourceId","PlTreeEntry"],"sources":["../src/state.ts"],"sourcesContent":["import type {\n BasicResourceData,\n FieldData,\n FieldStatus,\n FieldType,\n KeyValue,\n OptionalSignedResourceId,\n ResourceData,\n SignedResourceId,\n ResourceKind,\n ResourceType,\n} from \"@milaboratories/pl-client\";\nimport {\n isNotNullSignedResourceId,\n isNullSignedResourceId,\n NullSignedResourceId,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource, KeyedChangeSource } from \"@milaboratories/computable\";\nimport { PlTreeEntry } from \"./accessors\";\nimport type { ValueAndError } from \"./value_and_error\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { cachedDecode, cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { FieldTraversalStep, GetFieldStep } from \"./traversal_ops\";\nimport type { FinalResourceDataPredicate } from \"@milaboratories/pl-client\";\n\nexport type ExtendedResourceData = ResourceData & {\n kv: KeyValue[];\n};\n\nexport class TreeStateUpdateError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nclass PlTreeField implements FieldData {\n readonly change = new ChangeSource();\n\n constructor(\n public readonly name: string,\n public type: FieldType,\n public value: OptionalSignedResourceId,\n public error: OptionalSignedResourceId,\n public status: FieldStatus,\n public valueIsFinal: boolean,\n /** Last version of resource this field was observed, used to garbage collect fields in tree patching procedure */\n public resourceVersion: number,\n ) {}\n\n get state(): FieldData {\n return {\n name: this.name,\n type: this.type,\n status: this.status,\n value: this.value,\n error: this.error,\n valueIsFinal: this.valueIsFinal,\n };\n }\n}\n\nconst InitialResourceVersion = 0;\n\nexport type ResourceDataWithFinalState = ResourceData & {\n finalState: boolean;\n};\n\n/** Never store instances of this class, always get fresh instance from {@link PlTreeState} */\nexport class PlTreeResource implements ResourceDataWithFinalState {\n /** Tracks number of other resources referencing this resource. Used to perform garbage collection in tree patching procedure */\n refCount: number = 0;\n\n /** Increments each time resource is checked for difference with new state */\n version: number = InitialResourceVersion;\n /** Set to resource version when resource state, or it's fields have changed */\n dataVersion: number = InitialResourceVersion;\n\n readonly fieldsMap: Map<string, PlTreeField> = new Map();\n\n readonly kv = new Map<string, Uint8Array>();\n\n readonly resourceRemoved = new ChangeSource();\n\n // following change source are removed when resource is marked as final\n\n finalChanged? = new ChangeSource();\n\n resourceStateChange? = new ChangeSource();\n\n lockedChange? = new ChangeSource();\n inputAndServiceFieldListChanged? = new ChangeSource();\n outputFieldListChanged? = new ChangeSource();\n dynamicFieldListChanged? = new ChangeSource();\n\n // kvChangedGlobal? = new ChangeSource();\n kvChangedPerKey? = new KeyedChangeSource();\n\n readonly id: SignedResourceId;\n originalResourceId: OptionalSignedResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n private dataAsString?: string;\n private dataAsJson?: unknown;\n\n error: OptionalSignedResourceId;\n\n inputsLocked: boolean;\n outputsLocked: boolean;\n resourceReady: boolean;\n finalFlag: boolean;\n\n /** Set externally by the tree, using {@link FinalResourceDataPredicate} */\n _finalState: boolean = false;\n\n private readonly logger?: MiLogger;\n\n constructor(initialState: BasicResourceData, logger?: MiLogger) {\n this.id = initialState.id;\n this.originalResourceId = initialState.originalResourceId;\n this.kind = initialState.kind;\n this.type = initialState.type;\n this.data = initialState.data;\n this.error = initialState.error;\n this.inputsLocked = initialState.inputsLocked;\n this.outputsLocked = initialState.outputsLocked;\n this.resourceReady = initialState.resourceReady;\n this.finalFlag = initialState.final;\n this.logger = logger;\n }\n\n // TODO add logging\n\n private info(msg: string) {\n if (this.logger !== undefined) this.logger.info(msg);\n }\n\n private warn(msg: string) {\n if (this.logger !== undefined) this.logger.warn(msg);\n }\n\n get final(): boolean {\n return this.finalFlag;\n }\n\n get finalState(): boolean {\n return this._finalState;\n }\n\n get fields(): FieldData[] {\n return [...this.fieldsMap.values()];\n }\n\n public getField(\n watcher: Watcher,\n _step:\n | (Omit<GetFieldStep, \"errorIfFieldNotFound\"> & { errorIfFieldNotFound: true })\n | (Omit<GetFieldStep, \"errorIfFieldNotSet\"> & { errorIfFieldNotSet: true }),\n onUnstable: (marker: string) => void,\n ): ValueAndError<SignedResourceId>;\n public getField(\n watcher: Watcher,\n _step: string | GetFieldStep,\n onUnstable: (marker: string) => void,\n ): ValueAndError<SignedResourceId> | undefined;\n public getField(\n watcher: Watcher,\n _step: string | GetFieldStep,\n onUnstable: (marker: string) => void = () => {},\n ): ValueAndError<SignedResourceId> | undefined {\n const step: FieldTraversalStep = typeof _step === \"string\" ? { field: _step } : _step;\n\n const field = this.fieldsMap.get(step.field);\n if (field === undefined) {\n if (step.errorIfFieldNotFound || step.errorIfFieldNotSet)\n throw new Error(\n `Field \"${step.field}\" not found in resource ${resourceIdToString(this.id)}`,\n );\n\n if (!this.inputsLocked) this.inputAndServiceFieldListChanged?.attachWatcher(watcher);\n else if (step.assertFieldType === \"Service\" || step.assertFieldType === \"Input\") {\n if (step.allowPermanentAbsence)\n // stable absence of field\n return undefined;\n else throw new Error(`Service or input field not found ${step.field}.`);\n }\n\n if (!this.outputsLocked) this.outputFieldListChanged?.attachWatcher(watcher);\n else if (step.assertFieldType === \"Output\") {\n if (step.allowPermanentAbsence)\n // stable absence of field\n return undefined;\n else throw new Error(`Output field not found ${step.field}.`);\n }\n\n this.dynamicFieldListChanged?.attachWatcher(watcher);\n if (!this._finalState && !step.stableIfNotFound) onUnstable(\"field_not_found:\" + step.field);\n\n return undefined;\n } else {\n if (step.assertFieldType !== undefined && field.type !== step.assertFieldType)\n throw new Error(\n `Unexpected field type: expected ${step.assertFieldType} but got ${field.type} for the field name ${step.field}`,\n );\n\n const ret = {} as ValueAndError<SignedResourceId>;\n if (isNotNullSignedResourceId(field.value)) ret.value = field.value;\n if (isNotNullSignedResourceId(field.error)) ret.error = field.error;\n if (ret.value === undefined && ret.error === undefined)\n // this method returns value and error of the field, thus those values are considered to be accessed;\n // any existing but not resolved field here is considered to be unstable, in the sense it is\n // considered to acquire some resolved value eventually\n onUnstable(\"field_not_resolved:\" + step.field);\n field.change.attachWatcher(watcher);\n return ret;\n }\n }\n\n public getInputsLocked(watcher: Watcher): boolean {\n if (!this.inputsLocked)\n // reverse transition can't happen, so there is no reason to wait for value to change\n this.resourceStateChange?.attachWatcher(watcher);\n return this.inputsLocked;\n }\n\n public getOutputsLocked(watcher: Watcher): boolean {\n if (!this.outputsLocked)\n // reverse transition can't happen, so there is no reason to wait for value to change\n this.resourceStateChange?.attachWatcher(watcher);\n return this.outputsLocked;\n }\n\n public get isReadyOrError(): boolean {\n return (\n this.error !== NullSignedResourceId ||\n this.resourceReady ||\n this.originalResourceId !== NullSignedResourceId\n );\n }\n\n public getIsFinal(watcher: Watcher): boolean {\n this.finalChanged?.attachWatcher(watcher);\n return this._finalState;\n }\n\n public getIsReadyOrError(watcher: Watcher): boolean {\n if (!this.isReadyOrError)\n // reverse transition can't happen, so there is no reason to wait for value to change if it is already true\n this.resourceStateChange?.attachWatcher(watcher);\n return this.isReadyOrError;\n }\n\n public getError(watcher: Watcher): SignedResourceId | undefined {\n if (isNullSignedResourceId(this.error)) {\n this.resourceStateChange?.attachWatcher(watcher);\n return undefined;\n } else {\n // reverse transition can't happen, so there is no reason to wait for value to change, if error already set\n return this.error;\n }\n }\n\n public listInputFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type === \"Input\" || field.type === \"Service\") ret.push(name);\n });\n if (!this.inputsLocked) this.inputAndServiceFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public listOutputFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type === \"Output\") ret.push(name);\n });\n if (!this.outputsLocked) this.outputFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public listDynamicFields(watcher: Watcher): string[] {\n const ret: string[] = [];\n this.fieldsMap.forEach((field, name) => {\n if (field.type !== \"Input\" && field.type !== \"Output\") ret.push(name);\n });\n this.dynamicFieldListChanged?.attachWatcher(watcher);\n\n return ret;\n }\n\n public getKeyValue(watcher: Watcher, key: string): Uint8Array | undefined {\n this.kvChangedPerKey?.attachWatcher(key, watcher);\n return this.kv.get(key);\n }\n\n public getKeyValueString(watcher: Watcher, key: string): string | undefined {\n const bytes = this.getKeyValue(watcher, key);\n if (bytes === undefined) return undefined;\n return cachedDecode(bytes);\n }\n\n public getKeyValueAsJson<T = unknown>(watcher: Watcher, key: string): T | undefined {\n const bytes = this.getKeyValue(watcher, key);\n if (bytes === undefined) return undefined;\n return cachedDeserialize(bytes);\n }\n\n public getDataAsString(): string | undefined {\n if (this.data === undefined) return undefined;\n if (this.dataAsString === undefined) this.dataAsString = cachedDecode(this.data);\n return this.dataAsString;\n }\n\n public getDataAsJson<T = unknown>(): T | undefined {\n if (this.data === undefined) return undefined;\n if (this.dataAsJson === undefined) this.dataAsJson = cachedDeserialize(this.data);\n return this.dataAsJson as T;\n }\n\n verifyReadyState() {\n if (this.resourceReady && !this.inputsLocked)\n throw new Error(\n `ready without input or output lock: ${stringifyWithResourceId(this.basicState)}`,\n );\n }\n\n get basicState(): BasicResourceData {\n return {\n id: this.id,\n kind: this.kind,\n type: this.type,\n data: this.data,\n resourceReady: this.resourceReady,\n inputsLocked: this.inputsLocked,\n outputsLocked: this.outputsLocked,\n error: this.error,\n originalResourceId: this.originalResourceId,\n final: this.finalFlag,\n };\n }\n\n get extendedState(): ExtendedResourceData {\n return {\n ...this.basicState,\n fields: this.fields,\n kv: Array.from(this.kv.entries()).map(([key, value]) => ({ key, value })),\n };\n }\n\n /** Called when {@link FinalResourceDataPredicate} returns true for the state. */\n markFinal() {\n if (this._finalState) return;\n\n this._finalState = true;\n notEmpty(this.finalChanged).markChanged(\"marked final\");\n this.finalChanged = undefined;\n this.resourceStateChange = undefined;\n this.dynamicFieldListChanged = undefined;\n this.inputAndServiceFieldListChanged = undefined;\n this.outputFieldListChanged = undefined;\n this.lockedChange = undefined;\n // this.kvChangedGlobal = undefined;\n this.kvChangedPerKey = undefined;\n }\n\n /** Used for invalidation */\n markAllChanged() {\n this.fieldsMap.forEach((field) => field.change.markChanged(\"marked all changed\"));\n this.finalChanged?.markChanged(\"marked all changed\");\n this.resourceStateChange?.markChanged(\"marked all changed\");\n this.lockedChange?.markChanged(\"marked all changed\");\n this.inputAndServiceFieldListChanged?.markChanged(\"marked all changed\");\n this.outputFieldListChanged?.markChanged(\"marked all changed\");\n this.dynamicFieldListChanged?.markChanged(\"marked all changed\");\n // this.kvChangedGlobal?.markChanged('marked all changed');\n this.kvChangedPerKey?.markAllChanged(\"marked all changed\");\n this.resourceRemoved.markChanged(\"marked all changed\");\n }\n}\n\nexport class PlTreeState {\n /** resource heap */\n private resources: Map<SignedResourceId, PlTreeResource> = new Map();\n private readonly resourcesAdded = new ChangeSource();\n /** Resets to false if any invalid state transitions are registered,\n * after that tree will produce errors for any read or write operations */\n private _isValid: boolean = true;\n private invalidationMessage?: string;\n\n constructor(\n /** This will be the only resource not deleted during GC round */\n public readonly root: SignedResourceId,\n public readonly isFinalPredicate: FinalResourceDataPredicate,\n ) {}\n\n public forEachResource(cb: (res: ResourceDataWithFinalState) => void): void {\n this.resources.forEach((v) => cb(v));\n }\n\n private checkValid() {\n if (!this._isValid) throw new Error(this.invalidationMessage ?? \"tree is in invalid state\");\n }\n\n public get(watcher: Watcher, rid: SignedResourceId): PlTreeResource {\n this.checkValid();\n const res = this.resources.get(rid);\n if (res === undefined) {\n // to make recovery from resource not found possible, considering some\n // race conditions, where computable is created before tree is updated\n this.resourcesAdded.attachWatcher(watcher);\n throw new Error(`resource ${resourceIdToString(rid)} not found in the tree`);\n }\n res.resourceRemoved.attachWatcher(watcher);\n return res;\n }\n\n updateFromResourceData(resourceData: ExtendedResourceData[], allowOrphanInputs: boolean = false) {\n this.checkValid();\n\n // All resources for which recount should be incremented, first are aggregated in this list\n const incrementRefs: SignedResourceId[] = [];\n const decrementRefs: SignedResourceId[] = [];\n\n // patching / creating resources\n for (const rd of resourceData) {\n let resource = this.resources.get(rd.id);\n\n const statBeforeMutation = resource?.basicState;\n const unexpectedTransitionError = (reason: string): never => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fields, ...rdWithoutFields } = rd;\n this.invalidateTree();\n throw new TreeStateUpdateError(\n `Unexpected resource state transition (${reason}): ${stringifyWithResourceId(\n rdWithoutFields,\n )} -> ${stringifyWithResourceId(statBeforeMutation)}`,\n );\n };\n\n if (resource !== undefined) {\n // updating existing resource\n\n if (resource.finalState)\n unexpectedTransitionError(\"resource state can\\t be updated after it is marked as final\");\n\n let changed = false;\n // updating resource version, even if it was not changed\n resource.version += 1;\n\n // duplicate / original\n if (resource.originalResourceId !== rd.originalResourceId) {\n if (resource.originalResourceId !== NullSignedResourceId)\n unexpectedTransitionError(\"originalResourceId can't change after it is set\");\n resource.originalResourceId = rd.originalResourceId;\n // duplicate status of the resource counts as ready for the external observer\n notEmpty(resource.resourceStateChange).markChanged(\n `originalResourceId changed for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // error\n if (isNotNullSignedResourceId(rd.error) && resource.error !== rd.error) {\n if (isNotNullSignedResourceId(resource.error))\n unexpectedTransitionError(\"resource can't change attached error after it is set\");\n resource.error = rd.error;\n incrementRefs.push(resource.error);\n notEmpty(resource.resourceStateChange).markChanged(\n `error changed for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // updating fields\n for (const fd of rd.fields) {\n let field = resource.fieldsMap.get(fd.name);\n\n if (!field) {\n // new field\n\n field = new PlTreeField(\n fd.name,\n fd.type,\n fd.value,\n fd.error,\n fd.status,\n fd.valueIsFinal,\n resource.version,\n );\n if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);\n if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);\n\n if (fd.type === \"Input\" || fd.type === \"Service\") {\n if (resource.inputsLocked)\n unexpectedTransitionError(\n `adding ${fd.type} (${fd.name}) field while inputs locked`,\n );\n notEmpty(resource.inputAndServiceFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n } else if (fd.type === \"Output\") {\n if (resource.outputsLocked)\n unexpectedTransitionError(\n `adding ${fd.type} (${fd.name}) field while outputs locked`,\n );\n notEmpty(resource.outputFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n } else {\n notEmpty(resource.dynamicFieldListChanged).markChanged(\n `new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`,\n );\n }\n\n resource.fieldsMap.set(fd.name, field);\n\n changed = true;\n } else {\n // change of old field\n\n // in principle this transition is possible, see assertions below\n if (field.type !== fd.type) {\n if (field.type !== \"Dynamic\")\n unexpectedTransitionError(`field changed type ${field.type} -> ${fd.type}`);\n notEmpty(resource.dynamicFieldListChanged).markChanged(\n `field ${fd.name} changed type from Dynamic to ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n if (field.type === \"Input\" || field.type === \"Service\") {\n if (resource.inputsLocked)\n unexpectedTransitionError(\n `adding input field \"${fd.name}\", while corresponding list is locked`,\n );\n notEmpty(resource.inputAndServiceFieldListChanged).markChanged(\n `field ${fd.name} changed to type ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n }\n if (field.type === \"Output\") {\n if (resource.outputsLocked)\n unexpectedTransitionError(\n `adding output field \"${fd.name}\", while corresponding list is locked`,\n );\n notEmpty(resource.outputFieldListChanged).markChanged(\n `field ${fd.name} changed to type ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n }\n field.type = fd.type;\n field.change.markChanged(\n `field ${fd.name} type changed to ${fd.type} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field value\n if (field.value !== fd.value) {\n if (isNotNullSignedResourceId(field.value)) decrementRefs.push(field.value);\n field.value = fd.value;\n if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);\n field.change.markChanged(\n `field ${fd.name} value changed in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field error\n if (field.error !== fd.error) {\n if (isNotNullSignedResourceId(field.error)) decrementRefs.push(field.error);\n field.error = fd.error;\n if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);\n field.change.markChanged(\n `field ${fd.name} error changed in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field status\n if (field.status !== fd.status) {\n field.status = fd.status;\n field.change.markChanged(\n `field ${fd.name} status changed to ${fd.status} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // field valueIsFinal flag\n if (field.valueIsFinal !== fd.valueIsFinal) {\n field.valueIsFinal = fd.valueIsFinal;\n field.change.markChanged(\n `field ${fd.name} valueIsFinal changed to ${fd.valueIsFinal} in ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n field.resourceVersion = resource.version;\n }\n }\n\n // detecting removed fields\n resource.fieldsMap.forEach((field, fieldName, fields) => {\n if (field.resourceVersion !== resource!.version) {\n if (field.type === \"Input\" || field.type === \"Service\" || field.type === \"Output\")\n unexpectedTransitionError(`removal of ${field.type} field ${fieldName}`);\n field.change.markChanged(\n `dynamic field ${fieldName} removed from ${resourceIdToString(resource!.id)}`,\n );\n fields.delete(fieldName);\n\n if (isNotNullSignedResourceId(field.value)) decrementRefs.push(field.value);\n if (isNotNullSignedResourceId(field.error)) decrementRefs.push(field.error);\n\n notEmpty(resource!.dynamicFieldListChanged).markChanged(\n `dynamic field ${fieldName} removed from ${resourceIdToString(resource!.id)}`,\n );\n }\n });\n\n // inputsLocked\n if (resource.inputsLocked !== rd.inputsLocked) {\n if (resource.inputsLocked) unexpectedTransitionError(\"inputs unlocking is not permitted\");\n resource.inputsLocked = rd.inputsLocked;\n notEmpty(resource.lockedChange).markChanged(\n `inputs locked for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // outputsLocked\n if (resource.outputsLocked !== rd.outputsLocked) {\n if (resource.outputsLocked)\n unexpectedTransitionError(\"outputs unlocking is not permitted\");\n resource.outputsLocked = rd.outputsLocked;\n notEmpty(resource.lockedChange).markChanged(\n `outputs locked for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // ready flag\n if (resource.resourceReady !== rd.resourceReady) {\n const readyStateBefore = resource.resourceReady;\n resource.resourceReady = rd.resourceReady;\n resource.verifyReadyState();\n if (!resource.isReadyOrError)\n unexpectedTransitionError(\n `resource can't lose it's ready or error state (ready state before ${readyStateBefore})`,\n );\n notEmpty(resource.resourceStateChange).markChanged(\n `ready flag changed to ${rd.resourceReady} for ${resourceIdToString(resource.id)}`,\n );\n changed = true;\n }\n\n // syncing kv\n for (const kv of rd.kv) {\n const current = resource.kv.get(kv.key);\n if (current === undefined) {\n resource.kv.set(kv.key, kv.value);\n notEmpty(resource.kvChangedPerKey).markChanged(\n kv.key,\n `kv added for ${resourceIdToString(resource.id)}: ${kv.key}`,\n );\n } else if (Buffer.compare(current, kv.value) !== 0) {\n resource.kv.set(kv.key, kv.value);\n notEmpty(resource.kvChangedPerKey).markChanged(\n kv.key,\n `kv changed for ${resourceIdToString(resource.id)}: ${kv.key}`,\n );\n }\n }\n\n if (resource.kv.size > rd.kv.length) {\n // only it this case it makes sense to check for deletions\n const newStateKeys = new Set(rd.kv.map((kv) => kv.key));\n\n // deleting keys not present in resource anymore\n resource.kv.forEach((_value, key, map) => {\n if (!newStateKeys.has(key)) {\n map.delete(key);\n notEmpty(resource!.kvChangedPerKey).markChanged(\n key,\n `kv deleted for ${resourceIdToString(resource!.id)}: ${key}`,\n );\n }\n });\n }\n\n if (changed) {\n // if resource was changed, updating resource data version\n resource.dataVersion = resource.version;\n if (this.isFinalPredicate(resource)) resource.markFinal();\n }\n } else {\n // creating new resource\n\n resource = new PlTreeResource(rd);\n resource.verifyReadyState();\n if (isNotNullSignedResourceId(resource.error)) incrementRefs.push(resource.error);\n for (const fd of rd.fields) {\n const field = new PlTreeField(\n fd.name,\n fd.type,\n fd.value,\n fd.error,\n fd.status,\n fd.valueIsFinal,\n InitialResourceVersion,\n );\n if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);\n if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);\n resource.fieldsMap.set(fd.name, field);\n }\n\n // adding kv\n for (const kv of rd.kv) resource.kv.set(kv.key, kv.value);\n\n // checking that resource is final, and if so, marking it\n if (this.isFinalPredicate(resource)) resource.markFinal();\n\n // adding the resource to the heap\n this.resources.set(resource.id, resource);\n this.resourcesAdded.markChanged(`new resource ${resourceIdToString(resource.id)} added`);\n }\n }\n\n // applying refCount increments\n for (const rid of incrementRefs) {\n const res = this.resources.get(rid);\n if (!res) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan resource ${rid}`);\n }\n res.refCount++;\n }\n\n // recursively applying refCount decrements / doing garbage collection\n let currentRefs = decrementRefs;\n while (currentRefs.length > 0) {\n const nextRefs: SignedResourceId[] = [];\n for (const rid of currentRefs) {\n const res = this.resources.get(rid);\n if (!res) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan resource ${rid}`);\n }\n res.refCount--;\n\n // garbage collection\n if (res.refCount === 0 && res.id !== this.root) {\n // removing fields\n res.fieldsMap.forEach((field) => {\n if (isNotNullSignedResourceId(field.value)) nextRefs.push(field.value);\n if (isNotNullSignedResourceId(field.error)) nextRefs.push(field.error);\n field.change.markChanged(\n `field ${field.name} removed during garbage collection of ${resourceIdToString(res.id)}`,\n );\n });\n if (isNotNullSignedResourceId(res.error)) nextRefs.push(res.error);\n res.resourceRemoved.markChanged(\n `resource removed during garbage collection: ${resourceIdToString(res.id)}`,\n );\n this.resources.delete(rid);\n }\n }\n currentRefs = nextRefs;\n }\n\n // checking for orphans (maybe removed in the future)\n if (!allowOrphanInputs) {\n for (const rd of resourceData) {\n if (!this.resources.has(rd.id)) {\n this.invalidateTree();\n throw new TreeStateUpdateError(`orphan input resource ${rd.id}`);\n }\n }\n }\n }\n\n /** @deprecated use \"entry\" instead */\n public accessor(rid: SignedResourceId = this.root): PlTreeEntry {\n this.checkValid();\n return this.entry(rid);\n }\n\n public entry(rid: SignedResourceId = this.root): PlTreeEntry {\n this.checkValid();\n return new PlTreeEntry({ treeProvider: () => this }, rid);\n }\n\n public invalidateTree(msg?: string) {\n this._isValid = false;\n this.invalidationMessage = msg;\n this.resources.forEach((res) => {\n res.markAllChanged();\n });\n }\n\n public dumpState(): ExtendedResourceData[] {\n return Array.from(this.resources.values()).map((res) => res.extendedState);\n }\n}\n"],"mappings":"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"}
package/dist/state.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { GetFieldStep } from "./traversal_ops.js";
2
2
  import { ValueAndError } from "./value_and_error.js";
3
3
  import { PlTreeEntry } from "./accessors.js";
4
- import { BasicResourceData, FieldData, FieldStatus, FieldType, FinalResourceDataPredicate, KeyValue, OptionalResourceId, ResourceData, ResourceId, ResourceKind, ResourceType } from "@milaboratories/pl-client";
4
+ import { BasicResourceData, FieldData, FieldStatus, FieldType, FinalResourceDataPredicate, KeyValue, OptionalSignedResourceId, ResourceData, ResourceKind, ResourceType, SignedResourceId } from "@milaboratories/pl-client";
5
5
  import { ChangeSource, KeyedChangeSource, Watcher } from "@milaboratories/computable";
6
6
  import { MiLogger } from "@milaboratories/ts-helpers";
7
7
 
@@ -15,14 +15,14 @@ declare class TreeStateUpdateError extends Error {
15
15
  declare class PlTreeField implements FieldData {
16
16
  readonly name: string;
17
17
  type: FieldType;
18
- value: OptionalResourceId;
19
- error: OptionalResourceId;
18
+ value: OptionalSignedResourceId;
19
+ error: OptionalSignedResourceId;
20
20
  status: FieldStatus;
21
21
  valueIsFinal: boolean;
22
22
  /** Last version of resource this field was observed, used to garbage collect fields in tree patching procedure */
23
23
  resourceVersion: number;
24
24
  readonly change: ChangeSource;
25
- constructor(name: string, type: FieldType, value: OptionalResourceId, error: OptionalResourceId, status: FieldStatus, valueIsFinal: boolean, /** Last version of resource this field was observed, used to garbage collect fields in tree patching procedure */
25
+ constructor(name: string, type: FieldType, value: OptionalSignedResourceId, error: OptionalSignedResourceId, status: FieldStatus, valueIsFinal: boolean, /** Last version of resource this field was observed, used to garbage collect fields in tree patching procedure */
26
26
 
27
27
  resourceVersion: number);
28
28
  get state(): FieldData;
@@ -48,14 +48,14 @@ declare class PlTreeResource implements ResourceDataWithFinalState {
48
48
  outputFieldListChanged?: ChangeSource | undefined;
49
49
  dynamicFieldListChanged?: ChangeSource | undefined;
50
50
  kvChangedPerKey?: KeyedChangeSource | undefined;
51
- readonly id: ResourceId;
52
- originalResourceId: OptionalResourceId;
51
+ readonly id: SignedResourceId;
52
+ originalResourceId: OptionalSignedResourceId;
53
53
  readonly kind: ResourceKind;
54
54
  readonly type: ResourceType;
55
55
  readonly data?: Uint8Array;
56
56
  private dataAsString?;
57
57
  private dataAsJson?;
58
- error: OptionalResourceId;
58
+ error: OptionalSignedResourceId;
59
59
  inputsLocked: boolean;
60
60
  outputsLocked: boolean;
61
61
  resourceReady: boolean;
@@ -73,14 +73,14 @@ declare class PlTreeResource implements ResourceDataWithFinalState {
73
73
  errorIfFieldNotFound: true;
74
74
  }) | (Omit<GetFieldStep, "errorIfFieldNotSet"> & {
75
75
  errorIfFieldNotSet: true;
76
- }), onUnstable: (marker: string) => void): ValueAndError<ResourceId>;
77
- getField(watcher: Watcher, _step: string | GetFieldStep, onUnstable: (marker: string) => void): ValueAndError<ResourceId> | undefined;
76
+ }), onUnstable: (marker: string) => void): ValueAndError<SignedResourceId>;
77
+ getField(watcher: Watcher, _step: string | GetFieldStep, onUnstable: (marker: string) => void): ValueAndError<SignedResourceId> | undefined;
78
78
  getInputsLocked(watcher: Watcher): boolean;
79
79
  getOutputsLocked(watcher: Watcher): boolean;
80
80
  get isReadyOrError(): boolean;
81
81
  getIsFinal(watcher: Watcher): boolean;
82
82
  getIsReadyOrError(watcher: Watcher): boolean;
83
- getError(watcher: Watcher): ResourceId | undefined;
83
+ getError(watcher: Watcher): SignedResourceId | undefined;
84
84
  listInputFields(watcher: Watcher): string[];
85
85
  listOutputFields(watcher: Watcher): string[];
86
86
  listDynamicFields(watcher: Watcher): string[];
@@ -99,7 +99,7 @@ declare class PlTreeResource implements ResourceDataWithFinalState {
99
99
  }
100
100
  declare class PlTreeState {
101
101
  /** This will be the only resource not deleted during GC round */
102
- readonly root: ResourceId;
102
+ readonly root: SignedResourceId;
103
103
  readonly isFinalPredicate: FinalResourceDataPredicate;
104
104
  /** resource heap */
105
105
  private resources;
@@ -110,14 +110,14 @@ declare class PlTreeState {
110
110
  private invalidationMessage?;
111
111
  constructor(/** This will be the only resource not deleted during GC round */
112
112
 
113
- root: ResourceId, isFinalPredicate: FinalResourceDataPredicate);
113
+ root: SignedResourceId, isFinalPredicate: FinalResourceDataPredicate);
114
114
  forEachResource(cb: (res: ResourceDataWithFinalState) => void): void;
115
115
  private checkValid;
116
- get(watcher: Watcher, rid: ResourceId): PlTreeResource;
116
+ get(watcher: Watcher, rid: SignedResourceId): PlTreeResource;
117
117
  updateFromResourceData(resourceData: ExtendedResourceData[], allowOrphanInputs?: boolean): void;
118
118
  /** @deprecated use "entry" instead */
119
- accessor(rid?: ResourceId): PlTreeEntry;
120
- entry(rid?: ResourceId): PlTreeEntry;
119
+ accessor(rid?: SignedResourceId): PlTreeEntry;
120
+ entry(rid?: SignedResourceId): PlTreeEntry;
121
121
  invalidateTree(msg?: string): void;
122
122
  dumpState(): ExtendedResourceData[];
123
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","names":[],"sources":["../src/state.ts"],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","names":[],"sources":["../src/state.ts"],"mappings":"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"}
package/dist/state.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { PlTreeEntry } from "./accessors.js";
2
- import { NullResourceId, isNotNullResourceId, isNullResourceId, resourceIdToString, stringifyWithResourceId } from "@milaboratories/pl-client";
2
+ import { NullSignedResourceId, isNotNullSignedResourceId, isNullSignedResourceId, resourceIdToString, stringifyWithResourceId } from "@milaboratories/pl-client";
3
3
  import { ChangeSource, KeyedChangeSource } from "@milaboratories/computable";
4
4
  import { cachedDecode, cachedDeserialize, notEmpty } from "@milaboratories/ts-helpers";
5
5
  //#region src/state.ts
@@ -109,8 +109,8 @@ var PlTreeResource = class {
109
109
  } else {
110
110
  if (step.assertFieldType !== void 0 && field.type !== step.assertFieldType) throw new Error(`Unexpected field type: expected ${step.assertFieldType} but got ${field.type} for the field name ${step.field}`);
111
111
  const ret = {};
112
- if (isNotNullResourceId(field.value)) ret.value = field.value;
113
- if (isNotNullResourceId(field.error)) ret.error = field.error;
112
+ if (isNotNullSignedResourceId(field.value)) ret.value = field.value;
113
+ if (isNotNullSignedResourceId(field.error)) ret.error = field.error;
114
114
  if (ret.value === void 0 && ret.error === void 0) onUnstable("field_not_resolved:" + step.field);
115
115
  field.change.attachWatcher(watcher);
116
116
  return ret;
@@ -125,7 +125,7 @@ var PlTreeResource = class {
125
125
  return this.outputsLocked;
126
126
  }
127
127
  get isReadyOrError() {
128
- return this.error !== NullResourceId || this.resourceReady || this.originalResourceId !== NullResourceId;
128
+ return this.error !== NullSignedResourceId || this.resourceReady || this.originalResourceId !== NullSignedResourceId;
129
129
  }
130
130
  getIsFinal(watcher) {
131
131
  this.finalChanged?.attachWatcher(watcher);
@@ -136,7 +136,7 @@ var PlTreeResource = class {
136
136
  return this.isReadyOrError;
137
137
  }
138
138
  getError(watcher) {
139
- if (isNullResourceId(this.error)) {
139
+ if (isNullSignedResourceId(this.error)) {
140
140
  this.resourceStateChange?.attachWatcher(watcher);
141
141
  return;
142
142
  } else return this.error;
@@ -287,13 +287,13 @@ var PlTreeState = class {
287
287
  let changed = false;
288
288
  resource.version += 1;
289
289
  if (resource.originalResourceId !== rd.originalResourceId) {
290
- if (resource.originalResourceId !== NullResourceId) unexpectedTransitionError("originalResourceId can't change after it is set");
290
+ if (resource.originalResourceId !== NullSignedResourceId) unexpectedTransitionError("originalResourceId can't change after it is set");
291
291
  resource.originalResourceId = rd.originalResourceId;
292
292
  notEmpty(resource.resourceStateChange).markChanged(`originalResourceId changed for ${resourceIdToString(resource.id)}`);
293
293
  changed = true;
294
294
  }
295
- if (resource.error !== rd.error) {
296
- if (isNotNullResourceId(resource.error)) unexpectedTransitionError("resource can't change attached error after it is set");
295
+ if (isNotNullSignedResourceId(rd.error) && resource.error !== rd.error) {
296
+ if (isNotNullSignedResourceId(resource.error)) unexpectedTransitionError("resource can't change attached error after it is set");
297
297
  resource.error = rd.error;
298
298
  incrementRefs.push(resource.error);
299
299
  notEmpty(resource.resourceStateChange).markChanged(`error changed for ${resourceIdToString(resource.id)}`);
@@ -303,8 +303,8 @@ var PlTreeState = class {
303
303
  let field = resource.fieldsMap.get(fd.name);
304
304
  if (!field) {
305
305
  field = new PlTreeField(fd.name, fd.type, fd.value, fd.error, fd.status, fd.valueIsFinal, resource.version);
306
- if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);
307
- if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);
306
+ if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);
307
+ if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);
308
308
  if (fd.type === "Input" || fd.type === "Service") {
309
309
  if (resource.inputsLocked) unexpectedTransitionError(`adding ${fd.type} (${fd.name}) field while inputs locked`);
310
310
  notEmpty(resource.inputAndServiceFieldListChanged).markChanged(`new ${fd.type} field ${fd.name} added to ${resourceIdToString(resource.id)}`);
@@ -331,16 +331,16 @@ var PlTreeState = class {
331
331
  changed = true;
332
332
  }
333
333
  if (field.value !== fd.value) {
334
- if (isNotNullResourceId(field.value)) decrementRefs.push(field.value);
334
+ if (isNotNullSignedResourceId(field.value)) decrementRefs.push(field.value);
335
335
  field.value = fd.value;
336
- if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);
336
+ if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);
337
337
  field.change.markChanged(`field ${fd.name} value changed in ${resourceIdToString(resource.id)}`);
338
338
  changed = true;
339
339
  }
340
340
  if (field.error !== fd.error) {
341
- if (isNotNullResourceId(field.error)) decrementRefs.push(field.error);
341
+ if (isNotNullSignedResourceId(field.error)) decrementRefs.push(field.error);
342
342
  field.error = fd.error;
343
- if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);
343
+ if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);
344
344
  field.change.markChanged(`field ${fd.name} error changed in ${resourceIdToString(resource.id)}`);
345
345
  changed = true;
346
346
  }
@@ -362,8 +362,8 @@ var PlTreeState = class {
362
362
  if (field.type === "Input" || field.type === "Service" || field.type === "Output") unexpectedTransitionError(`removal of ${field.type} field ${fieldName}`);
363
363
  field.change.markChanged(`dynamic field ${fieldName} removed from ${resourceIdToString(resource.id)}`);
364
364
  fields.delete(fieldName);
365
- if (isNotNullResourceId(field.value)) decrementRefs.push(field.value);
366
- if (isNotNullResourceId(field.error)) decrementRefs.push(field.error);
365
+ if (isNotNullSignedResourceId(field.value)) decrementRefs.push(field.value);
366
+ if (isNotNullSignedResourceId(field.error)) decrementRefs.push(field.error);
367
367
  notEmpty(resource.dynamicFieldListChanged).markChanged(`dynamic field ${fieldName} removed from ${resourceIdToString(resource.id)}`);
368
368
  }
369
369
  });
@@ -413,11 +413,11 @@ var PlTreeState = class {
413
413
  } else {
414
414
  resource = new PlTreeResource(rd);
415
415
  resource.verifyReadyState();
416
- if (isNotNullResourceId(resource.error)) incrementRefs.push(resource.error);
416
+ if (isNotNullSignedResourceId(resource.error)) incrementRefs.push(resource.error);
417
417
  for (const fd of rd.fields) {
418
418
  const field = new PlTreeField(fd.name, fd.type, fd.value, fd.error, fd.status, fd.valueIsFinal, InitialResourceVersion);
419
- if (isNotNullResourceId(fd.value)) incrementRefs.push(fd.value);
420
- if (isNotNullResourceId(fd.error)) incrementRefs.push(fd.error);
419
+ if (isNotNullSignedResourceId(fd.value)) incrementRefs.push(fd.value);
420
+ if (isNotNullSignedResourceId(fd.error)) incrementRefs.push(fd.error);
421
421
  resource.fieldsMap.set(fd.name, field);
422
422
  }
423
423
  for (const kv of rd.kv) resource.kv.set(kv.key, kv.value);
@@ -446,11 +446,11 @@ var PlTreeState = class {
446
446
  res.refCount--;
447
447
  if (res.refCount === 0 && res.id !== this.root) {
448
448
  res.fieldsMap.forEach((field) => {
449
- if (isNotNullResourceId(field.value)) nextRefs.push(field.value);
450
- if (isNotNullResourceId(field.error)) nextRefs.push(field.error);
449
+ if (isNotNullSignedResourceId(field.value)) nextRefs.push(field.value);
450
+ if (isNotNullSignedResourceId(field.error)) nextRefs.push(field.error);
451
451
  field.change.markChanged(`field ${field.name} removed during garbage collection of ${resourceIdToString(res.id)}`);
452
452
  });
453
- if (isNotNullResourceId(res.error)) nextRefs.push(res.error);
453
+ if (isNotNullSignedResourceId(res.error)) nextRefs.push(res.error);
454
454
  res.resourceRemoved.markChanged(`resource removed during garbage collection: ${resourceIdToString(res.id)}`);
455
455
  this.resources.delete(rid);
456
456
  }