@unknownncat/swt-libsignal 1.0.7 → 1.1.0

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.
Files changed (47) hide show
  1. package/dist/core/index.d.ts +3 -0
  2. package/dist/core/index.js +3 -0
  3. package/dist/crypto.js +19 -16
  4. package/dist/errors/index.d.ts +2 -0
  5. package/dist/errors/index.js +2 -0
  6. package/dist/errors/protobuf-validation-error.d.ts +4 -0
  7. package/dist/errors/protobuf-validation-error.js +6 -0
  8. package/dist/index.d.ts +10 -8
  9. package/dist/index.js +6 -5
  10. package/dist/job_queue.d.ts +4 -1
  11. package/dist/job_queue.js +32 -9
  12. package/dist/proto/generated/whisper-text-protocol.d.ts +29 -0
  13. package/dist/proto/generated/whisper-text-protocol.js +132 -0
  14. package/dist/proto/index.d.ts +1 -0
  15. package/dist/proto/index.js +1 -0
  16. package/dist/protobuf.d.ts +1 -1
  17. package/dist/protobuf.js +1 -2
  18. package/dist/session/builder/session-builder.js +20 -17
  19. package/dist/session/builder/types.d.ts +8 -6
  20. package/dist/session/cipher/encoding.d.ts +2 -6
  21. package/dist/session/cipher/encoding.js +35 -119
  22. package/dist/session/cipher/session-cipher.js +17 -12
  23. package/dist/session/cipher/types.d.ts +16 -8
  24. package/dist/session/record/session-entry.js +4 -4
  25. package/dist/session/record/types.d.ts +1 -1
  26. package/dist/session/storage/adapter.d.ts +22 -9
  27. package/dist/session/storage/adapter.js +72 -18
  28. package/dist/session/storage/in-memory.d.ts +21 -12
  29. package/dist/session/storage/in-memory.js +51 -19
  30. package/dist/session/storage/index.d.ts +14 -14
  31. package/dist/session/storage/index.js +16 -8
  32. package/dist/session/storage/migrations.d.ts +1 -1
  33. package/dist/session/storage/migrations.js +5 -3
  34. package/dist/session/storage/runtime.d.ts +7 -0
  35. package/dist/session/storage/runtime.js +45 -0
  36. package/dist/session/storage/sqlite-async.d.ts +26 -0
  37. package/dist/session/storage/sqlite-async.js +95 -0
  38. package/dist/session/storage/types.d.ts +53 -13
  39. package/dist/session/utils.js +2 -2
  40. package/dist/transport/index.d.ts +1 -0
  41. package/dist/transport/index.js +1 -0
  42. package/dist/types/index.js +1 -0
  43. package/dist/utils/index.d.ts +2 -0
  44. package/dist/utils/index.js +2 -0
  45. package/package.json +1 -3
  46. package/dist/generated/WhisperTextProtocol.d.ts +0 -49
  47. package/dist/generated/WhisperTextProtocol.js +0 -199
@@ -1,19 +1,19 @@
1
1
  export * from './types';
2
+ export * from './runtime';
2
3
  export * from './in-memory';
3
4
  export * from './migrations';
4
5
  export * from './adapter';
