OpenE2EE

Package subpaths

The complete exports map of @open-e2ee/signal-protocol-sdk — every importable subpath, what it exports, and each entry's support status.

Applies to @open-e2ee/signal-protocol-sdk 6.0.x. Public APIs and persisted formats follow semantic versioning.

The package is ESM-only ("type": "module"), and package.json marks it as sideEffects: false. It requires Node >= 22.12.0. Every peer dependency is optional: install only what your chosen adapters need. The following tables contain all 57 entries of the exports map: the root, ./package.json, and 55 subpaths.

Imports are exact. @open-e2ee/signal-protocol-sdk/keys resolves. @open-e2ee/signal-protocol-sdk/dist/keys and @open-e2ee/signal-protocol-sdk/src/keys do not. Deep paths outside this map are not reachable through the exports field.

internal/** is implementation-only and not part of the supported external API. The exports map omits it, so you cannot import it through the package name. If a symbol exists only inside internal/, treat it as unavailable. Internal APIs carry no compatibility promise across releases.

Root

SubpathExports
.createSignalProtocolClient, createSignalProtocolClientConfig, SignalProtocolClient, PostQuantumPolicy, BraidPolicy, the error taxonomy, and the commonly used types
./package.jsonThe manifest itself, for tooling that reads the version

The root re-exports the broadly used surface. Everything below it is available for narrower imports and for symbols the root does not lift.

Client

SubpathExports
./clientSignalProtocolClient, bindRelayLifecycle, RelayLifecycleAppState, RelayLifecycleOptions, and the client-level re-exports
./client/composecreateSignalProtocolClient, createSignalProtocolClientConfig, SignalProtocolClientCompositionOptions, SignalProtocolClientIdentityConfig, SignalProtocolClientAdapterConfig
./client/configSignalProtocolClientConfig, DoubleRatchetConfig, SealedSenderConfig, SenderKeysConfig, ProgressCallback, Logger
./client/typesSendOptions, SendResult, DataMessageInput, SignalProtocolClientHooks, HookName, DecryptedEnvelope
./client/constantsMESSAGE_RECORD_TTL_MS, MAX_RETRY_RESPONSES_PER_MESSAGE, IMPLICIT_ENVELOPE_TYPES, isImplicitContentType
./client/headlessrotateKeysHeadless, checkRotationNeeded, HeadlessRotationOptions, PreKeyRotationResult
./client/endorsement-managerEndorsementManager, EndorsementCacheStore

./client/headless exists for scheduled maintenance without a UI: a background task or a server-side job that rotates keys. ./client/endorsement-manager supports GroupsV2 send endorsements.

Device

SubpathExports
./deviceprepareNewDeviceTransfer, prepareOldDeviceTransferWithBackup, createDeviceBackup, restoreDeviceBackup, encryptDeviceName, MAX_DEVICES
./device/provisioninggenerateProvisioningQR, parseProvisioningQR, provisionDevice, connectToProvisioningSession, receiveProvisioningMessage, getDeviceMetadata, cancelProvisioning
./device/lifecycleDeviceLifecycleManager, getLocalDeviceMetadata
./device/device-idgetDeviceId, getDeviceIdSync, preloadDeviceId, clearDeviceIdCache
./device/expogetDeviceMetadata, which reads the local device metadata from Expo and React Native
./device/constantsDEFAULT_DEVICE_ID, MAX_DEVICES, PROVISIONING_SESSION_TTL_MS, DEVICE_ID_KEY, DEVICE_NAME_KEY, LOCAL_IDENTITY_KEY, DEVICE_REGISTERED_USER_ID_KEY, DEVICE_OWNER_SENTINEL

There is no client.device.* namespace. Device linking, transfer, and backup are these modules. See device lifecycle and multi-device.

Keys, trust, and identity

SubpathExports
./keysRe-exports of ./keys/generation and ./keys/types
./keys/generationgenerateIdentityKeyPair, generateRegistrationId, generateEcSignedPreKey, generateEcSignedPreKeyId, generateEcOneTimePreKeys, generateKyberLastResortPreKey, generateKemOneTimePreKeys
./keys/typesCompositeIdentityV1, IdentityTrustState, ContactIdentityRecord, PreKeyBundle, PublicKey, IdentityType
./safetygenerateCompositeSafetyNumber, generateSingleKeyReferenceSafetyNumber, compareSafetyNumbers, isValidSafetyNumber, clearFingerprintCache, Fingerprint, DisplayableFingerprint, ScannableFingerprint, verify-URL helpers
./sealed-senderderiveAccessKey, ACCESS_KEY_BYTES

IdentityTrustState is exactly 'UNVERIFIED_TOFU' | 'VERIFIED'. See keys, identity, and sessions.

Feature modules

SubpathExports
./groupsGroupsV2Manager, createGroupId, GroupServer, GroupStateStore, DecryptedGroup, AccessControl
./groups/serverGroupAuthorizationServerEngine, GROUP_CHANGE_LOG_PAGE_LIMIT, encodeGroupAuthority, isGroupErrorDetail, serializeGroupBaseline, serializeGroupChangeCommitment, and the group server types
./blockingSignalProtocolBlockingManager — blockRecipient, unblockRecipient, isBlocked, listBlockedRecipients, applySyncSnapshot
./profileencryptProfileName, decryptProfileName, getOrCreateOwnProfileKey, setProfileKeyStorage, updateEncryptedProfile
./usernameformatUsername, hashUsername, parseUsername
./username/linkcreateUsernameLink, decryptUsernameLink
./mediaMediaAttachmentPointer, MediaAttachmentMessage, MediaAttachmentError, MediaAttachmentErrorCode, MediaAttachmentTransferOptions, MEDIA_ATTACHMENT_POLICY_DEFAULTS, MEDIA_ATTACHMENT_POLICY_PRESETS, generateMediaAttachmentUploadRequestId
./filesstreamingEncrypt, streamingDecrypt, DEFAULT_SEGMENT_SIZE, secureZeroBytes
./zk/groupscomputeProfileKeyVersion, deriveGroupSecretParams, getGroupPublicParams, uuidToBytes, serviceIdBinary, SERVICE_ID_ACI, SERVICE_ID_PNI
./zk/credentialsCredential key serialization and deserialization helpers
./hooksuseSessionHealth, useKeyRotation, useKeyRotationWithControls, useRelayConnectionState, useRelayLifecycle, useGroupMembership, useSingleFlight
./loggercreateDefaultSignalProtocolLogger, resolveSignalProtocolLogger
./server-clockrecordServerClockSample, estimateServerTimestamp
./encodingbytesToBase64, base64ToBytes, and the shared encoding helpers
./encoding/hexbytesToHex, hexToBytes
./utils/retrywithRetry, isRetryableError, SignalProtocolRetryConfig

./hooks are React hooks and need react installed. The subpath also imports AppState from react-native when it loads, because useKeyRotation and useRelayLifecycle read it.

Types

SubpathExports
./typesSignalProtocolLocalStore, ProtocolStore, SignalProtocolManager, the error taxonomy, and the shared protocol types
./types/addressProtocolAddress and its create, parse, toString, equals, isUser, isValid, toStorageKey, fromStorageKey helpers
./types/messagesMessageType, ContentHint, MessageHeader, RatchetMessage, PreKeyMessage, ProtocolMessage
./types/utilsBase64, Hex, Bytes branded types with asBase64, asHex, asBytes, toBase64, toHex, isValidBase64, isValidHex

Local storage and vault

SubpathExportsStatus
./local/storeSignalProtocolLocalStore, InMemorySignalProtocolStore re-export, shared store types—
./local/store/expoexpoStore(options?), ExpoSignalProtocolStore, ExpoSignalProtocolStoreFactoryOptionsPrimary supported adapter
./local/store/expo/dbconfigureSignalProtocolExpoDbBindings, resetSignalProtocolExpoDbBindings, getDrizzle, getRawDatabase, re-exported Drizzle operatorsAdvanced
./local/store/expo/schemaDrizzle table definitions and row types for the Expo schemaAdvanced
./local/store/nodenodeStore(config?), NodeSignalProtocolStore, NodeSignalProtocolStoreConfigNon-mobile and server-side
./local/store/webindexedDbStore(), IndexedDbSignalProtocolStoreSupported
./local/store/react-nativereactNativeStore(...), ReactNativeKeyValueStorage, assertBackendConformance, createReferenceReactNativeBackendSupported; caller-provided backend
./local/store/memoryinMemoryStore(), InMemorySignalProtocolStoreDevelopment only
./local/vaultSignalProtocolLocalSecretVault—
./local/vault/expo-secure-storeVault implementation over expo-secure-store—

Await the async indexedDbStore() and nodeStore() functions. Do not await expoStore() or inMemoryStore().

The expo/db and expo/schema subpaths exist so applications that already run Drizzle can share one database handle and inspect the schema. Writing to those tables directly bypasses the store's atomicity guarantees. Read Adapter interfaces before you do.

Remote relay

SubpathExportsStatus
./remote/relaySignalProtocolRelayServer re-export, InMemorySignalProtocolRelayServer re-export, shared relay types—
./remote/relay/typesSignalProtocolRelayServer, ProvisioningService, KeyRotationService, RelayConnectionState, RelayConnectionReason, Unsubscribe, envelope and bundle types—
./remote/relay/memoryinMemoryRelay(), InMemorySignalProtocolRelayServerDevelopment only

inMemoryRelay() is in-memory and single-process. It is the right thing for tests and for the quickstart, and the wrong thing for anything a user touches. The OpenE2EE Signal Protocol Relay is reached through createHostedSignalProtocolClient() from the package root, not through a relay subpath: see Signal Protocol Relay.

Remote object store

SubpathExportsStatus
./remote/object-storeSignalProtocolRemoteObjectStore and the brokered request and response types—
./remote/object-store/convex-r2convexR2ObjectStore(config), ConvexR2ObjectStoreConfig—
./remote/object-store/convex-r2/serverServer-side broker helpers for the Convex R2 integration—
./remote/object-store/s3s3ObjectStore(config), S3ObjectStoreBroker, S3ObjectStoreConfig—

The /server subpath runs on your backend, not on the device. It is the half that holds the provider credential.

Peer dependencies by subpath

The package declares all peer dependencies as optional. Install only what the subpaths you import require.

If you importYou need
./local/store/expo, ./local/store/expo/*expo, expo-sqlite, expo-crypto, drizzle-orm
./local/vault/expo-secure-storeexpo-secure-store
./local/store/webidb
./local/store/react-nativereact-native
./device/device-id on React Nativereact-native-device-info, expo-device, expo-constants
./device/exporeact-native, expo-constants
./remote/object-store/convex-r2, ./remote/object-store/convex-r2/serverconvex
./remote/object-store/convex-r2@convex-dev/r2
./hooksreact, react-native

Security and protocol policy covers the six direct production dependencies that the package installs, which resolve to six packages in total: @noble/ciphers, @noble/curves, @noble/hashes, @noble/post-quantum, async-lock, and unique-names-generator.

Next

On this page