You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Move reference documentation out of Durable Objects best practices and other fixes (#17445)
* Fix multiple parameters sharing bullet in Durable Object Namespace
* Update Durable Objects walkthrough to use RPC
* Add partial for id to string example
* Move reference documentation out of Durable Objects best practices
* Apply suggestions from code review
* fixup! Move reference documentation out of Durable Objects best practices
---------
Co-authored-by: Jun Lee <[email protected]>
The `DurableObjectId` interface refers to a new or existing Durable Object instance. This interface is most frequently used by [`DurableObjectNamespace::get`](/durable-objects/api/namespace/#get) to obtain a stub for submitting requests to a Durable Object instance.
12
+
A Durable Object ID is a 64-digit hexadecimal number used to identify a Durable Object instance. Not all 64-digit hex numbers are valid IDs. Durable Object IDs are constructed indirectly via the [`DurableObjectNamespace`](/durable-objects/api/namespace) interface.
13
13
14
-
Note that creating an ID for a Durable Object instance does not create the Durable Object. The Durable Object is created lazily after calling[`DurableObjectNamespace::get`](/durable-objects/api/namespace/#get) to create a [`DurableObjectStub`](/durable-objects/api/stub) from a `DurableObjectId`. This ensures that objects are not constructed until they are actually accessed.
14
+
The `DurableObjectId` interface refers to a new or existing Durable Object instance. This interface is most frequently used by[`DurableObjectNamespace::get`](/durable-objects/api/namespace/#get) to obtain a [`DurableObjectStub`](/durable-objects/api/stub) for submitting requests to a Durable Object instance. Note that creating an ID for a Durable Object instance does not create the Durable Object. The Durable Object is created lazily after creating a stub from a `DurableObjectId`. This ensures that objects are not constructed until they are actually accessed.
15
15
16
-
:::note[`DurableObjectId`]
16
+
:::note[Logging]
17
17
18
18
If you are experiencing an issue with a particular Durable Object instance, you may wish to log the `DurableObjectId` from your Worker and include it in your Cloudflare support request.
19
19
@@ -25,16 +25,7 @@ If you are experiencing an issue with a particular Durable Object instance, you
25
25
26
26
`toString` converts a `DurableObjectId` to a 64 digit hex string. This string is useful for logging purposes or storing the `DurableObjectId` elsewhere, for example, in a session cookie. This string can be used to reconstruct a `DurableObjectId` via `DurableObjectNamespace::idFromString`.
27
27
28
-
```js
29
-
// Create a new unique ID
30
-
constid=env.MY_DURABLE_OBJECT.newUniqueId();
31
-
// Convert the ID to a string to be saved elsewhere, e.g. a session cookie
The `DurableObjectNamespace` interface is used to obtain a reference to a new or existing Durable Object instance. The interface is accessible from the fetch handler on a Cloudflare Worker via the `env` parameter, which is the standard interface when referencing bindings declared in `wrangler.toml`.
12
+
A Durable Object namespace is a set of Durable Object instances that are backed by the same Durable Object class. There is only one Durable Object namespace per class. A Durable Object namespace can contain any number of Durable Object instances.
13
+
14
+
The `DurableObjectNamespace` interface is used to obtain a reference to new or existing Durable Object instances. The interface is accessible from the fetch handler on a Cloudflare Worker via the `env` parameter, which is the standard interface when referencing bindings declared in `wrangler.toml`.
13
15
14
16
This interface defines several [methods](/durable-objects/api/namespace/#methods) that can be used to create an ID for a Durable Object instance. Note that creating an ID for a Durable Object instance does not create the Durable Object. The Durable Object is created lazily after calling [`DurableObjectNamespace::get`](/durable-objects/api/namespace/#get) to create a [`DurableObjectStub`](/durable-objects/api/stub) from a `DurableObjectId`. This ensures that objects are not constructed until they are actually accessed.
15
17
@@ -69,7 +71,7 @@ export default {
69
71
70
72
### `idFromName`
71
73
72
-
`idFromName` creates a [`DurableObjectId`](/durable-objects/api/id) which refers to an individual instance of the Durable Object class from a particular name.
74
+
`idFromName` creates a unique [`DurableObjectId`](/durable-objects/api/id) which refers to an individual instance of the Durable Object class. Named Durable Object instances are the most common method of referring to Durable Object instances.
`newUniqueId` creates a `DurableObjectId` which refers to an individual instance of the Durable Object class.
91
+
`newUniqueId` creates a randomly generated and unique [`DurableObjectId`](/durable-objects/api/id) which refers to an individual instance of the Durable Object class. IDs created using `newUniqueId`, will need to be stored as a string in order to refer to the same Durable Object again in the future. For example, the ID can be stored in Workers KV, another Durable Object instance, or in a cookie in the user's browser.
:::note[`newUniqueId` results in lower request latency at first use]
99
+
100
+
The first time you get a Durable Object stub based on an ID derived from a name, the system has to take into account the possibility that a Worker on the opposite side of the world could have coincidentally accessed the same named Durable Object at the same time. To guarantee that only one instance of the Durable Object is created, the system must check that the Durable Object has not been created anywhere else. Due to the inherent limit of the speed of light, this round-the-world check can take up to a few hundred milliseconds. `newUniqueId` can skip this check.
97
101
98
-
IDs created by `newUniqueId`will result in lower latencies when getting a [`DurableObjectStub`](/durable-objects/api/stub) relative to [`idFromName`](/durable-objects/api/namespace/#idfromname).
102
+
After this first use, the location of the Durable Object instance will be cached around the world so that subsequent lookups are faster.
99
103
100
104
:::
101
105
@@ -109,16 +113,9 @@ IDs created by `newUniqueId` will result in lower latencies when getting a [`Dur
109
113
110
114
### `idFromString`
111
115
112
-
`idFromString` creates a [`DurableObjectId`](/durable-objects/api/id) from a previously generated ID that has been converted to a string. This method ensures the ID is valid, for example, it checks that the ID consists of 64 hex digits.
116
+
`idFromString` creates a [`DurableObjectId`](/durable-objects/api/id) from a previously generated ID that has been converted to a string. This method throws an exception if the ID is invalid, for example, if the ID was not created from the same `DurableObjectNamespace`.
113
117
114
-
```js
115
-
// Create a new unique ID
116
-
constid=env.MY_DURABLE_OBJECT.newUniqueId();
117
-
// Save the unique ID elsewhere, e.g. a session cookie via id.toString()
@@ -132,14 +129,17 @@ const id = env.MY_DURABLE_OBJECT.idFromString(session_id);
132
129
133
130
`get` obtains a [`DurableObjectStub`](/durable-objects/api/stub) from a [`DurableObjectId`](/durable-objects/api/id) which can be used to invoke methods on a Durable Object instance.
134
131
132
+
This method returns the stub immediately, often before a connection has been established to the Durable Object instance. This allows requests to be sent to the instance right away, without waiting for a network round trip.
133
+
135
134
```js
136
135
constid=env.MY_DURABLE_OBJECT.newUniqueId();
137
136
conststub=env.MY_DURABLE_OBJECT.get(id);
138
137
```
139
138
140
139
#### Parameters
141
140
142
-
- A required [`DurableObjectId`](/durable-objects/api/id) and an optional object with the key `locationHint` and value of a [locationHint](/durable-objects/reference/data-location/#provide-a-location-hint) string.
141
+
- A required [`DurableObjectId`](/durable-objects/api/id)
142
+
- An optional object with the key `locationHint` and value of a [locationHint](/durable-objects/reference/data-location/#provide-a-location-hint) string.
Copy file name to clipboardExpand all lines: src/content/docs/durable-objects/api/stub.mdx
+5-71Lines changed: 5 additions & 71 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,83 +5,17 @@ sidebar:
5
5
order: 3
6
6
---
7
7
8
-
import { Tabs, TabItem } from"~/components";
8
+
import { Render } from"~/components";
9
9
10
10
## Description
11
11
12
-
The `DurableObjectStub` interface is used to obtain a reference a Durable Object instance and invoke methods on that instance. The type of `DurableObjectStub` is generic to allow for RPC methods to be invoked on the stub.
12
+
The `DurableObjectStub` interface is a client used to invoke methods on a remote Durable Object instance. The type of `DurableObjectStub` is generic to allow for RPC methods to be invoked on the stub.
Durable Objects implement E-order semantics, a concept deriving from the [E distributed programming language](<https://en.wikipedia.org/wiki/E_(programming_language)>). When you make multiple calls to the same Durable Object, it is guaranteed that the calls will be delivered to the remote Durable Object in the order in which you made them. E-order semantics makes many distributed programming problems easier. E-order is implemented by the [Cap'n Proto](https://capnproto.org) distributed object-capability RPC protocol, which Cloudflare Workers uses for internal communications.
// Every unique ID refers to an individual instance of the Durable Object class
71
-
const id =env.MY_DURABLE_OBJECT.idFromName("foo");
72
-
73
-
// A stub is a client used to invoke methods on the Durable Object instance
74
-
const stub =env.MY_DURABLE_OBJECT.get(id);
75
-
76
-
// Methods on the Durable Object are invoked via the stub
77
-
const rpcResponse =awaitstub.sayHello();
78
-
79
-
returnnewResponse(rpcResponse);
80
-
},
81
-
} satisfiesExportedHandler<Env>;
82
-
```
16
+
If an exception is thrown by a Durable Object stub all in-flight calls and future calls will fail with [exceptions](/durable-objects/observability/troubleshooting/). To continue invoking methods on a remote Durable Object instance a Worker must recreate the stub. There are no ordering guarantees between different stubs.
0 commit comments