5
- import { StorageAdapter } from './types';
6
- export declare class StorageManager {
7
- adapter: StorageAdapter;
8
- constructor(adapter: StorageAdapter);
9
- get<T = any>(key: string): Promise<T | undefined>;
10
- set<T = any>(key: string, value: T): Promise<void>;
11
- delete(key: string): Promise<void>;
12
- batch(ops: Array<{
13
- type: 'put' | 'del';
14
- key: string;
15
- value?: any;
16
- }>): Promise<void>;
17
- close(): Promise<void>;
6
+ export * from './sqlite-async';
7
+ import type { BatchDeleteEntry, BatchGetOptions, BatchSetEntry, MaybePromise, StorageAdapter } from './types';
8
+ export declare class StorageManager<TValue = Uint8Array> {
9
+ readonly adapter: StorageAdapter<TValue>;
10
+ constructor(adapter: StorageAdapter<TValue>);
11
+ get(key: string): MaybePromise<TValue | undefined>;
12
+ set(key: string, value: TValue): MaybePromise<void>;
13
+ delete(key: string): MaybePromise<void>;
14
+ getMany(keys: readonly string[], options?: BatchGetOptions): MaybePromise<readonly (TValue | undefined)[]>;
15
+ setMany(entries: readonly BatchSetEntry<TValue>[]): MaybePromise<void>;
16
+ deleteMany(entries: readonly BatchDeleteEntry[]): MaybePromise<void>;
17
+ close(): MaybePromise<void>;
18
18
  }
19
- export declare function createStorageManager(adapter: StorageAdapter): StorageManager;
19
+ export declare function createStorageManager<TValue = Uint8Array>(adapter: StorageAdapter<TValue>): StorageManager<TValue>;
@@ -1,27 +1,35 @@
1
1
  export * from './types';
2
+ export * from './runtime';
2
3
  export * from './in-memory';
3
4
  export * from './migrations';
4
5
  export * from './adapter';
6
+ export * from './sqlite-async';
7
+ import { deleteMany, deleteValue, getMany, getValue, setMany, setValue } from './runtime';
5
8
  export class StorageManager {
6
9
  adapter;
7
10
  constructor(adapter) {
8
11
  this.adapter = adapter;
9
12
  }
10
13
  get(key) {
11
- return this.adapter.get(key);
14
+ return getValue(this.adapter, key);
12
15
  }
13
16
  set(key, value) {
14
- return this.adapter.set(key, value);
17
+ return setValue(this.adapter, key, value);
15
18
  }
16
19
  delete(key) {
17
- return this.adapter.delete(key);
20
+ return deleteValue(this.adapter, key);
18
21
  }
19
- batch(ops) {
20
- return this.adapter.batch(ops);
22
+ getMany(keys, options) {
23
+ return getMany(this.adapter, keys, options);
21
24
  }
22
- async close() {
23
- if (this.adapter.close)
24
- return this.adapter.close();
25
+ setMany(entries) {
26
+ return setMany(this.adapter, entries);
27
+ }
28
+ deleteMany(entries) {
29
+ return deleteMany(this.adapter, entries);
30
+ }
31
+ close() {
32
+ return this.adapter.close?.();
25
33
  }
26
34
  }
27
35
  export function createStorageManager(adapter) {
@@ -1,2 +1,2 @@
1
- import { StorageAdapter } from './types';
1
+ import type { StorageAdapter } from './types';
2
2
  export declare function runMigrations(adapter: StorageAdapter, fromVersion: number, toVersion: number): Promise<void>;
@@ -1,6 +1,8 @@
1
+ function hasMigrate(adapter) {
2
+ return typeof adapter.migrate === 'function';
3
+ }
1
4
  export async function runMigrations(adapter, fromVersion, toVersion) {
2
- if (adapter.migrate) {
3
- await adapter.migrate(fromVersion, toVersion);
5
+ if (!hasMigrate(adapter))
4
6
  return;
5
- }
7
+ await adapter.migrate(fromVersion, toVersion);
6
8
  }
@@ -0,0 +1,7 @@
1
+ import type { BatchDeleteEntry, BatchGetOptions, BatchSetEntry, MaybePromise, StorageAdapter } from './types';
2
+ export declare function getValue<TValue>(adapter: StorageAdapter<TValue>, key: string): MaybePromise<TValue | undefined>;
3
+ export declare function setValue<TValue>(adapter: StorageAdapter<TValue>, key: string, value: TValue): MaybePromise<void>;
4
+ export declare function deleteValue<TValue>(adapter: StorageAdapter<TValue>, key: string): MaybePromise<void>;
5
+ export declare function getMany<TValue>(adapter: StorageAdapter<TValue>, keys: readonly string[], options?: BatchGetOptions): MaybePromise<readonly (TValue | undefined)[]>;
6
+ export declare function setMany<TValue>(adapter: StorageAdapter<TValue>, entries: readonly BatchSetEntry<TValue>[]): MaybePromise<void>;
7
+ export declare function deleteMany<TValue>(adapter: StorageAdapter<TValue>, entries: readonly BatchDeleteEntry[]): MaybePromise<void>;
@@ -0,0 +1,45 @@
1
+ function isPromiseLike(value) {
2
+ return typeof value?.then === 'function';
3
+ }
4
+ export function getValue(adapter, key) {
5
+ return adapter.get(key);
6
+ }
7
+ export function setValue(adapter, key, value) {
8
+ return adapter.set(key, value);
9
+ }
10
+ export function deleteValue(adapter, key) {
11
+ return adapter.delete(key);
12
+ }
13
+ export function getMany(adapter, keys, options) {
14
+ if (adapter.getMany)
15
+ return adapter.getMany(keys, options);
16
+ const out = new Array(keys.length);
17
+ for (let i = 0; i < keys.length; i++) {
18
+ const value = adapter.get(keys[i]);
19
+ if (isPromiseLike(value)) {
20
+ return Promise.all(keys.map((key) => Promise.resolve(adapter.get(key))));
21
+ }
22
+ out[i] = value;
23
+ }
24
+ return out;
25
+ }
26
+ export function setMany(adapter, entries) {
27
+ if (adapter.setMany)
28
+ return adapter.setMany(entries);
29
+ for (let i = 0; i < entries.length; i++) {
30
+ const r = adapter.set(entries[i].key, entries[i].value);
31
+ if (isPromiseLike(r)) {
32
+ return Promise.all(entries.map((e) => Promise.resolve(adapter.set(e.key, e.value)))).then(() => undefined);
33
+ }
34
+ }
35
+ }
36
+ export function deleteMany(adapter, entries) {
37
+ if (adapter.deleteMany)
38
+ return adapter.deleteMany(entries);
39
+ for (let i = 0; i < entries.length; i++) {
40
+ const r = adapter.delete(entries[i].key);
41
+ if (isPromiseLike(r)) {
42
+ return Promise.all(entries.map((e) => Promise.resolve(adapter.delete(e.key)))).then(() => undefined);
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,26 @@
1
+ import type { AsyncStorageAdapter, BatchDeleteEntry, BatchGetOptions, BatchSetEntry } from './types';
2
+ export interface FileStorageAdapterOptions {
3
+ readonly flushEveryWrites?: number;
4
+ }
5
+ export declare class FileAsyncStorageAdapter implements AsyncStorageAdapter<Uint8Array> {
6
+ readonly name = "file-async";
7
+ private readonly map;
8
+ private readonly path;
9
+ private readonly flushEveryWrites;
10
+ private pendingWrites;
11
+ private initialized;
12
+ constructor(path: string, options?: FileStorageAdapterOptions);
13
+ private init;
14
+ private flushIfNeeded;
15
+ get(key: string): Promise<Uint8Array | undefined>;
16
+ set(key: string, value: Uint8Array): Promise<void>;
17
+ delete(key: string): Promise<void>;
18
+ getMany(keys: readonly string[], _options?: BatchGetOptions): Promise<readonly (Uint8Array | undefined)[]>;
19
+ setMany(entries: readonly BatchSetEntry<Uint8Array>[]): Promise<void>;
20
+ deleteMany(entries: readonly BatchDeleteEntry[]): Promise<void>;
21
+ zeroize(key: string): Promise<void>;
22
+ clear(options?: {
23
+ readonly secure?: boolean;
24
+ }): Promise<void>;
25
+ close(): Promise<void>;
26
+ }
@@ -0,0 +1,95 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export class FileAsyncStorageAdapter {
4
+ name = 'file-async';
5
+ map = new Map();
6
+ path;
7
+ flushEveryWrites;
8
+ pendingWrites = 0;
9
+ initialized = false;
10
+ constructor(path, options = {}) {
11
+ this.path = path;
12
+ this.flushEveryWrites = options.flushEveryWrites ?? 64;
13
+ }
14
+ async init() {
15
+ if (this.initialized)
16
+ return;
17
+ this.initialized = true;
18
+ try {
19
+ const raw = await readFile(this.path, 'utf8');
20
+ const parsed = JSON.parse(raw);
21
+ for (const [k, v] of Object.entries(parsed)) {
22
+ this.map.set(k, Uint8Array.from(Buffer.from(v, 'base64')));
23
+ }
24
+ }
25
+ catch {
26
+ }
27
+ }
28
+ async flushIfNeeded(force = false) {
29
+ if (!force && this.pendingWrites < this.flushEveryWrites)
30
+ return;
31
+ this.pendingWrites = 0;
32
+ const out = {};
33
+ for (const [k, v] of this.map.entries()) {
34
+ out[k] = Buffer.from(v).toString('base64');
35
+ }
36
+ await mkdir(dirname(this.path), { recursive: true });
37
+ await writeFile(this.path, JSON.stringify(out), 'utf8');
38
+ }
39
+ async get(key) {
40
+ await this.init();
41
+ const value = this.map.get(key);
42
+ return value?.slice();
43
+ }
44
+ async set(key, value) {
45
+ await this.init();
46
+ this.map.set(key, value.slice());
47
+ this.pendingWrites++;
48
+ await this.flushIfNeeded();
49
+ }
50
+ async delete(key) {
51
+ await this.init();
52
+ this.map.delete(key);
53
+ this.pendingWrites++;
54
+ await this.flushIfNeeded();
55
+ }
56
+ async getMany(keys, _options) {
57
+ await this.init();
58
+ const out = new Array(keys.length);
59
+ for (let i = 0; i < keys.length; i++)
60
+ out[i] = this.map.get(keys[i])?.slice();
61
+ return out;
62
+ }
63
+ async setMany(entries) {
64
+ await this.init();
65
+ for (let i = 0; i < entries.length; i++) {
66
+ this.map.set(entries[i].key, entries[i].value.slice());
67
+ }
68
+ this.pendingWrites += entries.length;
69
+ await this.flushIfNeeded();
70
+ }
71
+ async deleteMany(entries) {
72
+ await this.init();
73
+ for (let i = 0; i < entries.length; i++)
74
+ this.map.delete(entries[i].key);
75
+ this.pendingWrites += entries.length;
76
+ await this.flushIfNeeded();
77
+ }
78
+ async zeroize(key) {
79
+ await this.init();
80
+ this.map.get(key)?.fill(0);
81
+ }
82
+ async clear(options) {
83
+ await this.init();
84
+ if (options?.secure) {
85
+ for (const value of this.map.values())
86
+ value.fill(0);
87
+ }
88
+ this.map.clear();
89
+ this.pendingWrites++;
90
+ await this.flushIfNeeded(true);
91
+ }
92
+ async close() {
93
+ await this.flushIfNeeded(true);
94
+ }
95
+ }
@@ -1,18 +1,58 @@
1
- export type BatchOp = {
2
- type: 'put' | 'del';
3
- key: string;
4
- value?: any;
1
+ export type MaybePromise<T> = T | Promise<T>;
2
+ export interface BatchGetOptions {
3
+ readonly prefetch?: boolean;
4
+ readonly cacheHint?: 'none' | 'hot' | 'ephemeral';
5
+ }
6
+ export interface BatchSetEntry<TValue = Uint8Array> {
7
+ readonly key: string;
8
+ readonly value: TValue;
9
+ }
10
+ export interface BatchDeleteEntry {
11
+ readonly key: string;
12
+ }
13
+ export type BatchOperation<TValue = Uint8Array> = {
14
+ readonly type: 'set';
15
+ readonly key: string;
16
+ readonly value: TValue;
17
+ } | {
18
+ readonly type: 'delete';
19
+ readonly key: string;
5
20
  };
6
- export interface StorageAdapter {
7
- get<T = any>(key: string): Promise<T | undefined>;
8
- set<T = any>(key: string, value: T): Promise<void>;
21
+ export interface SecureStorageControls {
22
+ zeroize?(key: string): MaybePromise<void>;
23
+ clear?(options?: {
24
+ readonly secure?: boolean;
25
+ }): MaybePromise<void>;
26
+ close?(): MaybePromise<void>;
27
+ }
28
+ export interface BaseStorageAdapter<TValue = Uint8Array> extends SecureStorageControls {
29
+ readonly name?: string;
30
+ get(key: string): TValue | undefined;
31
+ set(key: string, value: TValue): void;
32
+ delete(key: string): void;
33
+ getMany?(keys: readonly string[], options?: BatchGetOptions): readonly (TValue | undefined)[];
34
+ setMany?(entries: readonly BatchSetEntry<TValue>[]): void;
35
+ deleteMany?(entries: readonly BatchDeleteEntry[]): void;
36
+ prefetch?(keys: readonly string[]): void;
37
+ cacheHint?(key: string, hint: NonNullable<BatchGetOptions['cacheHint']>): void;
38
+ }
39
+ export interface TransactionalStorageAdapter<TValue = Uint8Array> {
40
+ transaction<T>(run: (tx: BaseStorageAdapter<TValue>) => MaybePromise<T>): MaybePromise<T>;
41
+ }
42
+ export interface AsyncStorageAdapter<TValue = Uint8Array> extends SecureStorageControls {
43
+ readonly name?: string;
44
+ get(key: string): Promise<TValue | undefined>;
45
+ set(key: string, value: TValue): Promise<void>;
9
46
  delete(key: string): Promise<void>;
10
- batch(ops: BatchOp[]): Promise<void>;
11
- clear?(): Promise<void>;
12
- close?(): Promise<void>;
13
- name?: string;
47
+ getMany?(keys: readonly string[], options?: BatchGetOptions): Promise<readonly (TValue | undefined)[]>;
48
+ setMany?(entries: readonly BatchSetEntry<TValue>[]): Promise<void>;
49
+ deleteMany?(entries: readonly BatchDeleteEntry[]): Promise<void>;
50
+ prefetch?(keys: readonly string[]): Promise<void>;
51
+ cacheHint?(key: string, hint: NonNullable<BatchGetOptions['cacheHint']>): Promise<void>;
14
52
  migrate?(fromVersion: number, toVersion: number): Promise<void>;
15
53
  }
16
- export interface StorageManagerOptions {
17
- adapter: StorageAdapter;
54
+ export type StorageAdapter<TValue = Uint8Array> = BaseStorageAdapter<TValue> | AsyncStorageAdapter<TValue>;
55
+ export interface StorageManagerOptions<TValue = Uint8Array> {
56
+ readonly adapter: StorageAdapter<TValue>;
18
57
  }
58
+ export type BatchOp = BatchOperation<unknown>;
@@ -1,7 +1,7 @@
1
1
  export function assertUint8(value) {
2
2
  if (!(value instanceof Uint8Array)) {
3
- const name = (value instanceof Object)
4
- ? value.constructor.name
3
+ const name = (value !== null && typeof value === 'object' && 'constructor' in value)
4
+ ? value.constructor.name ?? 'Object'
5
5
  : typeof value;
6
6
  throw new TypeError(`Expected Uint8Array instead of: ${name}`);
7
7
  }
@@ -0,0 +1 @@
1
+ export { WhisperMessageEncoder } from '../session/cipher/encoding';
@@ -0,0 +1 @@
1
+ export { WhisperMessageEncoder } from '../session/cipher/encoding';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { assertUint8, toBase64, fromBase64, u8 } from '../session/utils';
2
+ export { enqueue } from '../job_queue';
@@ -0,0 +1,2 @@
1
+ export { assertUint8, toBase64, fromBase64, u8 } from '../session/utils';
2
+ export { enqueue } from '../job_queue';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unknownncat/swt-libsignal",
3
- "version": "1.0.7",
3
+ "version": "1.1.0",
4
4
  "description": "Libsignal reimplementation using libsodium",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,11 +33,9 @@
33
33
  "node": ">=20"
34
34
  },
35
35
  "dependencies": {
36
- "@protobuf-ts/runtime": "^2.11.1",
37
36
  "libsodium-wrappers": "^0.8.2"
38
37
  },
39
38
  "devDependencies": {
40
- "@protobuf-ts/plugin": "^2.11.1",
41
39
  "@types/node": "^20.19.33",
42
40
  "@vitest/coverage-v8": "^2.0.0",
43
41
  "cpy-cli": "^7.0.0",
@@ -1,49 +0,0 @@
1
- import type { BinaryWriteOptions } from "@protobuf-ts/runtime";
2
- import type { IBinaryWriter } from "@protobuf-ts/runtime";
3
- import type { BinaryReadOptions } from "@protobuf-ts/runtime";
4
- import type { IBinaryReader } from "@protobuf-ts/runtime";
5
- import type { PartialMessage } from "@protobuf-ts/runtime";
6
- import { MessageType } from "@protobuf-ts/runtime";
7
- export interface WhisperMessage {
8
- ephemeralKey?: Uint8Array;
9
- counter?: number;
10
- previousCounter?: number;
11
- ciphertext?: Uint8Array;
12
- }
13
- export interface PreKeyWhisperMessage {
14
- registrationId?: number;
15
- preKeyId?: number;
16
- signedPreKeyId?: number;
17
- baseKey?: Uint8Array;
18
- identityKey?: Uint8Array;
19
- message?: Uint8Array;
20
- }
21
- export interface KeyExchangeMessage {
22
- id?: number;
23
- baseKey?: Uint8Array;
24
- ephemeralKey?: Uint8Array;
25
- identityKey?: Uint8Array;
26
- baseKeySignature?: Uint8Array;
27
- }
28
- declare class WhisperMessage$Type extends MessageType<WhisperMessage> {
29
- constructor();
30
- create(value?: PartialMessage<WhisperMessage>): WhisperMessage;
31
- internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: WhisperMessage): WhisperMessage;
32
- internalBinaryWrite(message: WhisperMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter;
33
- }
34
- export declare const WhisperMessage: WhisperMessage$Type;
35
- declare class PreKeyWhisperMessage$Type extends MessageType<PreKeyWhisperMessage> {
36
- constructor();
37
- create(value?: PartialMessage<PreKeyWhisperMessage>): PreKeyWhisperMessage;
38
- internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PreKeyWhisperMessage): PreKeyWhisperMessage;
39
- internalBinaryWrite(message: PreKeyWhisperMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter;
40
- }
41
- export declare const PreKeyWhisperMessage: PreKeyWhisperMessage$Type;
42
- declare class KeyExchangeMessage$Type extends MessageType<KeyExchangeMessage> {
43
- constructor();
44
- create(value?: PartialMessage<KeyExchangeMessage>): KeyExchangeMessage;
45
- internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: KeyExchangeMessage): KeyExchangeMessage;
46
- internalBinaryWrite(message: KeyExchangeMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter;
47
- }
48
- export declare const KeyExchangeMessage: KeyExchangeMessage$Type;
49
- export {};
@@ -1,199 +0,0 @@
1
- import { WireType } from "@protobuf-ts/runtime";
2
- import { UnknownFieldHandler } from "@protobuf-ts/runtime";
3
- import { reflectionMergePartial } from "@protobuf-ts/runtime";
4
- import { MessageType } from "@protobuf-ts/runtime";
5
- class WhisperMessage$Type extends MessageType {
6
- constructor() {
7
- super("textsecure.WhisperMessage", [
8
- { no: 1, name: "ephemeral_key", kind: "scalar", opt: true, T: 12 },
9
- { no: 2, name: "counter", kind: "scalar", opt: true, T: 13 },
10
- { no: 3, name: "previous_counter", kind: "scalar", opt: true, T: 13 },
11
- { no: 4, name: "ciphertext", kind: "scalar", opt: true, T: 12 }
12
- ]);
13
- }
14
- create(value) {
15
- const message = globalThis.Object.create((this.messagePrototype));
16
- if (value !== undefined)
17
- reflectionMergePartial(this, message, value);
18
- return message;
19
- }
20
- internalBinaryRead(reader, length, options, target) {
21
- let message = target ?? this.create(), end = reader.pos + length;
22
- while (reader.pos < end) {
23
- let [fieldNo, wireType] = reader.tag();
24
- switch (fieldNo) {
25
- case 1:
26
- message.ephemeralKey = reader.bytes();
27
- break;
28
- case 2:
29
- message.counter = reader.uint32();
30
- break;
31
- case 3:
32
- message.previousCounter = reader.uint32();
33
- break;
34
- case 4:
35
- message.ciphertext = reader.bytes();
36
- break;
37
- default:
38
- let u = options.readUnknownField;
39
- if (u === "throw")
40
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
41
- let d = reader.skip(wireType);
42
- if (u !== false)
43
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
44
- }
45
- }
46
- return message;
47
- }
48
- internalBinaryWrite(message, writer, options) {
49
- if (message.ephemeralKey !== undefined)
50
- writer.tag(1, WireType.LengthDelimited).bytes(message.ephemeralKey);
51
- if (message.counter !== undefined)
52
- writer.tag(2, WireType.Varint).uint32(message.counter);
53
- if (message.previousCounter !== undefined)
54
- writer.tag(3, WireType.Varint).uint32(message.previousCounter);
55
- if (message.ciphertext !== undefined)
56
- writer.tag(4, WireType.LengthDelimited).bytes(message.ciphertext);
57
- let u = options.writeUnknownFields;
58
- if (u !== false)
59
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
60
- return writer;
61
- }
62
- }
63
- export const WhisperMessage = new WhisperMessage$Type();
64
- class PreKeyWhisperMessage$Type extends MessageType {
65
- constructor() {
66
- super("textsecure.PreKeyWhisperMessage", [
67
- { no: 5, name: "registration_id", kind: "scalar", opt: true, T: 13 },
68
- { no: 1, name: "pre_key_id", kind: "scalar", opt: true, T: 13 },
69
- { no: 6, name: "signed_pre_key_id", kind: "scalar", opt: true, T: 13 },
70
- { no: 2, name: "base_key", kind: "scalar", opt: true, T: 12 },
71
- { no: 3, name: "identity_key", kind: "scalar", opt: true, T: 12 },
72
- { no: 4, name: "message", kind: "scalar", opt: true, T: 12 }
73
- ]);
74
- }
75
- create(value) {
76
- const message = globalThis.Object.create((this.messagePrototype));
77
- if (value !== undefined)
78
- reflectionMergePartial(this, message, value);
79
- return message;
80
- }
81
- internalBinaryRead(reader, length, options, target) {
82
- let message = target ?? this.create(), end = reader.pos + length;
83
- while (reader.pos < end) {
84
- let [fieldNo, wireType] = reader.tag();
85
- switch (fieldNo) {
86
- case 5:
87
- message.registrationId = reader.uint32();
88
- break;
89
- case 1:
90
- message.preKeyId = reader.uint32();
91
- break;
92
- case 6:
93
- message.signedPreKeyId = reader.uint32();
94
- break;
95
- case 2:
96
- message.baseKey = reader.bytes();
97
- break;
98
- case 3:
99
- message.identityKey = reader.bytes();
100
- break;
101
- case 4:
102
- message.message = reader.bytes();
103
- break;
104
- default:
105
- let u = options.readUnknownField;
106
- if (u === "throw")
107
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
108
- let d = reader.skip(wireType);
109
- if (u !== false)
110
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
111
- }
112
- }
113
- return message;
114
- }
115
- internalBinaryWrite(message, writer, options) {
116
- if (message.preKeyId !== undefined)
117
- writer.tag(1, WireType.Varint).uint32(message.preKeyId);
118
- if (message.baseKey !== undefined)
119
- writer.tag(2, WireType.LengthDelimited).bytes(message.baseKey);
120
- if (message.identityKey !== undefined)
121
- writer.tag(3, WireType.LengthDelimited).bytes(message.identityKey);
122
- if (message.message !== undefined)
123
- writer.tag(4, WireType.LengthDelimited).bytes(message.message);
124
- if (message.registrationId !== undefined)
125
- writer.tag(5, WireType.Varint).uint32(message.registrationId);
126
- if (message.signedPreKeyId !== undefined)
127
- writer.tag(6, WireType.Varint).uint32(message.signedPreKeyId);
128
- let u = options.writeUnknownFields;
129
- if (u !== false)
130
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
131
- return writer;
132
- }
133
- }
134
- export const PreKeyWhisperMessage = new PreKeyWhisperMessage$Type();
135
- class KeyExchangeMessage$Type extends MessageType {
136
- constructor() {
137
- super("textsecure.KeyExchangeMessage", [
138
- { no: 1, name: "id", kind: "scalar", opt: true, T: 13 },
139
- { no: 2, name: "base_key", kind: "scalar", opt: true, T: 12 },
140
- { no: 3, name: "ephemeral_key", kind: "scalar", opt: true, T: 12 },
141
- { no: 4, name: "identity_key", kind: "scalar", opt: true, T: 12 },
142
- { no: 5, name: "base_key_signature", kind: "scalar", opt: true, T: 12 }
143
- ]);
144
- }
145
- create(value) {
146
- const message = globalThis.Object.create((this.messagePrototype));
147
- if (value !== undefined)
148
- reflectionMergePartial(this, message, value);
149
- return message;
150
- }
151
- internalBinaryRead(reader, length, options, target) {
152
- let message = target ?? this.create(), end = reader.pos + length;
153
- while (reader.pos < end) {
154
- let [fieldNo, wireType] = reader.tag();
155
- switch (fieldNo) {
156
- case 1:
157
- message.id = reader.uint32();
158
- break;
159
- case 2:
160
- message.baseKey = reader.bytes();
161
- break;
162
- case 3:
163
- message.ephemeralKey = reader.bytes();
164
- break;
165
- case 4:
166
- message.identityKey = reader.bytes();
167
- break;
168
- case 5:
169
- message.baseKeySignature = reader.bytes();
170
- break;
171
- default:
172
- let u = options.readUnknownField;
173
- if (u === "throw")
174
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
175
- let d = reader.skip(wireType);
176
- if (u !== false)
177
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
178
- }
179
- }
180
- return message;
181
- }
182
- internalBinaryWrite(message, writer, options) {
183
- if (message.id !== undefined)
184
- writer.tag(1, WireType.Varint).uint32(message.id);
185
- if (message.baseKey !== undefined)
186
- writer.tag(2, WireType.LengthDelimited).bytes(message.baseKey);
187
- if (message.ephemeralKey !== undefined)
188
- writer.tag(3, WireType.LengthDelimited).bytes(message.ephemeralKey);
189
- if (message.identityKey !== undefined)
190
- writer.tag(4, WireType.LengthDelimited).bytes(message.identityKey);
191
- if (message.baseKeySignature !== undefined)
192
- writer.tag(5, WireType.LengthDelimited).bytes(message.baseKeySignature);
193
- let u = options.writeUnknownFields;
194
- if (u !== false)
195
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
196
- return writer;
197
- }
198
- }
199
- export const KeyExchangeMessage = new KeyExchangeMessage$Type();