@structured-id/ui-core 1.2.0 → 2.0.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 (101) hide show
  1. package/README.md +9 -5
  2. package/dist/browser-vp/index.d.cts +0 -11
  3. package/dist/browser-vp/index.d.ts +0 -11
  4. package/dist/index.cjs +13721 -9514
  5. package/dist/index.d.cts +4362 -2375
  6. package/dist/index.d.ts +4362 -2375
  7. package/dist/index.js +13937 -9730
  8. package/package.json +3 -3
  9. package/src/browser-vp/crypto.ts +0 -1
  10. package/src/browser-vp/index.ts +0 -2
  11. package/src/browser-vp/prf.ts +0 -2
  12. package/src/browser-vp/storage.ts +0 -2
  13. package/src/browser-vp/types.ts +0 -2
  14. package/src/browser-vp/vp.ts +0 -2
  15. package/src/composables/index.ts +6 -1
  16. package/src/composables/useAccountTransport.test.ts +121 -0
  17. package/src/composables/useAccountTransport.ts +69 -0
  18. package/src/composables/useBffAuth.ts +44 -34
  19. package/src/generated/google/api/httpbody.ts +159 -0
  20. package/src/generated/google/protobuf/any.ts +326 -0
  21. package/src/generated/google/rpc/error_details.ts +1386 -0
  22. package/src/generated/google/rpc/status.ts +127 -0
  23. package/src/generated/sid/v1/account/account.ts +1 -1
  24. package/src/generated/sid/v1/admin/admin.client.ts +15 -12
  25. package/src/generated/sid/v1/admin/admin.ts +24 -89
  26. package/src/generated/sid/v1/admin/enrollment.client.ts +24 -12
  27. package/src/generated/sid/v1/admin/enrollment.ts +65 -3
  28. package/src/generated/sid/v1/admin/events.client.ts +8 -8
  29. package/src/generated/sid/v1/admin/flow.ts +1 -1
  30. package/src/generated/sid/v1/admin/keys.ts +1 -1
  31. package/src/generated/sid/v1/admin/notifications.client.ts +12 -6
  32. package/src/generated/sid/v1/admin/notifications.ts +11 -70
  33. package/src/generated/sid/v1/admin/operations.ts +20 -35
  34. package/src/generated/sid/v1/admin/organizations.client.ts +2 -2
  35. package/src/generated/sid/v1/admin/organizations.ts +15 -32
  36. package/src/generated/sid/v1/admin/provisioning.client.ts +232 -0
  37. package/src/generated/sid/v1/admin/provisioning.ts +1383 -0
  38. package/src/generated/sid/v1/admin/scopes.ts +1 -1
  39. package/src/generated/sid/v1/admin/security.client.ts +22 -24
  40. package/src/generated/sid/v1/admin/security.ts +13 -22
  41. package/src/generated/sid/v1/admin/settings.client.ts +29 -18
  42. package/src/generated/sid/v1/admin/settings.ts +2 -82
  43. package/src/generated/sid/v1/attestation/attestation.client.ts +6 -6
  44. package/src/generated/sid/v1/attestation/attestation.ts +8 -8
  45. package/src/generated/sid/v1/authn/auth.client.ts +101 -58
  46. package/src/generated/sid/v1/authn/auth.ts +842 -414
  47. package/src/generated/sid/v1/authn/flows.ts +0 -12
  48. package/src/generated/sid/v1/authn/issuer.client.ts +489 -0
  49. package/src/generated/sid/v1/authn/issuer.ts +1600 -0
  50. package/src/generated/sid/v1/authn/password_history.client.ts +57 -0
  51. package/src/generated/sid/v1/authn/password_history.ts +578 -0
  52. package/src/generated/sid/v1/authn/system_integration.client.ts +73 -0
  53. package/src/generated/sid/v1/authn/system_integration.ts +218 -0
  54. package/src/generated/sid/v1/authz/authz.ts +1498 -317
  55. package/src/generated/sid/v1/authz/forward_auth.client.ts +97 -0
  56. package/src/generated/sid/v1/authz/forward_auth.ts +79 -0
  57. package/src/generated/sid/v1/authz/governance.client.ts +2 -2
  58. package/src/generated/sid/v1/authz/governance.ts +61 -4
  59. package/src/generated/sid/v1/common/errors.ts +532 -6
  60. package/src/generated/sid/v1/events/event_stream.client.ts +2 -2
  61. package/src/generated/sid/v1/events/event_stream.ts +2 -1
  62. package/src/generated/sid/v1/identity/identity.ts +98 -58
  63. package/src/generated/sid/v1/ids/ids.ts +395 -0
  64. package/src/generated/sid/v1/machine/machine_user.ts +0 -36
  65. package/src/generated/sid/v1/machine/pat.client.ts +2 -19
  66. package/src/generated/sid/v1/machine/pat.ts +1 -186
  67. package/src/generated/sid/v1/projects/projects.client.ts +137 -19
  68. package/src/generated/sid/v1/projects/projects.ts +2105 -405
  69. package/src/generated/sid/v1/scim/scim.client.ts +248 -2
  70. package/src/generated/sid/v1/scim/scim.ts +153 -14
  71. package/src/generated/sid/v1/test/test.ts +1 -1
  72. package/src/i18n/index.ts +0 -11
  73. package/src/index.ts +36 -2
  74. package/src/package-exports.test.ts +18 -0
  75. package/src/profile/components/SidLoginForm.vue +5 -2
  76. package/src/profile/components/SidRegistrationForm.test.ts +58 -1
  77. package/src/profile/components/SidRegistrationForm.vue +110 -12
  78. package/src/profile/components/index.ts +4 -0
  79. package/src/profile/composables/index.ts +2 -1
  80. package/src/profile/composables/useAccountApi.ts +20 -7
  81. package/src/profile/composables/useAuth.test.ts +453 -0
  82. package/src/profile/composables/useAuth.ts +414 -0
  83. package/src/profile/composables/useAuthApi.opaque.test.ts +18 -0
  84. package/src/profile/composables/useAuthApi.ts +188 -20
  85. package/src/profile/composables/useEnrollmentApi.test.ts +33 -0
  86. package/src/profile/composables/useEnrollmentApi.ts +26 -0
  87. package/src/profile/composables/useIdentityApi.ts +17 -7
  88. package/src/profile/composables/useLoginSuccess.test.ts +97 -3
  89. package/src/profile/composables/useLoginSuccess.ts +80 -22
  90. package/src/profile/composables/useSecurityLevel.test.ts +10 -3
  91. package/src/profile/composables/useSecurityLevel.ts +12 -3
  92. package/src/quasar/SidPrincipalInput.vue +4 -7
  93. package/src/utils/normalizePrincipal.test.ts +19 -5
  94. package/src/utils/normalizePrincipal.ts +7 -9
  95. package/src/utils/rpcRefusal.test.ts +151 -0
  96. package/src/utils/rpcRefusal.ts +252 -0
  97. package/src/utils/validators.test.ts +9 -0
  98. package/src/utils/validators.ts +14 -2
  99. package/src/composables/useAuth.ts +0 -40
  100. package/src/profile/composables/useOpaqueAuth.test.ts +0 -290
  101. package/src/profile/composables/useOpaqueAuth.ts +0 -191
