Skip to main content

Dynamodb Datastore

@webframp/dynamodb-datastorev2026.09.04.1· 7d agoDATASTORES
01README

Stores swamp runtime data in AWS DynamoDB with conditional-write distributed locking (fencing tokens + TTL-as-defense-in-depth) and chunked blob storage for items exceeding DynamoDB's 400KB size limit. Emits OpenTelemetry spans for DynamoDB operations, lock acquisition/release, and push/pull sync so datastore activity is visible in traces when a TracerProvider is configured.

02Release Notes

2026.09.04.1

Changed: Bump @aws-sdk/* 3.1121.0 → 3.1126.0 (2 packages)

2026.08.29.1

Changed: Bump @aws-sdk/* 3.1120.0 → 3.1121.0. Dependency-only update; no schema, API, or behavioral changes.

2026.08.28.2

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.28.1

Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)

Fixed: Removed dead, unused @aws-sdk/client-dynamodb and @aws-sdk/lib-dynamodb entries from the deno.json import map. All source imports already use inline npm: specifiers, so the map entries were unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version into deno.lock. No behavioral change.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

03Datastores1
DynamoDB Datastoreconfigurable
@webframp/dynamodb-datastoredynamodb_datastore/mod.ts

Stores swamp runtime data in AWS DynamoDB with conditional-write distributed locking and chunked blob storage.

Config Fields

FieldTypeDescription
regionstringAWS region for the DynamoDB table
tableNamestringDynamoDB table name (single-table design: locks, file chunks/metadata, sync state)
endpoint?stringCustom endpoint URL — for DynamoDB Local or VPC endpoints only. Leave unset for production AWS.
autoCreateTablebooleanCreate the table (with GSI and TTL) on first use if missing. Requires
maxChunkBytesnumberMax raw bytes per chunk item before splitting a file across multiple DynamoDB items.
04Previous Versions19
2026.08.29.1

2026.08.29.1

Changed: Bump @aws-sdk/* 3.1120.0 → 3.1121.0. Dependency-only update; no schema, API, or behavioral changes.

2026.08.28.2

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.28.1

Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)

Fixed: Removed dead, unused @aws-sdk/client-dynamodb and @aws-sdk/lib-dynamodb entries from the deno.json import map. All source imports already use inline npm: specifiers, so the map entries were unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version into deno.lock. No behavioral change.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.28.2

2026.08.28.2

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.28.1

Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)

Fixed: Removed dead, unused @aws-sdk/client-dynamodb and @aws-sdk/lib-dynamodb entries from the deno.json import map. All source imports already use inline npm: specifiers, so the map entries were unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version into deno.lock. No behavioral change.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.28.1

2026.08.28.1

Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)

Fixed: Removed dead, unused @aws-sdk/client-dynamodb and @aws-sdk/lib-dynamodb entries from the deno.json import map. All source imports already use inline npm: specifiers, so the map entries were unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version into deno.lock. No behavioral change.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.26.3

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.26.1

2026.08.26.1

Changed: Normalized deno.json configuration for repo-wide consistency: added explicit compilerOptions.strict and migrated zod dependency to the import map (bare "zod" specifier instead of inline npm:zod@4.4.3). No behavioral changes — runtime resolution is identical.

2026.08.25.1

2026.08.25.1

Changed: Updated labels for improved extension discoverability. Added cross-cutting category labels (security, observability, finops, infrastructure, networking, compliance, devops, ai, incident-response) where applicable.

updated labels

2026.08.24.1

2026.08.24.1

Added Troubleshooting section documenting silent heartbeat/release failures, missing profile config, autoCreateTable permissions, chunk cleanup leaks, BatchWriteItem retry budget, dirty paths cap, maxChunkBytes limits, and retryable error codes.

2026.08.21.1

2026.08.21.1

Changed: Error messages name the DynamoDB operation and lock key/path involved, instead of a bare SDK error.

  • Lock operations (acquire, renew/heartbeat, inspect, forceRelease) wrap any SDK failure other than the expected ConditionalCheckFailedException contention signal with the operation and lock key (e.g. DynamoDB acquire failed for lock "/repo/state" in table "swamp-datastore": <reason>), instead of a bare AWS error with no indication of which lock was affected.
  • retryable() now accepts an opLabel, wired up across sync push/pull (shard/partition queries, chunk fetches, file writes, tombstones, the commit-sequence watermark, partition registration) so a failure names the file or partition it was operating on instead of an opaque SDK exception.
  • The table health check (createVerifier) now reports the failed operation and table name instead of the bare String(error).

No changes to request/response shapes, retry behavior, or existing successful-path behavior.

2026.08.20.1

Changed: Bump @aws-sdk/* 3.1111.0 → 3.1114.0 (2 packages)

2026.08.15.1

Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)

2026.08.05.1

Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)

2026.08.02.1

Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.08.20.1

2026.08.20.1

Changed: Bump @aws-sdk/* 3.1111.0 → 3.1114.0 (2 packages)

2026.08.15.1

Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)

2026.08.05.1

Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)

2026.08.02.1

Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.08.15.1

2026.08.15.1

Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)

2026.08.05.1

Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)

2026.08.02.1

Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.08.05.1

2026.08.05.1

Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)

2026.08.02.1

Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.08.02.1

2026.08.02.1

Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.07.31.1

2026.07.31.1

Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.07.29.1

2026.07.29.1

Added: Parallel push writes with bounded concurrency (10 concurrent writeFileEntry calls). Reduces push latency 5-10x for bulk operations.

Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull fast-path now compares a monotonic integer instead of parsing ISO timestamps, eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq for fast-path comparison across sessions.

Changed: Pull captures remoteSeq before partition queries (not after) to prevent TOCTOU races where concurrent pushes during the fetch window could be silently missed.

Changed: FakeDynamoTable test double handles numeric ADD operations and throws on undefined ExpressionAttributeValues references.

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.07.27.1

2026.07.27.1

Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)

Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

2026.07.25.1

2026.07.25.1

Added: OpenTelemetry spans for every layer of the datastore. Each SDK call emits one span named for the wire operation (DynamoDB PutItem, DynamoDB Query, DynamoDB BatchWriteItem, …) carrying aws.dynamodb.table_names, the GSI name when one is used, consumed capacity, returned and scanned counts, HTTP status, and the AWS request ID. The lock emits dynamodb-datastore lock acquire / release / withLock / inspect / forceRelease, with acquire recording wait duration and whether it contended. The sync service emits dynamodb-datastore pullChanged / pushChanged / hydrateFile / preparePush / commitPush with file counts, chunk counts, and fast-path indicators.

Added: Control-plane calls are covered too. DescribeTable, CreateTable, and UpdateTimeToLive go through the low-level client rather than the document client, so both clients are instrumented — table creation and health checks are no longer invisible.

Added: Retries are recorded as retry span events on the enclosing operation. This covers the throttling backoff in retryable, the UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in BatchWriteItem — the latter two retry independently of the shared helper and previously left no trace of partial throttling at all.

Changed: pullChanged reports datastore.files_pulled and datastore.files_deleted separately. The internal pull counter increments for both a downloaded file and a local file removed by a remote tombstone, so reporting it as a pull count would have overstated downloads.

Changed: Nothing observable without tracing configured. The extension depends on @opentelemetry/api only; the host process owns the TracerProvider, and every span is a no-op when none is registered. Existing behaviour, return values, and log output are unchanged.

Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.

Note: Span names are resolved from the SDK command's class identity rather than constructor.name, so they survive any minification the bundler applies. Lock heartbeat renewals run detached from the acquiring span, so a renewal is its own trace instead of a child of an already-ended lock acquire span.

updated labels

2026.07.24.3
2026.07.24.2
2026.07.24.1

2026.07.24.1

Changed: Bump AWS SDK from 3.1091.0 to 3.1094.0 (patch-level update).

05Stats
A
100 / 100
Downloads
32,462
Archive size
315.0 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License declared1/1earned
  • Verified public repository2/2earned
06Platforms
07Labels