mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2024-10-01 06:55:46 -04:00
protobufs
This commit is contained in:
parent
41906366e6
commit
776976c7a7
1
build.sh
1
build.sh
@ -1,3 +1,4 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
dart run build_runner build
|
||||
protoc --dart_out=lib/entities proto/veilidchat.proto
|
||||
|
@ -1,9 +1,4 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:change_case/change_case.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:veilid/veilid.dart';
|
||||
|
||||
part 'identity.freezed.dart';
|
||||
|
@ -1,9 +1,7 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:change_case/change_case.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:veilid/veilid.dart';
|
||||
import 'identity.dart';
|
||||
|
||||
|
1192
lib/entities/proto/veilidchat.pb.dart
Normal file
1192
lib/entities/proto/veilidchat.pb.dart
Normal file
File diff suppressed because it is too large
Load Diff
55
lib/entities/proto/veilidchat.pbenum.dart
Normal file
55
lib/entities/proto/veilidchat.pbenum.dart
Normal file
@ -0,0 +1,55 @@
|
||||
//
|
||||
// Generated code. Do not modify.
|
||||
// source: proto/veilidchat.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
|
||||
// ignore_for_file: annotate_overrides, camel_case_types
|
||||
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
import 'dart:core' as $core;
|
||||
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class AttachmentKind extends $pb.ProtobufEnum {
|
||||
static const AttachmentKind ATTACHMENT_KIND_UNSPECIFIED = AttachmentKind._(0, _omitEnumNames ? '' : 'ATTACHMENT_KIND_UNSPECIFIED');
|
||||
static const AttachmentKind ATTACHMENT_KIND_FILE = AttachmentKind._(1, _omitEnumNames ? '' : 'ATTACHMENT_KIND_FILE');
|
||||
static const AttachmentKind ATTACHMENT_KIND_IMAGE = AttachmentKind._(2, _omitEnumNames ? '' : 'ATTACHMENT_KIND_IMAGE');
|
||||
|
||||
static const $core.List<AttachmentKind> values = <AttachmentKind> [
|
||||
ATTACHMENT_KIND_UNSPECIFIED,
|
||||
ATTACHMENT_KIND_FILE,
|
||||
ATTACHMENT_KIND_IMAGE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, AttachmentKind> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static AttachmentKind? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const AttachmentKind._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Availability extends $pb.ProtobufEnum {
|
||||
static const Availability AVAILABILITY_UNSPECIFIED = Availability._(0, _omitEnumNames ? '' : 'AVAILABILITY_UNSPECIFIED');
|
||||
static const Availability AVAILABILITY_OFFLINE = Availability._(1, _omitEnumNames ? '' : 'AVAILABILITY_OFFLINE');
|
||||
static const Availability AVAILABILITY_FREE = Availability._(2, _omitEnumNames ? '' : 'AVAILABILITY_FREE');
|
||||
static const Availability AVAILABILITY_BUSY = Availability._(3, _omitEnumNames ? '' : 'AVAILABILITY_BUSY');
|
||||
static const Availability AVAILABILITY_AWAY = Availability._(4, _omitEnumNames ? '' : 'AVAILABILITY_AWAY');
|
||||
|
||||
static const $core.List<Availability> values = <Availability> [
|
||||
AVAILABILITY_UNSPECIFIED,
|
||||
AVAILABILITY_OFFLINE,
|
||||
AVAILABILITY_FREE,
|
||||
AVAILABILITY_BUSY,
|
||||
AVAILABILITY_AWAY,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Availability> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Availability? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Availability._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
|
||||
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');
|
309
lib/entities/proto/veilidchat.pbjson.dart
Normal file
309
lib/entities/proto/veilidchat.pbjson.dart
Normal file
@ -0,0 +1,309 @@
|
||||
//
|
||||
// Generated code. Do not modify.
|
||||
// source: proto/veilidchat.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
|
||||
// ignore_for_file: annotate_overrides, camel_case_types
|
||||
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
import 'dart:convert' as $convert;
|
||||
import 'dart:core' as $core;
|
||||
import 'dart:typed_data' as $typed_data;
|
||||
|
||||
@$core.Deprecated('Use attachmentKindDescriptor instead')
|
||||
const AttachmentKind$json = {
|
||||
'1': 'AttachmentKind',
|
||||
'2': [
|
||||
{'1': 'ATTACHMENT_KIND_UNSPECIFIED', '2': 0},
|
||||
{'1': 'ATTACHMENT_KIND_FILE', '2': 1},
|
||||
{'1': 'ATTACHMENT_KIND_IMAGE', '2': 2},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `AttachmentKind`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List attachmentKindDescriptor = $convert.base64Decode(
|
||||
'Cg5BdHRhY2htZW50S2luZBIfChtBVFRBQ0hNRU5UX0tJTkRfVU5TUEVDSUZJRUQQABIYChRBVF'
|
||||
'RBQ0hNRU5UX0tJTkRfRklMRRABEhkKFUFUVEFDSE1FTlRfS0lORF9JTUFHRRAC');
|
||||
|
||||
@$core.Deprecated('Use availabilityDescriptor instead')
|
||||
const Availability$json = {
|
||||
'1': 'Availability',
|
||||
'2': [
|
||||
{'1': 'AVAILABILITY_UNSPECIFIED', '2': 0},
|
||||
{'1': 'AVAILABILITY_OFFLINE', '2': 1},
|
||||
{'1': 'AVAILABILITY_FREE', '2': 2},
|
||||
{'1': 'AVAILABILITY_BUSY', '2': 3},
|
||||
{'1': 'AVAILABILITY_AWAY', '2': 4},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Availability`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List availabilityDescriptor = $convert.base64Decode(
|
||||
'CgxBdmFpbGFiaWxpdHkSHAoYQVZBSUxBQklMSVRZX1VOU1BFQ0lGSUVEEAASGAoUQVZBSUxBQk'
|
||||
'lMSVRZX09GRkxJTkUQARIVChFBVkFJTEFCSUxJVFlfRlJFRRACEhUKEUFWQUlMQUJJTElUWV9C'
|
||||
'VVNZEAMSFQoRQVZBSUxBQklMSVRZX0FXQVkQBA==');
|
||||
|
||||
@$core.Deprecated('Use cryptoKeyDescriptor instead')
|
||||
const CryptoKey$json = {
|
||||
'1': 'CryptoKey',
|
||||
'2': [
|
||||
{'1': 'u0', '3': 1, '4': 1, '5': 7, '10': 'u0'},
|
||||
{'1': 'u1', '3': 2, '4': 1, '5': 7, '10': 'u1'},
|
||||
{'1': 'u2', '3': 3, '4': 1, '5': 7, '10': 'u2'},
|
||||
{'1': 'u3', '3': 4, '4': 1, '5': 7, '10': 'u3'},
|
||||
{'1': 'u4', '3': 5, '4': 1, '5': 7, '10': 'u4'},
|
||||
{'1': 'u5', '3': 6, '4': 1, '5': 7, '10': 'u5'},
|
||||
{'1': 'u6', '3': 7, '4': 1, '5': 7, '10': 'u6'},
|
||||
{'1': 'u7', '3': 8, '4': 1, '5': 7, '10': 'u7'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `CryptoKey`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List cryptoKeyDescriptor = $convert.base64Decode(
|
||||
'CglDcnlwdG9LZXkSDgoCdTAYASABKAdSAnUwEg4KAnUxGAIgASgHUgJ1MRIOCgJ1MhgDIAEoB1'
|
||||
'ICdTISDgoCdTMYBCABKAdSAnUzEg4KAnU0GAUgASgHUgJ1NBIOCgJ1NRgGIAEoB1ICdTUSDgoC'
|
||||
'dTYYByABKAdSAnU2Eg4KAnU3GAggASgHUgJ1Nw==');
|
||||
|
||||
@$core.Deprecated('Use signatureDescriptor instead')
|
||||
const Signature$json = {
|
||||
'1': 'Signature',
|
||||
'2': [
|
||||
{'1': 'u0', '3': 1, '4': 1, '5': 7, '10': 'u0'},
|
||||
{'1': 'u1', '3': 2, '4': 1, '5': 7, '10': 'u1'},
|
||||
{'1': 'u2', '3': 3, '4': 1, '5': 7, '10': 'u2'},
|
||||
{'1': 'u3', '3': 4, '4': 1, '5': 7, '10': 'u3'},
|
||||
{'1': 'u4', '3': 5, '4': 1, '5': 7, '10': 'u4'},
|
||||
{'1': 'u5', '3': 6, '4': 1, '5': 7, '10': 'u5'},
|
||||
{'1': 'u6', '3': 7, '4': 1, '5': 7, '10': 'u6'},
|
||||
{'1': 'u7', '3': 8, '4': 1, '5': 7, '10': 'u7'},
|
||||
{'1': 'u8', '3': 9, '4': 1, '5': 7, '10': 'u8'},
|
||||
{'1': 'u9', '3': 10, '4': 1, '5': 7, '10': 'u9'},
|
||||
{'1': 'u10', '3': 11, '4': 1, '5': 7, '10': 'u10'},
|
||||
{'1': 'u11', '3': 12, '4': 1, '5': 7, '10': 'u11'},
|
||||
{'1': 'u12', '3': 13, '4': 1, '5': 7, '10': 'u12'},
|
||||
{'1': 'u13', '3': 14, '4': 1, '5': 7, '10': 'u13'},
|
||||
{'1': 'u14', '3': 15, '4': 1, '5': 7, '10': 'u14'},
|
||||
{'1': 'u15', '3': 16, '4': 1, '5': 7, '10': 'u15'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Signature`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List signatureDescriptor = $convert.base64Decode(
|
||||
'CglTaWduYXR1cmUSDgoCdTAYASABKAdSAnUwEg4KAnUxGAIgASgHUgJ1MRIOCgJ1MhgDIAEoB1'
|
||||
'ICdTISDgoCdTMYBCABKAdSAnUzEg4KAnU0GAUgASgHUgJ1NBIOCgJ1NRgGIAEoB1ICdTUSDgoC'
|
||||
'dTYYByABKAdSAnU2Eg4KAnU3GAggASgHUgJ1NxIOCgJ1OBgJIAEoB1ICdTgSDgoCdTkYCiABKA'
|
||||
'dSAnU5EhAKA3UxMBgLIAEoB1IDdTEwEhAKA3UxMRgMIAEoB1IDdTExEhAKA3UxMhgNIAEoB1ID'
|
||||
'dTEyEhAKA3UxMxgOIAEoB1IDdTEzEhAKA3UxNBgPIAEoB1IDdTE0EhAKA3UxNRgQIAEoB1IDdT'
|
||||
'E1');
|
||||
|
||||
@$core.Deprecated('Use nonceDescriptor instead')
|
||||
const Nonce$json = {
|
||||
'1': 'Nonce',
|
||||
'2': [
|
||||
{'1': 'u0', '3': 1, '4': 1, '5': 7, '10': 'u0'},
|
||||
{'1': 'u1', '3': 2, '4': 1, '5': 7, '10': 'u1'},
|
||||
{'1': 'u2', '3': 3, '4': 1, '5': 7, '10': 'u2'},
|
||||
{'1': 'u3', '3': 4, '4': 1, '5': 7, '10': 'u3'},
|
||||
{'1': 'u4', '3': 5, '4': 1, '5': 7, '10': 'u4'},
|
||||
{'1': 'u5', '3': 6, '4': 1, '5': 7, '10': 'u5'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Nonce`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List nonceDescriptor = $convert.base64Decode(
|
||||
'CgVOb25jZRIOCgJ1MBgBIAEoB1ICdTASDgoCdTEYAiABKAdSAnUxEg4KAnUyGAMgASgHUgJ1Mh'
|
||||
'IOCgJ1MxgEIAEoB1ICdTMSDgoCdTQYBSABKAdSAnU0Eg4KAnU1GAYgASgHUgJ1NQ==');
|
||||
|
||||
@$core.Deprecated('Use typedKeyDescriptor instead')
|
||||
const TypedKey$json = {
|
||||
'1': 'TypedKey',
|
||||
'2': [
|
||||
{'1': 'kind', '3': 1, '4': 1, '5': 7, '10': 'kind'},
|
||||
{'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.CryptoKey', '10': 'value'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `TypedKey`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List typedKeyDescriptor = $convert.base64Decode(
|
||||
'CghUeXBlZEtleRISCgRraW5kGAEgASgHUgRraW5kEiAKBXZhbHVlGAIgASgLMgouQ3J5cHRvS2'
|
||||
'V5UgV2YWx1ZQ==');
|
||||
|
||||
@$core.Deprecated('Use dHTDataDescriptor instead')
|
||||
const DHTData$json = {
|
||||
'1': 'DHTData',
|
||||
'2': [
|
||||
{'1': 'keys', '3': 1, '4': 3, '5': 11, '6': '.TypedKey', '10': 'keys'},
|
||||
{'1': 'hash', '3': 2, '4': 1, '5': 11, '6': '.TypedKey', '10': 'hash'},
|
||||
{'1': 'chunk', '3': 3, '4': 1, '5': 13, '10': 'chunk'},
|
||||
{'1': 'size', '3': 4, '4': 1, '5': 13, '10': 'size'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DHTData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List dHTDataDescriptor = $convert.base64Decode(
|
||||
'CgdESFREYXRhEh0KBGtleXMYASADKAsyCS5UeXBlZEtleVIEa2V5cxIdCgRoYXNoGAIgASgLMg'
|
||||
'kuVHlwZWRLZXlSBGhhc2gSFAoFY2h1bmsYAyABKA1SBWNodW5rEhIKBHNpemUYBCABKA1SBHNp'
|
||||
'emU=');
|
||||
|
||||
@$core.Deprecated('Use dHTListDescriptor instead')
|
||||
const DHTList$json = {
|
||||
'1': 'DHTList',
|
||||
'2': [
|
||||
{'1': 'keys', '3': 1, '4': 3, '5': 11, '6': '.TypedKey', '10': 'keys'},
|
||||
{'1': 'index', '3': 2, '4': 3, '5': 13, '10': 'index'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DHTList`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List dHTListDescriptor = $convert.base64Decode(
|
||||
'CgdESFRMaXN0Eh0KBGtleXMYASADKAsyCS5UeXBlZEtleVIEa2V5cxIUCgVpbmRleBgCIAMoDV'
|
||||
'IFaW5kZXg=');
|
||||
|
||||
@$core.Deprecated('Use dHTLogDescriptor instead')
|
||||
const DHTLog$json = {
|
||||
'1': 'DHTLog',
|
||||
'2': [
|
||||
{'1': 'keys', '3': 1, '4': 3, '5': 11, '6': '.TypedKey', '10': 'keys'},
|
||||
{'1': 'back', '3': 2, '4': 1, '5': 11, '6': '.TypedKey', '10': 'back'},
|
||||
{'1': 'subkey_counts', '3': 3, '4': 3, '5': 13, '10': 'subkeyCounts'},
|
||||
{'1': 'total_subkeys', '3': 4, '4': 1, '5': 13, '10': 'totalSubkeys'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DHTLog`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List dHTLogDescriptor = $convert.base64Decode(
|
||||
'CgZESFRMb2cSHQoEa2V5cxgBIAMoCzIJLlR5cGVkS2V5UgRrZXlzEh0KBGJhY2sYAiABKAsyCS'
|
||||
'5UeXBlZEtleVIEYmFjaxIjCg1zdWJrZXlfY291bnRzGAMgAygNUgxzdWJrZXlDb3VudHMSIwoN'
|
||||
'dG90YWxfc3Via2V5cxgEIAEoDVIMdG90YWxTdWJrZXlz');
|
||||
|
||||
@$core.Deprecated('Use dataReferenceDescriptor instead')
|
||||
const DataReference$json = {
|
||||
'1': 'DataReference',
|
||||
'2': [
|
||||
{'1': 'dht_data', '3': 1, '4': 1, '5': 11, '6': '.TypedKey', '9': 0, '10': 'dhtData'},
|
||||
],
|
||||
'8': [
|
||||
{'1': 'kind'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DataReference`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List dataReferenceDescriptor = $convert.base64Decode(
|
||||
'Cg1EYXRhUmVmZXJlbmNlEiYKCGRodF9kYXRhGAEgASgLMgkuVHlwZWRLZXlIAFIHZGh0RGF0YU'
|
||||
'IGCgRraW5k');
|
||||
|
||||
@$core.Deprecated('Use attachmentDescriptor instead')
|
||||
const Attachment$json = {
|
||||
'1': 'Attachment',
|
||||
'2': [
|
||||
{'1': 'kind', '3': 1, '4': 1, '5': 14, '6': '.AttachmentKind', '10': 'kind'},
|
||||
{'1': 'mime', '3': 2, '4': 1, '5': 9, '10': 'mime'},
|
||||
{'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
|
||||
{'1': 'content', '3': 4, '4': 1, '5': 11, '6': '.DataReference', '10': 'content'},
|
||||
{'1': 'signature', '3': 5, '4': 1, '5': 11, '6': '.Signature', '10': 'signature'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Attachment`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List attachmentDescriptor = $convert.base64Decode(
|
||||
'CgpBdHRhY2htZW50EiMKBGtpbmQYASABKA4yDy5BdHRhY2htZW50S2luZFIEa2luZBISCgRtaW'
|
||||
'1lGAIgASgJUgRtaW1lEhIKBG5hbWUYAyABKAlSBG5hbWUSKAoHY29udGVudBgEIAEoCzIOLkRh'
|
||||
'dGFSZWZlcmVuY2VSB2NvbnRlbnQSKAoJc2lnbmF0dXJlGAUgASgLMgouU2lnbmF0dXJlUglzaW'
|
||||
'duYXR1cmU=');
|
||||
|
||||
@$core.Deprecated('Use messageDescriptor instead')
|
||||
const Message$json = {
|
||||
'1': 'Message',
|
||||
'2': [
|
||||
{'1': 'author', '3': 1, '4': 1, '5': 11, '6': '.TypedKey', '10': 'author'},
|
||||
{'1': 'timestamp', '3': 2, '4': 1, '5': 4, '10': 'timestamp'},
|
||||
{'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},
|
||||
{'1': 'signature', '3': 4, '4': 1, '5': 11, '6': '.Signature', '10': 'signature'},
|
||||
{'1': 'attachments', '3': 5, '4': 3, '5': 11, '6': '.Attachment', '10': 'attachments'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Message`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List messageDescriptor = $convert.base64Decode(
|
||||
'CgdNZXNzYWdlEiEKBmF1dGhvchgBIAEoCzIJLlR5cGVkS2V5UgZhdXRob3ISHAoJdGltZXN0YW'
|
||||
'1wGAIgASgEUgl0aW1lc3RhbXASEgoEdGV4dBgDIAEoCVIEdGV4dBIoCglzaWduYXR1cmUYBCAB'
|
||||
'KAsyCi5TaWduYXR1cmVSCXNpZ25hdHVyZRItCgthdHRhY2htZW50cxgFIAMoCzILLkF0dGFjaG'
|
||||
'1lbnRSC2F0dGFjaG1lbnRz');
|
||||
|
||||
@$core.Deprecated('Use conversationDescriptor instead')
|
||||
const Conversation$json = {
|
||||
'1': 'Conversation',
|
||||
'2': [
|
||||
{'1': 'profile', '3': 1, '4': 1, '5': 11, '6': '.Profile', '10': 'profile'},
|
||||
{'1': 'identity', '3': 2, '4': 1, '5': 9, '10': 'identity'},
|
||||
{'1': 'messages', '3': 3, '4': 1, '5': 11, '6': '.DHTLog', '10': 'messages'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Conversation`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List conversationDescriptor = $convert.base64Decode(
|
||||
'CgxDb252ZXJzYXRpb24SIgoHcHJvZmlsZRgBIAEoCzIILlByb2ZpbGVSB3Byb2ZpbGUSGgoIaW'
|
||||
'RlbnRpdHkYAiABKAlSCGlkZW50aXR5EiMKCG1lc3NhZ2VzGAMgASgLMgcuREhUTG9nUghtZXNz'
|
||||
'YWdlcw==');
|
||||
|
||||
@$core.Deprecated('Use contactDescriptor instead')
|
||||
const Contact$json = {
|
||||
'1': 'Contact',
|
||||
'2': [
|
||||
{'1': 'edited_profile', '3': 1, '4': 1, '5': 11, '6': '.Profile', '10': 'editedProfile'},
|
||||
{'1': 'remote_profile', '3': 2, '4': 1, '5': 11, '6': '.Profile', '10': 'remoteProfile'},
|
||||
{'1': 'remote_identity', '3': 3, '4': 1, '5': 9, '10': 'remoteIdentity'},
|
||||
{'1': 'remote_conversation', '3': 4, '4': 1, '5': 11, '6': '.TypedKey', '10': 'remoteConversation'},
|
||||
{'1': 'local_conversation', '3': 5, '4': 1, '5': 11, '6': '.TypedKey', '10': 'localConversation'},
|
||||
{'1': 'show_availability', '3': 6, '4': 1, '5': 8, '10': 'showAvailability'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Contact`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List contactDescriptor = $convert.base64Decode(
|
||||
'CgdDb250YWN0Ei8KDmVkaXRlZF9wcm9maWxlGAEgASgLMgguUHJvZmlsZVINZWRpdGVkUHJvZm'
|
||||
'lsZRIvCg5yZW1vdGVfcHJvZmlsZRgCIAEoCzIILlByb2ZpbGVSDXJlbW90ZVByb2ZpbGUSJwoP'
|
||||
'cmVtb3RlX2lkZW50aXR5GAMgASgJUg5yZW1vdGVJZGVudGl0eRI6ChNyZW1vdGVfY29udmVyc2'
|
||||
'F0aW9uGAQgASgLMgkuVHlwZWRLZXlSEnJlbW90ZUNvbnZlcnNhdGlvbhI4ChJsb2NhbF9jb252'
|
||||
'ZXJzYXRpb24YBSABKAsyCS5UeXBlZEtleVIRbG9jYWxDb252ZXJzYXRpb24SKwoRc2hvd19hdm'
|
||||
'FpbGFiaWxpdHkYBiABKAhSEHNob3dBdmFpbGFiaWxpdHk=');
|
||||
|
||||
@$core.Deprecated('Use profileDescriptor instead')
|
||||
const Profile$json = {
|
||||
'1': 'Profile',
|
||||
'2': [
|
||||
{'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
|
||||
{'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},
|
||||
{'1': 'status', '3': 3, '4': 1, '5': 9, '10': 'status'},
|
||||
{'1': 'availability', '3': 4, '4': 1, '5': 14, '6': '.Availability', '10': 'availability'},
|
||||
{'1': 'icon', '3': 5, '4': 1, '5': 11, '6': '.TypedKey', '10': 'icon'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Profile`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List profileDescriptor = $convert.base64Decode(
|
||||
'CgdQcm9maWxlEhIKBG5hbWUYASABKAlSBG5hbWUSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhYKBn'
|
||||
'N0YXR1cxgDIAEoCVIGc3RhdHVzEjEKDGF2YWlsYWJpbGl0eRgEIAEoDjINLkF2YWlsYWJpbGl0'
|
||||
'eVIMYXZhaWxhYmlsaXR5Eh0KBGljb24YBSABKAsyCS5UeXBlZEtleVIEaWNvbg==');
|
||||
|
||||
@$core.Deprecated('Use accountDescriptor instead')
|
||||
const Account$json = {
|
||||
'1': 'Account',
|
||||
'2': [
|
||||
{'1': 'profile', '3': 1, '4': 1, '5': 11, '6': '.Profile', '10': 'profile'},
|
||||
{'1': 'invisible', '3': 2, '4': 1, '5': 8, '10': 'invisible'},
|
||||
{'1': 'auto_away_timeout_sec', '3': 3, '4': 1, '5': 13, '10': 'autoAwayTimeoutSec'},
|
||||
{'1': 'contact_list', '3': 4, '4': 1, '5': 11, '6': '.TypedKey', '10': 'contactList'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Account`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List accountDescriptor = $convert.base64Decode(
|
||||
'CgdBY2NvdW50EiIKB3Byb2ZpbGUYASABKAsyCC5Qcm9maWxlUgdwcm9maWxlEhwKCWludmlzaW'
|
||||
'JsZRgCIAEoCFIJaW52aXNpYmxlEjEKFWF1dG9fYXdheV90aW1lb3V0X3NlYxgDIAEoDVISYXV0'
|
||||
'b0F3YXlUaW1lb3V0U2VjEiwKDGNvbnRhY3RfbGlzdBgEIAEoCzIJLlR5cGVkS2V5Ugtjb250YW'
|
||||
'N0TGlzdA==');
|
||||
|
14
lib/entities/proto/veilidchat.pbserver.dart
Normal file
14
lib/entities/proto/veilidchat.pbserver.dart
Normal file
@ -0,0 +1,14 @@
|
||||
//
|
||||
// Generated code. Do not modify.
|
||||
// source: proto/veilidchat.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
|
||||
// ignore_for_file: annotate_overrides, camel_case_types
|
||||
// ignore_for_file: constant_identifier_names
|
||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
||||
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
export 'veilidchat.pb.dart';
|
||||
|
@ -1,195 +1,245 @@
|
||||
syntax = "proto3";
|
||||
|
||||
// import 'dart:typed_data';
|
||||
// 32-byte value in bigendian format
|
||||
message CryptoKey {
|
||||
fixed32 u0 = 1;
|
||||
fixed32 u1 = 2;
|
||||
fixed32 u2 = 3;
|
||||
fixed32 u3 = 4;
|
||||
fixed32 u4 = 5;
|
||||
fixed32 u5 = 6;
|
||||
fixed32 u6 = 7;
|
||||
fixed32 u7 = 8;
|
||||
}
|
||||
|
||||
// import 'package:change_case/change_case.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
// import 'package:uuid/uuid.dart';
|
||||
// import 'package:veilid/veilid.dart';
|
||||
// 64-byte value in bigendian format
|
||||
message Signature {
|
||||
fixed32 u0 = 1;
|
||||
fixed32 u1 = 2;
|
||||
fixed32 u2 = 3;
|
||||
fixed32 u3 = 4;
|
||||
fixed32 u4 = 5;
|
||||
fixed32 u5 = 6;
|
||||
fixed32 u6 = 7;
|
||||
fixed32 u7 = 8;
|
||||
fixed32 u8 = 9;
|
||||
fixed32 u9 = 10;
|
||||
fixed32 u10 = 11;
|
||||
fixed32 u11 = 12;
|
||||
fixed32 u12 = 13;
|
||||
fixed32 u13 = 14;
|
||||
fixed32 u14 = 15;
|
||||
fixed32 u15 = 16;
|
||||
}
|
||||
|
||||
// part 'dht.freezed.dart';
|
||||
// part 'dht.g.dart';
|
||||
// 24-byte value in bigendian format
|
||||
message Nonce {
|
||||
fixed32 u0 = 1;
|
||||
fixed32 u1 = 2;
|
||||
fixed32 u2 = 3;
|
||||
fixed32 u3 = 4;
|
||||
fixed32 u4 = 5;
|
||||
fixed32 u5 = 6;
|
||||
}
|
||||
|
||||
// // DHTData - represents chunked blob data in the DHT
|
||||
// // Header in subkey 0 follows this structure
|
||||
// //
|
||||
// // Subkeys 1..=stride on the first key are concatenated chunks
|
||||
// // Subkeys 0..stride on the 'keys' keys are concatenated chunks
|
||||
// //
|
||||
// // Keys must use writable schema in order to make this data mutable
|
||||
// @freezed
|
||||
// class DHTData with _$DHTData {
|
||||
// const factory DHTData({
|
||||
// // Other keys to concatenate
|
||||
// required List<TypedKey> keys,
|
||||
// // Hash of reassembled data to verify contents
|
||||
// required TypedHashDigest hash,
|
||||
// // Subkeys per key
|
||||
// required int stride,
|
||||
// // Chunk size per subkey
|
||||
// required int chunk,
|
||||
// // Total data size
|
||||
// required int size,
|
||||
// }) = _DHTData;
|
||||
// factory DHTData.fromJson(Map<String, dynamic> json) => _$DHTData(json);
|
||||
// }
|
||||
// 36-byte typed crpyto key
|
||||
message TypedKey {
|
||||
// CryptoKind FourCC in bigendian format
|
||||
fixed32 kind = 1;
|
||||
// Key value
|
||||
CryptoKey value = 2;
|
||||
}
|
||||
|
||||
// // DHTList - represents an ordered collection of individual elements
|
||||
// // Header in subkey 0 follows this structure
|
||||
// //
|
||||
// // Subkeys 1..=stride on the first key are individual elements
|
||||
// // Subkeys 0..stride on the 'keys' keys are also individual elements
|
||||
// //
|
||||
// // Keys must use writable schema in order to make this list mutable
|
||||
// @freezed
|
||||
// class DHTList with _$DHTList {
|
||||
// const factory DHTList({
|
||||
// // Other keys to concatenate
|
||||
// required List<TypedKey> keys,
|
||||
// // Subkeys per key
|
||||
// required int stride,
|
||||
// // Item position index
|
||||
// // Actual item location is:
|
||||
// // idx = index[n] + 1 (offset for header at idx 0)
|
||||
// // key = idx / stride
|
||||
// // subkey = idx % stride
|
||||
// required List<int> index,
|
||||
// }) = _DHTList;
|
||||
// factory DHTList.fromJson(Map<String, dynamic> json) => _$DHTList(json);
|
||||
// }
|
||||
// DHTData - represents chunked blob data in the DHT
|
||||
// Header in subkey 0 follows this structure
|
||||
//
|
||||
// stride = descriptor subkey count on first key - 1
|
||||
// Subkeys 1..=stride on the first key are concatenated chunks
|
||||
// Subkeys 0..stride on the 'keys' keys are concatenated chunks
|
||||
//
|
||||
// Keys must use writable schema in order to make this data mutable
|
||||
|
||||
message DHTData {
|
||||
// Other keys to concatenate
|
||||
repeated TypedKey keys = 1;
|
||||
// Hash of reassembled data to verify contents
|
||||
TypedKey hash = 2;
|
||||
// Chunk size per subkey
|
||||
uint32 chunk = 3;
|
||||
// Total data size
|
||||
uint32 size = 4;
|
||||
}
|
||||
|
||||
// // A single message as part of a series of messages
|
||||
// @freezed
|
||||
// class Message with _$Message {
|
||||
// const factory Message(
|
||||
// {
|
||||
// // Identity public key of the message author
|
||||
// required TypedKey author,
|
||||
// // Identity signature of all of the message fields
|
||||
// required Signature sig,
|
||||
// // Time the message was sent (ms since epoch)
|
||||
// required int ts,
|
||||
// // Text of the message
|
||||
// required String text}) = _Message;
|
||||
// DHTList - represents a re-orderable collection of individual elements
|
||||
// Header in subkey 0 of first key follows this structure
|
||||
//
|
||||
// stride = descriptor subkey count on first key - 1
|
||||
// Subkeys 1..=stride on the first key are individual elements
|
||||
// Subkeys 0..stride on the 'keys' keys are also individual elements
|
||||
//
|
||||
// Keys must use writable schema in order to make this list mutable
|
||||
message DHTList {
|
||||
// Other keys to concatenate
|
||||
repeated TypedKey keys = 1;
|
||||
// Item position index
|
||||
// Actual item location is:
|
||||
// idx = index[n] + 1 (offset for header at idx 0)
|
||||
// key = idx / stride
|
||||
// subkey = idx % stride
|
||||
repeated uint32 index = 2;
|
||||
// Free items are not represented in the list but can be
|
||||
// calculated through iteration
|
||||
}
|
||||
|
||||
// factory Message.fromJson(Map<String, dynamic> json) =>
|
||||
// _$MessageFromJson(json);
|
||||
// }
|
||||
// DHTLog - represents an appendable/truncatable log collection of individual elements
|
||||
// Header in subkey 0 of first key follows this structure
|
||||
//
|
||||
// stride = descriptor subkey count on first key - 1
|
||||
// Subkeys 1..=stride on the first key are individual elements
|
||||
// Subkeys 0..stride on the 'keys' keys are also individual elements
|
||||
//
|
||||
// Keys must use writable schema in order to make this list mutable
|
||||
message DHTLog {
|
||||
// Other keys to concatenate
|
||||
repeated TypedKey keys = 1;
|
||||
// Back link to another DHTLog further back
|
||||
TypedKey back = 2;
|
||||
// Count of subkeys in all keys in this DHTLog
|
||||
repeated uint32 subkey_counts = 3;
|
||||
// Total count of subkeys in all keys in this DHTLog including all backlogs
|
||||
uint32 total_subkeys = 4;
|
||||
}
|
||||
|
||||
// // A record of a chunk of messages as reconciled from a conversation
|
||||
// // Element of a DHTList of messages
|
||||
// // DHT Key (Private): messagesKey
|
||||
// // DHT Secret: messagesSecret
|
||||
// // Encryption: Symmetric(messagesSecret)
|
||||
// // * for Conversation messagesSecret is: DH(IdentityA, IdentityB)
|
||||
// DataReference
|
||||
// Pointer to data somewhere in Veilid
|
||||
// Abstraction over DHTData and BlockStore
|
||||
message DataReference {
|
||||
oneof kind {
|
||||
TypedKey dht_data = 1;
|
||||
// TypedKey block = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// @freezed
|
||||
// class Messages with _$Messages {
|
||||
// const factory Messages(
|
||||
// {required Profile profile,
|
||||
// required Identity identity,
|
||||
// required bool available}) = _Messages;
|
||||
// AttachmentKind
|
||||
// Enumeration of well-known attachment types
|
||||
enum AttachmentKind {
|
||||
ATTACHMENT_KIND_UNSPECIFIED = 0;
|
||||
ATTACHMENT_KIND_FILE = 1;
|
||||
ATTACHMENT_KIND_IMAGE = 2;
|
||||
}
|
||||
|
||||
// factory Messages.fromJson(Map<String, dynamic> json) =>
|
||||
// _$MessagesFromJson(json);
|
||||
// }
|
||||
// A single attachment
|
||||
message Attachment {
|
||||
// Type of the data
|
||||
AttachmentKind kind = 1;
|
||||
// MIME type of the data
|
||||
string mime = 2;
|
||||
// Title or filename
|
||||
string name = 3;
|
||||
// Pointer to the data content
|
||||
DataReference content = 4;
|
||||
// Author signature over all attachment fields and content fields and bytes
|
||||
Signature signature = 5;
|
||||
}
|
||||
|
||||
// // A record of a 1-1 chat that is synchronized between
|
||||
// // two users. Backed up on a DHT key. Visible and encrypted
|
||||
// // for the other party
|
||||
// //
|
||||
// // DHT Schema: SMPL(0,1,[identityPublicKey])
|
||||
// // DHT Key (UnicastOutbox): localConversation
|
||||
// // DHT Secret: None
|
||||
// // Encryption: DH(IdentityA, IdentityB)
|
||||
// A single message as part of a series of messages
|
||||
// Messages are stored in an append-only log in DHT
|
||||
message Message {
|
||||
// Author of the message
|
||||
TypedKey author = 1;
|
||||
// Time the message was sent (us since epoch)
|
||||
uint64 timestamp = 2;
|
||||
// Text of the message
|
||||
string text = 3;
|
||||
// Author signature over all of the fields and attachment signatures
|
||||
Signature signature = 4;
|
||||
// Attachments on the message
|
||||
repeated Attachment attachments = 5;
|
||||
}
|
||||
|
||||
// @freezed
|
||||
// class Conversation with _$Conversation {
|
||||
// const factory Conversation(
|
||||
// {
|
||||
// // Profile to publish to friend
|
||||
// required Profile profile,
|
||||
// // Identity to publish to friend
|
||||
// required Identity identity,
|
||||
// // Messages DHTList
|
||||
// required TypedKey}) = _Contact;
|
||||
// A record of a 1-1 chat that is synchronized between
|
||||
// two users. Visible and encrypted for the other party
|
||||
//
|
||||
// DHT Schema: SMPL(0,1,[identityPublicKey])
|
||||
// DHT Key (UnicastOutbox): localConversation
|
||||
// DHT Secret: None
|
||||
// Encryption: DH(IdentityA, IdentityB)
|
||||
|
||||
// factory Conversation.fromJson(Map<String, dynamic> json) =>
|
||||
// _$ConversationFromJson(json);
|
||||
// }
|
||||
message Conversation {
|
||||
// Profile to publish to friend
|
||||
Profile profile = 1;
|
||||
// Identity master (JSON) to publish to friend
|
||||
string identity = 2;
|
||||
// Messages DHTLog
|
||||
DHTLog messages = 3;
|
||||
}
|
||||
|
||||
// // A record of a contact that has accepted a contact invitation
|
||||
// // Contains a copy of the most recent remote profile as well as
|
||||
// // a locally edited profile.
|
||||
// // Contains a copy of the most recent identity from the contact's
|
||||
// // Master identity dht key
|
||||
// //
|
||||
// // Stored in ContactList DHTList
|
||||
// //
|
||||
// A record of a contact that has accepted a contact invitation
|
||||
// Contains a copy of the most recent remote profile as well as
|
||||
// a locally edited profile.
|
||||
// Contains a copy of the most recent identity from the contact's
|
||||
// Master identity dht key
|
||||
//
|
||||
// Stored in ContactList DHTList
|
||||
message Contact {
|
||||
// Friend's profile as locally edited
|
||||
Profile edited_profile = 1;
|
||||
// Copy of friend's profile from remote conversation
|
||||
Profile remote_profile = 2;
|
||||
// Copy of friend's identity (JSON) from remote conversation
|
||||
string remote_identity = 3;
|
||||
// Remote conversation key to sync from friend
|
||||
TypedKey remote_conversation = 4;
|
||||
// Our conversation key for friend to sync
|
||||
TypedKey local_conversation = 5;
|
||||
// Show availability
|
||||
bool show_availability = 6;
|
||||
}
|
||||
|
||||
// @freezed
|
||||
// class Contact with _$Contact {
|
||||
// const factory Contact({
|
||||
// // Friend's profile as locally edited
|
||||
// required Profile editedProfile,
|
||||
// // Copy of friend's profile from remote conversation
|
||||
// required Profile remoteProfile,
|
||||
// // Copy of friend's identity from remote conversation
|
||||
// required Identity remoteIdentity,
|
||||
// // Remote conversation key to sync from friend
|
||||
// required TypedKey remoteConversation,
|
||||
// // Our conversation key for friend to sync
|
||||
// required TypedKey localConversation,
|
||||
// }) = _Contact;
|
||||
// Contact availability as specified by the
|
||||
enum Availability {
|
||||
AVAILABILITY_UNSPECIFIED = 0;
|
||||
AVAILABILITY_OFFLINE = 1;
|
||||
AVAILABILITY_FREE = 2;
|
||||
AVAILABILITY_BUSY = 3;
|
||||
AVAILABILITY_AWAY = 4;
|
||||
}
|
||||
|
||||
// factory Contact.fromJson(Map<String, dynamic> json) =>
|
||||
// _$ContactFromJson(json);
|
||||
// }
|
||||
// Publicly shared profile information for both contacts and accounts
|
||||
// Contains:
|
||||
// Name - Friendly name
|
||||
// Title - Title of user
|
||||
// Icon - Little picture to represent user in contact list
|
||||
//
|
||||
// DHT Key: None
|
||||
// Encryption: None
|
||||
message Profile {
|
||||
// Friendy name
|
||||
string name = 1;
|
||||
// Title of user
|
||||
string title = 2;
|
||||
// Status/away message
|
||||
string status = 3;
|
||||
// Availability
|
||||
Availability availability = 4;
|
||||
// Icon DHTData
|
||||
TypedKey icon = 5;
|
||||
}
|
||||
|
||||
// // Publicly shared profile information for both contacts and accounts
|
||||
// // Contains:
|
||||
// // Name - Friendly name
|
||||
// // Title - Title of user
|
||||
// // Icon - Little picture to represent user in contact list
|
||||
// //
|
||||
// // DHT Key: None
|
||||
// // Encryption: None
|
||||
// @freezed
|
||||
// class Profile with _$Profile {
|
||||
// const factory Profile({
|
||||
// // Friendy name
|
||||
// required String name,
|
||||
// // Title of user
|
||||
// required String title,
|
||||
// // Status/away message
|
||||
// required String status,
|
||||
// // Icon DHTData
|
||||
// required TypedKey icon,
|
||||
// }) = _Profile;
|
||||
// factory Profile.fromJson(Map<String, dynamic> json) =>
|
||||
// _$ProfileFromJson(json);
|
||||
// }
|
||||
|
||||
// // A record of an individual account
|
||||
// //
|
||||
// // DHT Schema: DFLT(1)
|
||||
// // DHT Key (Private): accountPublicKey
|
||||
// // DHT Secret: accountSecretKey
|
||||
// @freezed
|
||||
// class Account with _$Account {
|
||||
// const factory Account({
|
||||
// // The user's profile that gets shared with contacts
|
||||
// required Profile profile,
|
||||
// // Invisibility makes you always look 'Offline'
|
||||
// required bool invisible,
|
||||
// // Auto-away sets 'away' mode after an inactivity time
|
||||
// required autoAwayTimeoutSec,
|
||||
// // The contacts DHTList for this account
|
||||
// // Schema: SMPL(0,64,[accountPublicKey]) Encryption: accountSecretKey
|
||||
// required TypedKey contactList,
|
||||
// }) = _Account;
|
||||
|
||||
// factory Account.fromJson(Map<String, dynamic> json) =>
|
||||
// _$AccountFromJson(json);
|
||||
// }
|
||||
// A record of an individual account
|
||||
// Pointed to by the identity account map in the identity key
|
||||
//
|
||||
// DHT Schema: DFLT(1)
|
||||
// DHT Key (Private): accountPublicKey
|
||||
// DHT Secret: accountSecretKey
|
||||
message Account {
|
||||
// The user's profile that gets shared with contacts
|
||||
Profile profile = 1;
|
||||
// Invisibility makes you always look 'Offline'
|
||||
bool invisible = 2;
|
||||
// Auto-away sets 'away' mode after an inactivity time
|
||||
uint32 auto_away_timeout_sec = 3;
|
||||
// The contacts DHTList for this account
|
||||
// Schema: SMPL(0,64,[accountPublicKey]) Encryption: accountSecretKey
|
||||
TypedKey contact_list = 4;
|
||||
}
|
||||
|
10
pubspec.lock
10
pubspec.lock
@ -298,7 +298,7 @@ packages:
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
@ -629,6 +629,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.4"
|
||||
protobuf:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: protobuf
|
||||
sha256: "4034a02b7e231e7e60bff30a8ac13a7347abfdac0798595fae0b90a3f0afe759"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -36,6 +36,8 @@ dependencies:
|
||||
radix_colors: ^1.0.4
|
||||
flutter_translate: ^4.0.4
|
||||
intl: ^0.18.0
|
||||
fixnum: ^1.1.0
|
||||
protobuf: ^3.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
@ -18,7 +18,6 @@ $VEILIDDIR/setup_linux.sh
|
||||
# run setup for veilid_flutter
|
||||
$VEILIDDIR/veilid-flutter/setup_flutter.sh
|
||||
|
||||
|
||||
# ensure protoc is installed
|
||||
if command -v protoc &> /dev/null; then
|
||||
echo '[X] protoc is available in the path'
|
||||
|
Loading…
Reference in New Issue
Block a user