@homebridge-eufy-security/eufy-security-client 3.7.2-dev.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 (129) hide show
  1. package/.prettierignore/342/200/216 +8 -0
  2. package/.prettierrc +11 -0
  3. package/LICENSE +21 -0
  4. package/README.md +970 -0
  5. package/build/error.d.ts +138 -0
  6. package/build/error.js +190 -0
  7. package/build/error.js.map +1 -0
  8. package/build/eufysecurity.d.ts +180 -0
  9. package/build/eufysecurity.js +3148 -0
  10. package/build/eufysecurity.js.map +1 -0
  11. package/build/http/api.d.ts +119 -0
  12. package/build/http/api.js +1877 -0
  13. package/build/http/api.js.map +1 -0
  14. package/build/http/cache.d.ts +8 -0
  15. package/build/http/cache.js +34 -0
  16. package/build/http/cache.js.map +1 -0
  17. package/build/http/const.d.ts +8 -0
  18. package/build/http/const.js +3054 -0
  19. package/build/http/const.js.map +1 -0
  20. package/build/http/device.d.ts +490 -0
  21. package/build/http/device.js +5256 -0
  22. package/build/http/device.js.map +1 -0
  23. package/build/http/error.d.ts +73 -0
  24. package/build/http/error.js +101 -0
  25. package/build/http/error.js.map +1 -0
  26. package/build/http/index.d.ts +10 -0
  27. package/build/http/index.js +30 -0
  28. package/build/http/index.js.map +1 -0
  29. package/build/http/interfaces.d.ts +248 -0
  30. package/build/http/interfaces.js +3 -0
  31. package/build/http/interfaces.js.map +1 -0
  32. package/build/http/models.d.ts +608 -0
  33. package/build/http/models.js +3 -0
  34. package/build/http/models.js.map +1 -0
  35. package/build/http/parameter.d.ts +7 -0
  36. package/build/http/parameter.js +119 -0
  37. package/build/http/parameter.js.map +1 -0
  38. package/build/http/station.d.ts +382 -0
  39. package/build/http/station.js +15735 -0
  40. package/build/http/station.js.map +1 -0
  41. package/build/http/types.d.ts +1358 -0
  42. package/build/http/types.js +10333 -0
  43. package/build/http/types.js.map +1 -0
  44. package/build/http/utils.d.ts +89 -0
  45. package/build/http/utils.js +916 -0
  46. package/build/http/utils.js.map +1 -0
  47. package/build/index.d.ts +8 -0
  48. package/build/index.js +29 -0
  49. package/build/index.js.map +1 -0
  50. package/build/interfaces.d.ts +147 -0
  51. package/build/interfaces.js +7 -0
  52. package/build/interfaces.js.map +1 -0
  53. package/build/logging.d.ts +36 -0
  54. package/build/logging.js +119 -0
  55. package/build/logging.js.map +1 -0
  56. package/build/mqtt/interface.d.ts +6 -0
  57. package/build/mqtt/interface.js +3 -0
  58. package/build/mqtt/interface.js.map +1 -0
  59. package/build/mqtt/model.d.ts +24 -0
  60. package/build/mqtt/model.js +3 -0
  61. package/build/mqtt/model.js.map +1 -0
  62. package/build/mqtt/mqtt-eufy.crt +79 -0
  63. package/build/mqtt/proto/lock.proto +33 -0
  64. package/build/mqtt/service.d.ts +28 -0
  65. package/build/mqtt/service.js +196 -0
  66. package/build/mqtt/service.js.map +1 -0
  67. package/build/p2p/ble.d.ts +59 -0
  68. package/build/p2p/ble.js +281 -0
  69. package/build/p2p/ble.js.map +1 -0
  70. package/build/p2p/error.d.ts +49 -0
  71. package/build/p2p/error.js +69 -0
  72. package/build/p2p/error.js.map +1 -0
  73. package/build/p2p/index.d.ts +8 -0
  74. package/build/p2p/index.js +28 -0
  75. package/build/p2p/index.js.map +1 -0
  76. package/build/p2p/interfaces.d.ts +423 -0
  77. package/build/p2p/interfaces.js +3 -0
  78. package/build/p2p/interfaces.js.map +1 -0
  79. package/build/p2p/models.d.ts +295 -0
  80. package/build/p2p/models.js +3 -0
  81. package/build/p2p/models.js.map +1 -0
  82. package/build/p2p/session.d.ts +186 -0
  83. package/build/p2p/session.js +3737 -0
  84. package/build/p2p/session.js.map +1 -0
  85. package/build/p2p/talkback.d.ts +8 -0
  86. package/build/p2p/talkback.js +23 -0
  87. package/build/p2p/talkback.js.map +1 -0
  88. package/build/p2p/types.d.ts +1164 -0
  89. package/build/p2p/types.js +1219 -0
  90. package/build/p2p/types.js.map +1 -0
  91. package/build/p2p/utils.d.ts +72 -0
  92. package/build/p2p/utils.js +865 -0
  93. package/build/p2p/utils.js.map +1 -0
  94. package/build/push/client.d.ts +49 -0
  95. package/build/push/client.js +344 -0
  96. package/build/push/client.js.map +1 -0
  97. package/build/push/error.d.ts +73 -0
  98. package/build/push/error.js +101 -0
  99. package/build/push/error.js.map +1 -0
  100. package/build/push/index.d.ts +6 -0
  101. package/build/push/index.js +26 -0
  102. package/build/push/index.js.map +1 -0
  103. package/build/push/interfaces.d.ts +19 -0
  104. package/build/push/interfaces.js +3 -0
  105. package/build/push/interfaces.js.map +1 -0
  106. package/build/push/models.d.ts +328 -0
  107. package/build/push/models.js +38 -0
  108. package/build/push/models.js.map +1 -0
  109. package/build/push/parser.d.ts +25 -0
  110. package/build/push/parser.js +231 -0
  111. package/build/push/parser.js.map +1 -0
  112. package/build/push/proto/checkin.proto +266 -0
  113. package/build/push/proto/mcs.proto +328 -0
  114. package/build/push/service.d.ts +46 -0
  115. package/build/push/service.js +965 -0
  116. package/build/push/service.js.map +1 -0
  117. package/build/push/types.d.ts +220 -0
  118. package/build/push/types.js +244 -0
  119. package/build/push/types.js.map +1 -0
  120. package/build/push/utils.d.ts +7 -0
  121. package/build/push/utils.js +116 -0
  122. package/build/push/utils.js.map +1 -0
  123. package/build/utils.d.ts +115 -0
  124. package/build/utils.js +438 -0
  125. package/build/utils.js.map +1 -0
  126. package/eslint.config.mts +68 -0
  127. package/jest.config.js +14 -0
  128. package/package.json +85 -0
  129. package/scripts/cut_release.sh +31 -0
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PushClientParser = void 0;
37
+ const path = __importStar(require("path"));
38
+ const protobufjs_1 = require("protobufjs");
39
+ const tiny_typed_emitter_1 = require("tiny-typed-emitter");
40
+ const models_1 = require("./models");
41
+ const error_1 = require("../error");
42
+ const error_2 = require("./error");
43
+ const logging_1 = require("../logging");
44
+ class PushClientParser extends tiny_typed_emitter_1.TypedEmitter {
45
+ static proto = null;
46
+ state = models_1.ProcessingState.MCS_VERSION_TAG_AND_SIZE;
47
+ data = Buffer.alloc(0);
48
+ isWaitingForData = true;
49
+ sizePacketSoFar = 0;
50
+ messageSize = 0;
51
+ messageTag = 0;
52
+ handshakeComplete = false;
53
+ constructor() {
54
+ super();
55
+ }
56
+ resetState() {
57
+ this.state = models_1.ProcessingState.MCS_VERSION_TAG_AND_SIZE;
58
+ this.data = Buffer.alloc(0);
59
+ this.isWaitingForData = true;
60
+ this.sizePacketSoFar = 0;
61
+ this.messageSize = 0;
62
+ this.messageTag = 0;
63
+ this.handshakeComplete = false;
64
+ this.removeAllListeners();
65
+ }
66
+ static async init() {
67
+ this.proto = await (0, protobufjs_1.load)(path.join(__dirname, "./proto/mcs.proto"));
68
+ return new PushClientParser();
69
+ }
70
+ handleData(newData) {
71
+ this.data = Buffer.concat([this.data, newData]);
72
+ if (this.isWaitingForData) {
73
+ this.isWaitingForData = false;
74
+ this.waitForData();
75
+ }
76
+ }
77
+ waitForData() {
78
+ const minBytesNeeded = this.getMinBytesNeeded();
79
+ // If we don't have all bytes yet, wait some more
80
+ if (this.data.length < minBytesNeeded) {
81
+ this.isWaitingForData = true;
82
+ return;
83
+ }
84
+ else {
85
+ this.handleFullMessage();
86
+ }
87
+ }
88
+ handleFullMessage() {
89
+ switch (this.state) {
90
+ case models_1.ProcessingState.MCS_VERSION_TAG_AND_SIZE:
91
+ this.onGotVersion();
92
+ break;
93
+ case models_1.ProcessingState.MCS_TAG_AND_SIZE:
94
+ this.onGotMessageTag();
95
+ break;
96
+ case models_1.ProcessingState.MCS_SIZE:
97
+ this.onGotMessageSize();
98
+ break;
99
+ case models_1.ProcessingState.MCS_PROTO_BYTES:
100
+ this.onGotMessageBytes();
101
+ break;
102
+ default:
103
+ logging_1.rootPushLogger.warn("Push Parser - Unknown state", { state: this.state });
104
+ break;
105
+ }
106
+ }
107
+ onGotVersion() {
108
+ const version = this.data.readInt8(0);
109
+ this.data = this.data.subarray(1);
110
+ if (version < 41 && version !== 38) {
111
+ throw new error_2.MCSProtocolVersionError("Got wrong protocol version", { context: { version: version } });
112
+ }
113
+ // Process the LoginResponse message tag.
114
+ this.onGotMessageTag();
115
+ }
116
+ onGotMessageTag() {
117
+ this.messageTag = this.data.readInt8(0);
118
+ this.data = this.data.subarray(1);
119
+ this.onGotMessageSize();
120
+ }
121
+ onGotMessageSize() {
122
+ let incompleteSizePacket = false;
123
+ const reader = new protobufjs_1.BufferReader(this.data);
124
+ try {
125
+ this.messageSize = reader.int32();
126
+ }
127
+ catch (err) {
128
+ const error = (0, error_1.ensureError)(err);
129
+ if (error instanceof Error && error.message.startsWith("index out of range:")) {
130
+ incompleteSizePacket = true;
131
+ }
132
+ else {
133
+ throw error;
134
+ }
135
+ }
136
+ if (incompleteSizePacket) {
137
+ this.sizePacketSoFar = reader.pos;
138
+ this.state = models_1.ProcessingState.MCS_SIZE;
139
+ this.waitForData();
140
+ return;
141
+ }
142
+ this.data = this.data.subarray(reader.pos);
143
+ this.sizePacketSoFar = 0;
144
+ if (this.messageSize > 0) {
145
+ this.state = models_1.ProcessingState.MCS_PROTO_BYTES;
146
+ this.waitForData();
147
+ }
148
+ else {
149
+ this.onGotMessageBytes();
150
+ }
151
+ }
152
+ onGotMessageBytes() {
153
+ const protobuf = this.buildProtobufFromTag(this.messageTag);
154
+ if (this.messageSize === 0) {
155
+ this.emit("message", { tag: this.messageTag, object: {} });
156
+ this.getNextMessage();
157
+ return;
158
+ }
159
+ if (this.data.length < this.messageSize) {
160
+ this.state = models_1.ProcessingState.MCS_PROTO_BYTES;
161
+ this.waitForData();
162
+ return;
163
+ }
164
+ const buffer = this.data.subarray(0, this.messageSize);
165
+ this.data = this.data.subarray(this.messageSize);
166
+ const message = protobuf.decode(buffer);
167
+ const object = protobuf.toObject(message, {
168
+ longs: String,
169
+ enums: String,
170
+ bytes: Buffer,
171
+ });
172
+ this.emit("message", { tag: this.messageTag, object: object });
173
+ if (this.messageTag === models_1.MessageTag.LoginResponse) {
174
+ if (this.handshakeComplete) {
175
+ logging_1.rootPushLogger.error("Push Parser - Unexpected login response!");
176
+ }
177
+ else {
178
+ this.handshakeComplete = true;
179
+ }
180
+ }
181
+ this.getNextMessage();
182
+ }
183
+ getNextMessage() {
184
+ this.messageTag = 0;
185
+ this.messageSize = 0;
186
+ this.state = models_1.ProcessingState.MCS_TAG_AND_SIZE;
187
+ this.waitForData();
188
+ }
189
+ getMinBytesNeeded() {
190
+ switch (this.state) {
191
+ case models_1.ProcessingState.MCS_VERSION_TAG_AND_SIZE:
192
+ return 1 + 1 + 1;
193
+ case models_1.ProcessingState.MCS_TAG_AND_SIZE:
194
+ return 1 + 1;
195
+ case models_1.ProcessingState.MCS_SIZE:
196
+ return this.sizePacketSoFar + 1;
197
+ case models_1.ProcessingState.MCS_PROTO_BYTES:
198
+ return this.messageSize;
199
+ default:
200
+ throw new error_2.MCSProtocolProcessingStateError("Unknown protocol processing state", {
201
+ context: { state: this.state },
202
+ });
203
+ }
204
+ }
205
+ buildProtobufFromTag(messageTag) {
206
+ switch (messageTag) {
207
+ case models_1.MessageTag.HeartbeatPing:
208
+ return PushClientParser.proto.lookupType("mcs_proto.HeartbeatPing");
209
+ case models_1.MessageTag.HeartbeatAck:
210
+ return PushClientParser.proto.lookupType("mcs_proto.HeartbeatAck");
211
+ case models_1.MessageTag.LoginRequest:
212
+ return PushClientParser.proto.lookupType("mcs_proto.LoginRequest");
213
+ case models_1.MessageTag.LoginResponse:
214
+ return PushClientParser.proto.lookupType("mcs_proto.LoginResponse");
215
+ case models_1.MessageTag.Close:
216
+ return PushClientParser.proto.lookupType("mcs_proto.Close");
217
+ case models_1.MessageTag.IqStanza:
218
+ return PushClientParser.proto.lookupType("mcs_proto.IqStanza");
219
+ case models_1.MessageTag.DataMessageStanza:
220
+ return PushClientParser.proto.lookupType("mcs_proto.DataMessageStanza");
221
+ case models_1.MessageTag.StreamErrorStanza:
222
+ return PushClientParser.proto.lookupType("mcs_proto.StreamErrorStanza");
223
+ default:
224
+ throw new error_2.MCSProtocolMessageTagError("Unknown protocol message tag", {
225
+ context: { messageTag: this.messageTag },
226
+ });
227
+ }
228
+ }
229
+ }
230
+ exports.PushClientParser = PushClientParser;
231
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/push/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ // Sample data, if provided, is fished from a Nexus 7 (2013) / flo running Android 5.0
2
+ message CheckinRequest {
3
+ // unused
4
+ optional string imei = 1;
5
+
6
+ // Gservices["android_id"] or 0 on first-checkin
7
+ optional int64 androidId = 2;
8
+
9
+ // Gservices["digest"] or ""
10
+ optional string digest = 3;
11
+
12
+ required Checkin checkin = 4;
13
+ message Checkin {
14
+ // empty Build on pre-checkin
15
+ required Build build = 1;
16
+ message Build {
17
+ // Build.FINGERPRINT
18
+ // eg. google/razor/flo:5.0.1/LRX22C/1602158:user/release-keys
19
+ optional string fingerprint = 1;
20
+
21
+ // Build.HARDWARE
22
+ // eg. flo
23
+ optional string hardware = 2;
24
+
25
+ // Build.BRAND
26
+ // eg. google
27
+ optional string brand = 3;
28
+
29
+ // Build.getRadioVersion()
30
+ optional string radio = 4;
31
+
32
+ // Build.BOOTLOADER
33
+ // eg. FLO-04.04
34
+ optional string bootloader = 5;
35
+
36
+ // GoogleSettingsContract.Partner["client_id"]
37
+ // eg. android-google
38
+ optional string clientId = 6;
39
+
40
+ // Build.TIME / 1000L
41
+ // eg. 1416533192
42
+ optional int64 time = 7;
43
+
44
+ // PackageInfo.versionCode
45
+ // eg. 6188736
46
+ optional int32 packageVersionCode = 8;
47
+
48
+ // Build.DEVICE
49
+ // eg. flo
50
+ optional string device = 9;
51
+
52
+ // Build.VERSION.SDK_INT
53
+ // eg. 21
54
+ optional int32 sdkVersion = 10;
55
+
56
+ // Build.MODEL
57
+ // eg. Nexus 7
58
+ optional string model = 11;
59
+
60
+ // Build.MANUFACTURER
61
+ // eg. asus
62
+ optional string manufacturer = 12;
63
+
64
+ // Build.PRODUCT
65
+ // eg. razor
66
+ optional string product = 13;
67
+
68
+ // fileExists("/system/recovery-from-boot.p")
69
+ // eg. false
70
+ optional bool otaInstalled = 14;
71
+ }
72
+
73
+ // last checkin ms or 0 if first checkin
74
+ // eg. 0
75
+ optional int64 lastCheckinMs = 2;
76
+
77
+ // eg. ("event_log_start",~,1424612602652) on first checkin
78
+ repeated Event event = 3;
79
+ message Event {
80
+ optional string tag = 1;
81
+ optional string value = 2;
82
+ optional int64 timeMs = 3;
83
+ }
84
+
85
+ // unknown, n/a on first checkin
86
+ repeated Statistic stat = 4;
87
+ message Statistic {
88
+ required string tag = 1;
89
+ optional int32 count = 2;
90
+ optional float sum = 3;
91
+ }
92
+
93
+ // unused
94
+ repeated string requestedGroup = 5;
95
+
96
+ // TelephonyManager.getNetworkOperator != null|empty
97
+ optional string cellOperator = 6;
98
+
99
+ // TelephonyManager.getSimOperator != null|empty
100
+ optional string simOperator = 7;
101
+
102
+ // "WIFI::" | ("mobile" | "notmobile" | "unknown") + "-" + ("roaming" | "notroaming" | "unknown")
103
+ optional string roaming = 8;
104
+
105
+ // UserHandle.myUserId
106
+ // eg. 0
107
+ optional int32 userNumber = 9;
108
+ }
109
+
110
+ // unused
111
+ optional string desiredBuild = 5;
112
+
113
+ // Locale.toString
114
+ optional string locale = 6;
115
+
116
+ // GoogleSettingsContract.Partner["logging_id2"] (choosen randomly on first checkin)
117
+ // eg. 12561488293572742346
118
+ optional int64 loggingId = 7;
119
+
120
+ // unused
121
+ optional string marketCheckin = 8;
122
+
123
+ // NetworkInfo.getExtraInfo, WifiInfo.getMacAddress (12 hex-digits)
124
+ // eg. d850e6abcdef
125
+ repeated string macAddress = 9;
126
+
127
+ // TelephonyManager.getDeviceId (14 hex-digits), not set on tablets
128
+ optional string meid = 10;
129
+
130
+ // "[<email>]" followed by "<authToken>", empty string on first checkin
131
+ repeated string accountCookie = 11;
132
+
133
+ // TimeZone.getId
134
+ // eg. GMT
135
+ optional string timeZone = 12;
136
+
137
+ // security token as given on first checkin, not set on first checkin
138
+ optional fixed64 securityToken = 13;
139
+
140
+ // use 3
141
+ optional int32 version = 14;
142
+
143
+ // SHA-1 of each in /system/etc/security/otacerts.zip or "--IOException--" or "--no-output--"
144
+ // eg. dKXTm1QH9QShGQwBM/4rg6/lCNQ=
145
+ repeated string otaCert = 15;
146
+
147
+ // Build.SERIAL != "unknown"
148
+ // eg. 07d90b18
149
+ optional string serial = 16;
150
+
151
+ // TelephonyManager.getDeviceId (8 hex-digits), not set on tablets
152
+ optional string esn = 17;
153
+
154
+ optional DeviceConfig deviceConfiguration = 18;
155
+ message DeviceConfig {
156
+ // ConfigurationInfo.reqTouchScreen
157
+ // eg. 3
158
+ optional int32 touchScreen = 1;
159
+
160
+ // ConfigurationInfo.reqKeyboardType
161
+ // eg. 1
162
+ optional int32 keyboardType = 2;
163
+
164
+ // ConfigurationInfo.reqNavigation
165
+ // eg. 1
166
+ optional int32 navigation = 3;
167
+ // ConfigurationInfo.screenLayout
168
+ // eg. 3
169
+ optional int32 screenLayout = 4;
170
+
171
+ // ConfigurationInfo.reqInputFeatures & ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD
172
+ // eg. 0
173
+ optional bool hasHardKeyboard = 5;
174
+
175
+ // ConfigurationInfo.reqInputFeatures & ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV
176
+ // eg. 0
177
+ optional bool hasFiveWayNavigation = 6;
178
+
179
+ // DisplayMetrics.densityDpi
180
+ // eg. 320
181
+ optional int32 densityDpi = 7;
182
+
183
+ // ConfigurationInfo.reqGlEsVersion
184
+ // eg. 196608
185
+ optional int32 glEsVersion = 8;
186
+
187
+ // PackageManager.getSystemSharedLibraryNames
188
+ // eg. "android.test.runner", "com.android.future.usb.accessory", "com.android.location.provider",
189
+ // "com.android.media.remotedisplay", "com.android.mediadrm.signer", "com.google.android.maps",
190
+ // "com.google.android.media.effects", "com.google.widevine.software.drm", "javax.obex"
191
+ repeated string sharedLibrary = 9;
192
+
193
+ // PackageManager.getSystemAvailableFeatures
194
+ // eg. android.hardware.[...]
195
+ repeated string availableFeature = 10;
196
+
197
+ // Build.CPU_ABI and Build.CPU_ABI2 != "unknown"
198
+ // eg. "armeabi-v7a", "armeabi"
199
+ repeated string nativePlatform = 11;
200
+
201
+ // DisplayMetrics.widthPixels
202
+ // eg. 1200
203
+ optional int32 widthPixels = 12;
204
+
205
+ // DisplayMetrics.heightPixels
206
+ // eg. 1824
207
+ optional int32 heightPixels = 13;
208
+
209
+ // Context.getAssets.getLocales
210
+ // eg. [...], "en-US", [...]
211
+ repeated string locale = 14;
212
+
213
+ // GLES10.glGetString(GLES10.GL_EXTENSIONS)
214
+ // eg. "GL_AMD_compressed_ATC_texture", [...]
215
+ repeated string glExtension = 15;
216
+
217
+ // unused
218
+ optional int32 deviceClass = 16;
219
+ // unused
220
+ optional int32 maxApkDownloadSizeMb = 17;
221
+ }
222
+
223
+ // "ethernet" or "wifi"
224
+ repeated string macAddressType = 19;
225
+
226
+ // unknown, use 0 on pre- and first-checkin, and 1 for later checkins
227
+ // also present on pre-checkin
228
+ required int32 fragment = 20;
229
+
230
+ // unknown
231
+ optional string userName = 21;
232
+
233
+ // UserManager.getUserSerialNumber
234
+ // eg. 0
235
+ optional int32 userSerialNumber = 22;
236
+ }
237
+
238
+ message CheckinResponse {
239
+ optional bool statsOk = 1;
240
+ repeated Intent intent = 2;
241
+ message Intent {
242
+ optional string action = 1;
243
+ optional string dataUri = 2;
244
+ optional string mimeType = 3;
245
+ optional string javaClass = 4;
246
+ repeated Extra extra = 5;
247
+ message Extra {
248
+ optional string name = 6;
249
+ optional string value = 7;
250
+ }
251
+ }
252
+ optional int64 timeMs = 3;
253
+ optional string digest = 4;
254
+ repeated GservicesSetting setting = 5;
255
+ message GservicesSetting {
256
+ optional bytes name = 1;
257
+ optional bytes value = 2;
258
+ }
259
+ optional bool marketOk = 6;
260
+ optional fixed64 androidId = 7;
261
+ optional fixed64 securityToken = 8;
262
+ optional bool settingsDiff = 9;
263
+ repeated string deleteSetting = 10;
264
+ optional string versionInfo = 11;
265
+ optional string deviceDataVersionInfo = 12;
266
+ }