{
  "version": 3,
  "sources": ["../../src/modules/archivist-memory/Archivist.ts", "../../src/modules/archivist-memory/Config.ts", "../../src/modules/archivist-memory/MemoryDriver.ts"],
  "sourcesContent": ["import type { Schema } from '@xyo-network/sdk-protocol'\n\nimport { StorageClassLabel } from '#archivist-abstract'\nimport type { GenericArchivistParams } from '#archivist-generic'\nimport { GenericArchivist } from '#archivist-generic'\nimport type {\n  ArchivistModuleEventData,\n  AttachableArchivistInstance,\n} from '#archivist-model'\nimport {\n  ArchivistAllQuerySchema,\n  ArchivistClearQuerySchema,\n  ArchivistCommitQuerySchema,\n  ArchivistDeleteQuerySchema,\n  ArchivistInsertQuerySchema,\n  ArchivistNextQuerySchema,\n} from '#archivist-model'\nimport type {\n  AnyConfigSchema, AttachableModuleInstance, ModuleInstance,\n} from '#module-model'\nimport { creatableModule } from '#module-model'\n\nimport type { MemoryArchivistConfig } from './Config.ts'\nimport { MemoryArchivistConfigSchema } from './Config.ts'\nimport { MemoryDriver } from './MemoryDriver.ts'\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>>\n  = GenericArchivistParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n  TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n  TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n>\n  extends GenericArchivist<TParams, TEventData>\n  implements AttachableArchivistInstance, ModuleInstance {\n  static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]\n  static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema\n  static override readonly labels: {\n    'network.xyo.storage.class': string\n  } = { ...super.labels, [StorageClassLabel]: 'memory' }\n\n  override get queries(): Schema[] {\n    return [\n      ArchivistAllQuerySchema,\n      ArchivistDeleteQuerySchema,\n      ArchivistClearQuerySchema,\n      ArchivistInsertQuerySchema,\n      ArchivistCommitQuerySchema,\n      ArchivistNextQuerySchema,\n      ...super.queries,\n    ]\n  }\n\n  static override async paramsHandler<T extends AttachableModuleInstance<MemoryArchivistParams, ArchivistModuleEventData>>(\n    inParams?: Partial<T['params']>,\n  ): Promise<T['params']> {\n    const superParams = await super.paramsHandler(inParams)\n    return { ...superParams, driver: superParams.driver ?? await MemoryDriver.create(superParams) }\n  }\n}\n", "import type { EmptyObject, WithAdditional } from '@ariestools/sdk'\nimport {\n  zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport {\n  asSchema, type Payload, type Schema,\n} from '@xyo-network/sdk-protocol'\nimport * as z from 'zod/mini'\n\nimport type { ArchivistConfig } from '#archivist-model'\nimport { ArchivistConfigZod } from '#archivist-model'\n\nexport const MemoryArchivistConfigSchema: 'network.xyo.archivist.memory.config' & {\n  readonly __schema: true\n} = asSchema('network.xyo.archivist.memory.config', true)\nexport type MemoryArchivistConfigSchema = typeof MemoryArchivistConfigSchema\n\nexport const MemoryArchivistConfigZod: z.ZodMiniObject<\n  & Omit<(typeof ArchivistConfigZod)['shape'], 'schema'>\n  & {\n    max: z.ZodMiniOptional<z.ZodMiniNumber<number>>\n    schema: z.ZodMiniLiteral<MemoryArchivistConfigSchema>\n  },\n  z.core.$strip\n> = z.extend(ArchivistConfigZod, {\n  max: z.optional(z.number()),\n  schema: z.literal(MemoryArchivistConfigSchema),\n})\n\nexport type MemoryArchivistConfigBase = z.infer<typeof MemoryArchivistConfigZod>\n\nexport const isMemoryArchivistConfig: ReturnType<typeof zodIsFactory<MemoryArchivistConfigBase>> = zodIsFactory(MemoryArchivistConfigZod)\nexport const asMemoryArchivistConfig: ReturnType<typeof zodAsFactory<MemoryArchivistConfigBase>> = zodAsFactory(MemoryArchivistConfigZod, 'asMemoryArchivistConfig')\nexport const toMemoryArchivistConfig: ReturnType<typeof zodToFactory<MemoryArchivistConfigBase>> = zodToFactory(MemoryArchivistConfigZod, 'toMemoryArchivistConfig')\n\nexport type MemoryArchivistConfig<TConfig extends Payload | EmptyObject | void = void, TSchema extends Schema | void = void> = ArchivistConfig<\n  WithAdditional<\n    {\n      max?: number\n    },\n    TConfig\n  >,\n  TSchema extends Schema ? TSchema : MemoryArchivistConfigSchema | ArchivistConfig['schema']\n>\n", "import type {\n  BrandedHash,\n  CreatableParams, Hash, Hex, Promisable,\n} from '@ariestools/sdk'\nimport {\n  AbstractCreatable, assertEx,\n  creatable, exists,\n  isDefined,\n} from '@ariestools/sdk'\nimport type { Payload, WithStorageMeta } from '@xyo-network/sdk-protocol'\nimport { PayloadBuilder } from '@xyo-network/sdk-protocol'\nimport { LRUCache } from 'lru-cache'\n\nimport type { ArchivistDriver, ArchivistNextOptions } from '#archivist-model'\n\nexport interface MemoryDriverConfig {\n  max?: number\n}\n\nexport interface MemoryDriverParams extends CreatableParams {\n  config: MemoryDriverConfig\n}\n\n@creatable()\nexport class MemoryDriver extends AbstractCreatable<MemoryDriverParams>\n  implements ArchivistDriver<Hash, Payload, WithStorageMeta<Payload>> {\n  private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>\n  private _config?: MemoryDriverConfig\n  private _dataHashIndex?: LRUCache<Hash, Hash>\n  private _sortedValues?: WithStorageMeta<Payload>[]\n\n  protected get cache(): LRUCache<BrandedHash, WithStorageMeta<Payload>> {\n    this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<Payload>>({\n      max: this.max,\n      dispose: () => { this._sortedValues = undefined },\n    })\n    return this._cache\n  }\n\n  protected get config(): MemoryDriverConfig {\n    return assertEx(this._config, () => 'Driver config is not set')\n  }\n\n  protected get dataHashIndex(): LRUCache<BrandedHash, BrandedHash> {\n    this._dataHashIndex = this._dataHashIndex ?? new LRUCache<Hash, Hash>({ max: this.max })\n    return this._dataHashIndex\n  }\n\n  protected get max(): number {\n    return this.config?.max ?? 10_000\n  }\n\n  protected get sortedValues(): WithStorageMeta<Payload>[] {\n    this._sortedValues ??= [...this.cache.values()].filter(exists).toSorted(PayloadBuilder.compareStorageMeta)\n    return this._sortedValues\n  }\n\n  private static findIndexFromCursor(payloads: WithStorageMeta[], cursor: Hex) {\n    const index = payloads.findIndex(({ _sequence }) => _sequence === cursor)\n    if (index === -1) {\n      return Infinity // move to the end\n    }\n    return index\n  }\n\n  all(): Promisable<WithStorageMeta<Payload>[]> {\n    return [...this.sortedValues]\n  }\n\n  clear(): void {\n    this.cache.clear()\n    this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n    this._sortedValues = undefined\n  }\n\n  count(): number {\n    return this.cache.size\n  }\n\n  override createHandler(): Promisable<void> {\n    this._config = this.params.config ?? {}\n  }\n\n  async delete(hashes: Hash[]): Promise<WithStorageMeta[]> {\n    this._sortedValues = undefined\n    const deletedPayloads: WithStorageMeta<Payload>[] = (await Promise.all(this.cache\n      .dump()\n      .map(async ([key, item]) => {\n        const itemValueDataHash = await PayloadBuilder.dataHash(item.value)\n        if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {\n          this.cache.delete(key)\n          return item.value\n        }\n      })))\n      .filter(exists)\n    this.rebuildDataHashIndex()\n    return deletedPayloads\n  }\n\n  get(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]> {\n    return hashes.map((hash) => {\n      const resolvedHash = this.dataHashIndex.get(hash) ?? hash\n      const result = this.cache.get(resolvedHash)\n      if (resolvedHash !== hash && !result) {\n        throw new Error('Missing referenced payload')\n      }\n      return result\n    }).filter(exists)\n  }\n\n  insert(payloads: WithStorageMeta<Payload>[]): WithStorageMeta<Payload>[] {\n    this._sortedValues = undefined\n    const payloadsWithMeta = payloads.toSorted(PayloadBuilder.compareStorageMeta)\n    return payloadsWithMeta.map((payload) => {\n      return this.insertPayloadIntoCache(payload)\n    })\n  }\n\n  next(options?: ArchivistNextOptions): Promisable<WithStorageMeta<Payload>[]> {\n    const {\n      limit = 100, cursor, order, open = true,\n    } = options ?? {}\n    const all = order === 'desc' ? this.sortedValues.toReversed() : this.sortedValues\n    const startIndex = isDefined(cursor)\n      ? MemoryDriver.findIndexFromCursor(all, cursor) + (open ? 1 : 0)\n      : 0\n    return all.slice(startIndex, startIndex + limit)\n  }\n\n  private insertPayloadIntoCache(payload: WithStorageMeta<Payload>): WithStorageMeta<Payload> {\n    this.cache.set(payload._hash, payload)\n    this.dataHashIndex.set(payload._dataHash, payload._hash)\n    return payload\n  }\n\n  private rebuildDataHashIndex() {\n    this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n    const payloads = this.cache.dump().map(([, item]) => item.value)\n    for (const payload of payloads) {\n      this.dataHashIndex.set(payload._dataHash, payload._hash)\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
