Skip to content

Commit a7621be

Browse files
committed
Other: Split up NamespaceDescriptor to make nested plain namespaces a thing, see #749
1 parent 1f76749 commit a7621be

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ Where bundle size is a factor, there are additional stripped-down versions of th
106106
Usage
107107
-----
108108

109-
Because JavaScript is a dynamically typed language, protobuf.js introduces the concept of a **valid message** in order to provide the best possible [performance](#performance):
109+
Because JavaScript is a dynamically typed language, protobuf.js introduces the concept of a **valid message** in order to provide the best possible [performance](#performance) (and, as a side product, proper typings):
110110

111111
### Valid message
112112

@@ -119,8 +119,8 @@ There are two possible types of valid messages and the encoder is able to work w
119119

120120
In a nutshell, the wire format writer understands the following types:
121121

122-
| Field type | Expected JS type (create, encode) | Naive conversion (fromObject)
123-
|------------|-----------------------------------|------------------------------
122+
| Field type | Expected JS type (create, encode) | Conversion (fromObject)
123+
|------------|-----------------------------------|------------------------
124124
| s-/u-/int32<br />s-/fixed32 | `number` (32 bit integer) | `value | 0` if signed<br /> `value >>> 0` if unsigned
125125
| s-/u-/int64<br />s-/fixed64 | `Long`-like (optimal)<br />`number` (53 bit integer) | `Long.fromValue(value)` with long.js<br />`parseInt(value, 10)` otherwise
126126
| float<br />double | `number` | `Number(value)`
@@ -187,7 +187,7 @@ With that in mind and again for performance reasons, each message class provides
187187
```
188188

189189
* **Message.fromObject**(object: `Object`): `Message`<br />
190-
naively converts any non-valid **plain JavaScript object** to a **message instance**. See the table above for the exact conversion operations performed.
190+
converts any non-valid **plain JavaScript object** to a **message instance** using the conversion steps outlined within the table above.
191191

192192
```js
193193
var message = AwesomeMessage.fromObject({ awesomeField: 42 });
@@ -213,6 +213,8 @@ For reference, the following diagram aims to display the relationships between t
213213

214214
<img alt="Toolset Diagram" src="http://dcode.io/protobuf.js/toolset.svg" />
215215

216+
> In other words: `verify` indicates that calling `create` or `encode` directly on the plain object will [result in a valid message respectively] succeed. `fromObject`, on the other hand, does conversion from a broader range of plain objects to create valid messages. ([ref](https://github.com/dcodeIO/protobuf.js/issues/748#issuecomment-291925749))
217+
216218
Examples
217219
--------
218220

@@ -247,7 +249,7 @@ protobuf.load("awesome.proto", function(err, root) {
247249
throw Error(errMsg);
248250

249251
// Create a new message
250-
var message = AwesomeMessage.fromObject(payload); // or use .create if payload is already known to be valid
252+
var message = AwesomeMessage.creeate(payload); // or use .fromObject if conversion is necessary
251253

252254
// Encode a message to an Uint8Array (browser) or Buffer (node)
253255
var buffer = AwesomeMessage.encode(message).finish();

index.d.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -880,9 +880,9 @@ export abstract class NamespaceBase extends ReflectionObject {
880880

881881
/**
882882
* Converts this namespace to a namespace descriptor.
883-
* @returns {NamespaceDescriptor} Namespace descriptor
883+
* @returns {NamespaceBaseDescriptor} Namespace descriptor
884884
*/
885-
public toJSON(): NamespaceDescriptor;
885+
public toJSON(): NamespaceBaseDescriptor;
886886

887887
/**
888888
* Adds nested objects to this namespace from nested object descriptors.
@@ -996,13 +996,20 @@ export abstract class NamespaceBase extends ReflectionObject {
996996
public lookupService(path: (string|string[])): Service;
997997
}
998998

999-
type AnyNestedDescriptor = (EnumDescriptor|TypeDescriptor|ServiceDescriptor|ExtensionFieldDescriptor|ExtensionMapFieldDescriptor);
1000-
1001999
type NamespaceDescriptor = {
1000+
options?: { [k: string]: any };
1001+
nested: { [k: string]: AnyNestedDescriptor };
1002+
};
1003+
1004+
type NamespaceBaseDescriptor = {
10021005
options?: { [k: string]: any };
10031006
nested?: { [k: string]: AnyNestedDescriptor };
10041007
};
10051008

1009+
type AnyExtensionFieldDescriptor = (ExtensionFieldDescriptor|ExtensionMapFieldDescriptor);
1010+
1011+
type AnyNestedDescriptor = (EnumDescriptor|TypeDescriptor|ServiceDescriptor|AnyExtensionFieldDescriptor|NamespaceDescriptor);
1012+
10061013
/**
10071014
* Constructs a new reflection object instance.
10081015
* @classdesc Base class of all reflection objects.

src/namespace.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,37 @@ Object.defineProperty(Namespace.prototype, "nestedArray", {
9898
});
9999

100100
/**
101-
* Any nested object descriptor.
102-
* @typedef AnyNestedDescriptor
103-
* @type {EnumDescriptor|TypeDescriptor|ServiceDescriptor|ExtensionFieldDescriptor|ExtensionMapFieldDescriptor}
101+
* Namespace descriptor.
102+
* @typedef NamespaceDescriptor
103+
* @type {Object}
104+
* @property {Object.<string,*>} [options] Namespace options
105+
* @property {Object.<string,AnyNestedDescriptor>} nested Nested object descriptors
104106
*/
105107

106108
/**
107-
* Namespace descriptor.
108-
* @typedef NamespaceDescriptor
109+
* Namespace base descriptor.
110+
* @typedef NamespaceBaseDescriptor
109111
* @type {Object}
110112
* @property {Object.<string,*>} [options] Namespace options
111113
* @property {Object.<string,AnyNestedDescriptor>} [nested] Nested object descriptors
112114
*/
113115

116+
/**
117+
* Any extension field descriptor.
118+
* @typedef AnyExtensionFieldDescriptor
119+
* @type {ExtensionFieldDescriptor|ExtensionMapFieldDescriptor}
120+
*/
121+
122+
/**
123+
* Any nested object descriptor.
124+
* @typedef AnyNestedDescriptor
125+
* @type {EnumDescriptor|TypeDescriptor|ServiceDescriptor|AnyExtensionFieldDescriptor|NamespaceDescriptor}
126+
*/
127+
// ^ BEWARE: VSCode hangs forever when using more than 5 types (that's why AnyExtensionFieldDescriptor exists in the first place)
128+
114129
/**
115130
* Converts this namespace to a namespace descriptor.
116-
* @returns {NamespaceDescriptor} Namespace descriptor
131+
* @returns {NamespaceBaseDescriptor} Namespace descriptor
117132
*/
118133
Namespace.prototype.toJSON = function toJSON() {
119134
return {

0 commit comments

Comments
 (0)