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 0.1.x. Public APIs and persisted formats may change before 1.0.

The package is ESM-only ("type": "module"), and package.json marks it as sideEffects: false. It requires Node >= 18.0.0. Every peer dependency is optional: install only what your chosen adapters need. The following list contains all 55 importable subpaths plus ./package.json.

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 0.x 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 and the client-level re-exports
./client/composecreateSignalProtocolClient, createSignalProtocolClientConfig, SignalProtocolClientCompositionOptions, SignalProtocolClientIdentityConfig, SignalProtocolClientAdapterConfig
./client/configSignalProtocolClientConfig, DoubleRatchetConfig, SealedSenderConfig, SenderKeysConfig, ProgressCallback, ILogger
./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, HeadlessRotationResult
./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/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, IGroupServer, IGroupStateStore, DecryptedGroup, AccessControl
./blockingSignalProtocolBlockingManagerblockRecipient, 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 serialisation and deserialisation helpers
./hooksuseSessionHealth, useKeyRotation, useKeyRotationWithControls, useGroupMembership, useSingleFlight
./hooks/use-connection-presenceuseConnectionPresence
./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. useConnectionPresence also pulls AppState from react-native and useConvex from convex/react. It requires a React Native app on a Convex backend. It has its own subpath for that reason.

Types

SubpathExports
./typesISignalProtocolLocalStore, IProtocolStore, ISignalProtocolManager, 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/storeISignalProtocolLocalStore, 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/vaultISignalProtocolLocalSecretVault
./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/relayISignalProtocolRelayServer re-export, InMemorySignalProtocolRelayServer re-export, shared relay types
./remote/relay/typesISignalProtocolRelayServer, IProvisioningService, IKeyRotationService, envelope and bundle types
./remote/relay/convexconvexRelay(options), ConvexSignalProtocolRelayServer, ConvexSignalProtocolRelayApi, ConvexSignalProtocolRelayOptions, ConvexGroupServer, ConvexGroupServerApi
./remote/relay/convex/relayThe relay implementation module directly
./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.

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
./remote/relay/convex, ./remote/object-store/convex-r2convex
./remote/object-store/convex-r2@convex-dev/r2
./hooksreact
./hooks/use-connection-presencereact, react-native, convex

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