@@ -14,9 +14,8 @@ import { reflectionMergePartial } from "@protobuf-ts/runtime";
14
14
  import { MessageType } from "@protobuf-ts/runtime";
15
15
  import { Timestamp } from "../../../google/protobuf/timestamp";
16
16
  /**
17
- * Profile represents a user identity in StructuredID.
18
- * In CE: Profile IS the user (no separate User entity).
19
- * In SaaS: Profile is owned by Person (sovereign entity).
17
+ * Profile represents a user identity in StructuredID: the Profile is the
18
+ * user (there is no separate User entity).
20
19
  *
21
20
  * @generated from protobuf message sid.v1.identity.Profile
22
21
  */
@@ -34,7 +33,7 @@ export interface Profile {
34
33
  */
35
34
  profileType: ProfileType;
36
35
  /**
37
- * Username (CE: local login handle).
36
+ * Username (local login handle).
38
37
  *
39
38
  * @generated from protobuf field: optional string username = 3
40
39
  */
@@ -128,8 +127,9 @@ export interface Profile {
128
127
  principals: Principal[];
129
128
  }
130
129
  /**
131
- * Principal represents a verifiable login handle (always authentication-capable).
132
- * If a value cannot be used for login, it's a Profile Field, not a Principal.
130
+ * Principal represents a verifiable login handle (always authentication-capable)
131
+ * claimed by the Profile that lists it. If a value cannot be used for login,
132
+ * it's a Profile Field, not a Principal.
133
133
  *
134
134
  * @generated from protobuf message sid.v1.identity.Principal
135
135
  */
@@ -147,8 +147,10 @@ export interface Principal {
147
147
  */
148
148
  type: PrincipalType;
149
149
  /**
150
- * Principal value: email address, E.164 phone, username string.
151
- * Server normalizes on write (lowercase email, E.164 format phone).
150
+ * The handle as sign-in resolves it, derived by the server: for an email
151
+ * the resolution key (case, local-part dots and +tag folded), never a
152
+ * delivery address; mail goes to the linked contact (source_email_id).
153
+ * E.164 for a phone, the lowercase name for a username.
152
154
  *
153
155
  * @generated from protobuf field: string value = 3
154
156
  */
@@ -175,24 +177,27 @@ export interface Principal {
175
177
  updatedAt?: Timestamp;
176
178
  /**
177
179
  * Links Principal to the ProfilePhone/ProfileEmail it was created from.
178
- * Set only for profile-bound principals. Empty for Person-level (SaaS).
179
180
  *
180
181
  * @generated from protobuf field: optional string source_field = 8
181
182
  */
182
183
  sourceField?: string;
183
184
  /**
184
- * Subject type: profile (direct login) or person (picker).
185
- * CE/EE: always PROFILE. SaaS: PERSON when personal principal has 2+ profiles.
185
+ * The ProfileEmail (UUID) whose address this email handle delivers to,
186
+ * in the spelling given; absent for other types and for a handle whose
187
+ * address is not known.
186
188
  *
187
- * @generated from protobuf field: sid.v1.identity.PrincipalSubjectType subject_type = 9
189
+ * @generated from protobuf field: optional string source_email_id = 11
188
190
  */
189
- subjectType: PrincipalSubjectType;
191
+ sourceEmailId?: string;
190
192
  /**
191
- * Subject ID: ProfileId (when subject_type=PROFILE) or PersonId (when subject_type=PERSON).
193
+ * An email handle written before the installation's email policy
194
+ * revisions, its address unknown: still reserved for the account, but no
195
+ * sign-in, code, link or reset uses it until the owner confirms the
196
+ * address or an administrator asserts it. Always false for other types.
192
197
  *
193
- * @generated from protobuf field: string subject_id = 10
198
+ * @generated from protobuf field: bool needs_address_confirmation = 12
194
199
  */
195
- subjectId: string;
200
+ needsAddressConfirmation: boolean;
196
201
  }
197
202
  // ══════════════════════════════════════════════════════════════════════════
198
203
  // Multi-valued contacts — ProfilePhone / ProfileEmail
@@ -374,7 +379,8 @@ export interface WebAuthnCredentialInfo {
374
379
  attachment: AuthenticatorAttachment;
375
380
  /**
376
381
  * Attestation format (e.g., "none", "packed", "fido-u2f", "tpm").
377
- * CE stores but does not verify; EE verifies when attestation policy requires it.
382
+ * Stored; verified only by a server that verifies attestation, when its
383
+ * attestation policy requires it.
378
384
  *
379
385
  * @generated from protobuf field: string attestation_format = 5
380
386
  */
@@ -407,6 +413,11 @@ export interface Session {
407
413
  */
408
414
  clientId: string;
409
415
  /**
416
+ * Device the session was issued on (`Device.id`, UUIDv7); unset when the
417
+ * session is not associated with a registered device. A revocation
418
+ * association (removing the device ends the session), not proof of key
419
+ * possession.
420
+ *
410
421
  * @generated from protobuf field: optional string device_id = 4
411
422
  */
412
423
  deviceId?: string;
@@ -1106,52 +1117,86 @@ export interface DownloadExportChunk {
1106
1117
  export interface AcknowledgeExportRequest {
1107
1118
  }
1108
1119
  /**
1109
- * Known device associated with a profile.
1120
+ * Known device associated with a profile. A descriptive record (DTO), not an
1121
+ * identifier type and not evidence of device authority.
1110
1122
  *
1111
1123
  * @generated from protobuf message sid.v1.identity.Device
1112
1124
  */
1113
1125
  export interface Device {
1114
1126
  /**
1127
+ * Device identifier: UUIDv7 in canonical lowercase hyphenated form. Issued by
1128
+ * SID when the device is registered in the owning Profile's scope; the same
1129
+ * value is carried as `device_id` in session and attestation messages.
1130
+ * Knowing it grants no authority and does not prove key possession.
1131
+ *
1115
1132
  * @generated from protobuf field: string id = 1
1116
1133
  */
1117
1134
  id: string;
1118
1135
  /**
1136
+ * Owning Profile identifier (UUIDv7). Internal identity; never exposed to
1137
+ * external or federated services.
1138
+ *
1119
1139
  * @generated from protobuf field: string profile_id = 2
1120
1140
  */
1121
1141
  profileId: string;
1122
1142
  /**
1143
+ * User-given label for the device (e.g. "Work laptop"). Set by the Profile
1144
+ * owner via UpdateDevice; unset until the user names the device.
1145
+ *
1123
1146
  * @generated from protobuf field: optional string display_name = 3
1124
1147
  */
1125
1148
  displayName?: string;
1126
1149
  /**
1150
+ * Device form factor, derived by SID from registration context.
1151
+ *
1127
1152
  * @generated from protobuf field: sid.v1.identity.DeviceType device_type = 4
1128
1153
  */
1129
1154
  deviceType: DeviceType;
1130
1155
  /**
1156
+ * Operating system name and version as reported by the client at
1157
+ * registration/login. Self-asserted, informational only.
1158
+ *
1131
1159
  * @generated from protobuf field: optional string os_info = 5
1132
1160
  */
1133
1161
  osInfo?: string;
1134
1162
  /**
1163
+ * Assurance level computed by SID from trust decision, attestation and
1164
+ * policy; the input to device-based access policy.
1165
+ *
1135
1166
  * @generated from protobuf field: sid.v1.identity.DeviceAssurance assurance = 6
1136
1167
  */
1137
1168
  assurance: DeviceAssurance;
1138
1169
  /**
1170
+ * Explicit trust decision by the Profile owner (TrustDevice /
1171
+ * RevokeDeviceTrust). A user label, not attestation of hardware or of any
1172
+ * verification performed on the device.
1173
+ *
1139
1174
  * @generated from protobuf field: bool trusted = 7
1140
1175
  */
1141
1176
  trusted: boolean;
1142
1177
  /**
1178
+ * Whether a hardware-backed device key with verified platform attestation is
1179
+ * registered in sid-attestation. A protected software key does not set this.
1180
+ *
1143
1181
  * @generated from protobuf field: bool hardware_attested = 8
1144
1182
  */
1145
1183
  hardwareAttested: boolean;
1146
1184
  /**
1185
+ * Country/region of the most recent access, derived by SID from the source
1186
+ * IP. The exact IP address is never stored here.
1187
+ *
1147
1188
  * @generated from protobuf field: optional string last_ip_geo = 9
1148
1189
  */
1149
1190
  lastIpGeo?: string;
1150
1191
  /**
1192
+ * When SID first registered the device.
1193
+ *
1151
1194
  * @generated from protobuf field: google.protobuf.Timestamp first_seen_at = 10
1152
1195
  */
1153
1196
  firstSeenAt?: Timestamp;
1154
1197
  /**
1198
+ * Most recent authentication from the device; updated by SID on each auth.
1199
+ *
1155
1200
  * @generated from protobuf field: google.protobuf.Timestamp last_seen_at = 11
1156
1201
  */
1157
1202
  lastSeenAt?: Timestamp;
@@ -1161,6 +1206,9 @@ export interface Device {
1161
1206
  */
1162
1207
  export interface ListDevicesRequest {
1163
1208
  /**
1209
+ * Profile whose devices to list (UUIDv7). Must match the caller's
1210
+ * authorized Profile scope.
1211
+ *
1164
1212
  * @generated from protobuf field: string profile_id = 1
1165
1213
  */
1166
1214
  profileId: string;
@@ -1170,6 +1218,8 @@ export interface ListDevicesRequest {
1170
1218
  */
1171
1219
  export interface ListDevicesResponse {
1172
1220
  /**
1221
+ * Devices registered to the requested Profile.
1222
+ *
1173
1223
  * @generated from protobuf field: repeated sid.v1.identity.Device devices = 1
1174
1224
  */
1175
1225
  devices: Device[];
@@ -1179,6 +1229,9 @@ export interface ListDevicesResponse {
1179
1229
  */
1180
1230
  export interface GetDeviceRequest {
1181
1231
  /**
1232
+ * Device to fetch (`Device.id`, UUIDv7). Must belong to the caller's
1233
+ * authorized Profile scope.
1234
+ *
1182
1235
  * @generated from protobuf field: string device_id = 1
1183
1236
  */
1184
1237
  deviceId: string;
@@ -1188,10 +1241,15 @@ export interface GetDeviceRequest {
1188
1241
  */
1189
1242
  export interface UpdateDeviceRequest {
1190
1243
  /**
1244
+ * Device to update (`Device.id`, UUIDv7). Must belong to the caller's
1245
+ * authorized Profile scope.
1246
+ *
1191
1247
  * @generated from protobuf field: string device_id = 1
1192
1248
  */
1193
1249
  deviceId: string;
1194
1250
  /**
1251
+ * New user-given label; unset leaves the current label unchanged.
1252
+ *
1195
1253
  * @generated from protobuf field: optional string display_name = 2
1196
1254
  */
1197
1255
  displayName?: string;
@@ -1201,6 +1259,9 @@ export interface UpdateDeviceRequest {
1201
1259
  */
1202
1260
  export interface RemoveDeviceRequest {
1203
1261
  /**
1262
+ * Device to remove (`Device.id`, UUIDv7). Removal kills the device's
1263
+ * sessions and revokes its keys in sid-attestation.
1264
+ *
1204
1265
  * @generated from protobuf field: string device_id = 1
1205
1266
  */
1206
1267
  deviceId: string;
@@ -1210,6 +1271,8 @@ export interface RemoveDeviceRequest {
1210
1271
  */
1211
1272
  export interface TrustDeviceRequest {
1212
1273
  /**
1274
+ * Device the Profile owner marks as trusted (`Device.id`, UUIDv7).
1275
+ *
1213
1276
  * @generated from protobuf field: string device_id = 1
1214
1277
  */
1215
1278
  deviceId: string;
@@ -1219,34 +1282,12 @@ export interface TrustDeviceRequest {
1219
1282
  */
1220
1283
  export interface RevokeDeviceTrustRequest {
1221
1284
  /**
1285
+ * Device whose explicit trust is withdrawn (`Device.id`, UUIDv7).
1286
+ *
1222
1287
  * @generated from protobuf field: string device_id = 1
1223
1288
  */
1224
1289
  deviceId: string;
1225
1290
  }
1226
- /**
1227
- * Who owns a Principal — determines login resolution behavior.
1228
- *
1229
- * @generated from protobuf enum sid.v1.identity.PrincipalSubjectType
1230
- */
1231
- export enum PrincipalSubjectType {
1232
- /**
1233
- * @generated from protobuf enum value: PRINCIPAL_SUBJECT_TYPE_UNSPECIFIED = 0;
1234
- */
1235
- UNSPECIFIED = 0,
1236
- /**
1237
- * Bound to a specific profile. Login resolves directly.
1238
- * CE/EE: always this. SaaS: corporate principals, or personal with 1 profile.
1239
- *
1240
- * @generated from protobuf enum value: PRINCIPAL_SUBJECT_TYPE_PROFILE = 1;
1241
- */
1242
- PROFILE = 1,
1243
- /**
1244
- * Owned by Person (SaaS only). Login shows profile picker.
1245
- *
1246
- * @generated from protobuf enum value: PRINCIPAL_SUBJECT_TYPE_PERSON = 2;
1247
- */
1248
- PERSON = 2
1249
- }
1250
1291
  /**
1251
1292
  * @generated from protobuf enum sid.v1.identity.PrincipalType
1252
1293
  */
@@ -1378,7 +1419,7 @@ export enum ProfileStatus {
1378
1419
  */
1379
1420
  ACTIVE = 1,
1380
1421
  /**
1381
- * SCIM-provisioned, not yet claimed by Person
1422
+ * SCIM-provisioned, not yet claimed by its user
1382
1423
  *
1383
1424
  * @generated from protobuf enum value: PROFILE_STATUS_PROVISIONED = 9;
1384
1425
  */
@@ -1628,7 +1669,7 @@ export enum ExportFormat {
1628
1669
  */
1629
1670
  UNSPECIFIED = 0,
1630
1671
  /**
1631
- * CE: always available.
1672
+ * JSON archive.
1632
1673
  *
1633
1674
  * @generated from protobuf enum value: EXPORT_FORMAT_JSON = 1;
1634
1675
  */
@@ -1892,8 +1933,8 @@ class Principal$Type extends MessageType<Principal> {
1892
1933
  { no: 6, name: "created_at", kind: "message", T: () => Timestamp },
1893
1934
  { no: 7, name: "updated_at", kind: "message", T: () => Timestamp },
1894
1935
  { no: 8, name: "source_field", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1895
- { no: 9, name: "subject_type", kind: "enum", T: () => ["sid.v1.identity.PrincipalSubjectType", PrincipalSubjectType, "PRINCIPAL_SUBJECT_TYPE_"] },
1896
- { no: 10, name: "subject_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
1936
+ { no: 11, name: "source_email_id", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1937
+ { no: 12, name: "needs_address_confirmation", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1897
1938
  ]);
1898
1939
  }
1899
1940
  create(value?: PartialMessage<Principal>): Principal {
@@ -1903,8 +1944,7 @@ class Principal$Type extends MessageType<Principal> {
1903
1944
  message.value = "";
1904
1945
  message.verified = false;
1905
1946
  message.isPrimary = false;
1906
- message.subjectType = 0;
1907
- message.subjectId = "";
1947
+ message.needsAddressConfirmation = false;
1908
1948
  if (value !== undefined)
1909
1949
  reflectionMergePartial<Principal>(this, message, value);
1910
1950
  return message;
@@ -1938,11 +1978,11 @@ class Principal$Type extends MessageType<Principal> {
1938
1978
  case /* optional string source_field */ 8:
1939
1979
  message.sourceField = reader.string();
1940
1980
  break;
1941
- case /* sid.v1.identity.PrincipalSubjectType subject_type */ 9:
1942
- message.subjectType = reader.int32();
1981
+ case /* optional string source_email_id */ 11:
1982
+ message.sourceEmailId = reader.string();
1943
1983
  break;
1944
- case /* string subject_id */ 10:
1945
- message.subjectId = reader.string();
1984
+ case /* bool needs_address_confirmation */ 12:
1985
+ message.needsAddressConfirmation = reader.bool();
1946
1986
  break;
1947
1987
  default:
1948
1988
  let u = options.readUnknownField;
@@ -1980,12 +2020,12 @@ class Principal$Type extends MessageType<Principal> {
1980
2020
  /* optional string source_field = 8; */
1981
2021
  if (message.sourceField !== undefined)
1982
2022
  writer.tag(8, WireType.LengthDelimited).string(message.sourceField);
1983
- /* sid.v1.identity.PrincipalSubjectType subject_type = 9; */
1984
- if (message.subjectType !== 0)
1985
- writer.tag(9, WireType.Varint).int32(message.subjectType);
1986
- /* string subject_id = 10; */
1987
- if (message.subjectId !== "")
1988
- writer.tag(10, WireType.LengthDelimited).string(message.subjectId);
2023
+ /* optional string source_email_id = 11; */
2024
+ if (message.sourceEmailId !== undefined)
2025
+ writer.tag(11, WireType.LengthDelimited).string(message.sourceEmailId);
2026
+ /* bool needs_address_confirmation = 12; */
2027
+ if (message.needsAddressConfirmation !== false)
2028
+ writer.tag(12, WireType.Varint).bool(message.needsAddressConfirmation);
1989
2029
  let u = options.writeUnknownFields;
1990
2030
  if (u !== false)
1991
2031
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);