---
# System prepended metadata

title: Web5 JS DWN Methods - Simplified Version

---

# Web5 JS DWN Methods - Simplified Version

### Default to local/agent DWN

For all of the methods, the default is to target your agent's DWN - the DWN of the agent the application is _connected_ to.  The belief/intent was to simplify the most trivial getting started cause where an individual may not have much knowledge of Web5 / DWN terminology yet.  By defaulting to local/agent, there is no need to introduce the idea of agents and multiple DWNs right away.

However, the case might be made that this implicit default ends up leading to more confusion in the long run.   If there's a strong opinion in the direction of making it an explicit choice, then we can make `store` a required property and `store: 'agent'` will then have to be specified on all local writes.

---

### `write()` / `create()`

All 15 permutations are possible, but to keep this short, I'll highlight 7 of what I am expecting will the most common scenarios.  Remains to be seen and we won't really know is this hunch is correct or dead wrong.  However, worst case this approach works for all 15.

Intuition that this is > 50% of the use cases:
- if local, always send first
- if remote, always send after local
- if another DID, always send after local and remote

and even if its not, again, we've got all 15 scenarios covered.  If its 2 remote DID parties then the permutations increase but they can still all be covered.

**A. Your own local:**
```typescript=
// write to your agent's dwn (aka write to the dwn of the agent an app is _connected_ to)
await web5.dwn.records.create({
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});
```

**B. Your own local + your own remote:**
```typescript=
// write to your agent's dwn
const { record } = await web5.dwn.records.create({
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

// write to your DID-relative dwns (a.k.a cloud dwns)
await record.send(aliceDid)
```

**C. Your own local + your own remote + someone else's remote:**
```typescript=
// write to your agent's dwn
const { record } = await web5.dwn.records.create({
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

// write to your DID-relative dwns (a.k.a cloud dwns)
await record.send(aliceDid);

// write to Bob's DWN
await record.send(bobDid);
```

**D. Your own local + someone else's remote:**
```typescript=
// write to your agent's dwn
const { record } = await web5.dwn.records.create({
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

// write to Bob's DWN
await record.send(bobDid);
```

**E. Your own remote + someone else's remote:**
```typescript=
// write to your DID-relative dwns (a.k.a cloud dwns)
const { record } = await web5.dwn.records.create({
  store: false,
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

// write to Bob's DWN
await record.send(alicDid);
await record.send(bobDid);
```

**F. Your own remote:**
```typescript=
// write to your DID-relative dwns (a.k.a cloud dwns)
await web5.dwn.records.create({
  store: false,
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

await record.send(alicDid);
```

**G. Someone else's remote:**

While I understand `store: false` may illicit some raised eyebrows, part of the aspect of
this that I think is a useful affordance is that it requires that the application
explicitly specify that the record is **NOT** to be retained by the sending entity **UNLESS**
a subsequent invocation of `record.store()` is performed.

An alternative is to not store the record in any of the active DID's DWNs if the `store` property is left undefined, but this _seems_ worse in terms of unexpected consequences.

```typescript=
// write to your agent's dwn
const { record } = await web5.dwn.records.create({
  store: false,
  data: 'hi',
  message: {
    "schema": 'whatever'
  }
});

// write to Bob's DWN
record.send(bobDid);
```
---

### How about record encryption?

We've received feedback from within team TBD and community members on Discord that the following example:

```typescript
const { record, status } = await web5.dwn.records.create({
  to: bobDid,
  message: {
    "schema": 'whatever'
  },
  data: 'hi'
});
```

would be interpreted as taking the action: of "writing a record to bob's dwn", which it does not unless `record.send(bobDid)` is called, as in this example:

```typescript
// writes to your local / agent DWN
const { record, status } = await web5.dwn.records.create({
  message: {
    "schema": 'whatever'
  },
  data: 'hi'
});

// writes to Bob's DWN
record.send(bobDid);
```

To address this the examples above do not involve specifying `to: bobDid` within the `write()` / `create()` message options for all of the cases where encryption is not desired.

Instead, if the record is to be encrypted, the message would be:

```typescript
// writes to your local / agent DWN
const { record, status } = await web5.dwn.records.create({
  encryptFor: bobDid,
  message: {
    "schema": 'whatever'
  },
  data: 'hi'
});

// writes to Bob's DWN
record.send(bobDid);
```

The semantics of `encryptFor` then invovle both enabling encryption for the record and explicitly specifying who's public keys will be used such that `bobDid` will be the only one that can decrypt the record using a `bobDid` public key to first decrypt the symmetric key, and then using that symmetric key to decrypt the record data.

---

## All other `web5.dwn.*.*` methods

**Notes**
- `recipient {string}` specifies another DID's DWN to query/read/delete
  - If this term causes heart burn how about
    - `from` as in `QUERY FROM` / `READ FROM` / `DELETE FROM`
- `store {'agent' | 'endpoints'}` specifies which DWN to query/read/delete from

### `query()`

1. Your local
```typescript
web5.dwn.records.query({
  message: {
    filter: {
      contextId: thread.contextId
    }
  }
});
```

2. Your remote
```typescript
web5.dwn.records.query({
  recipient: aliceDid,
  message: {
    filter: {
      contextId: thread.contextId
    }
  }
});
```

3. Someone else's remote
```typescript
web5.dwn.records.query({
  recipient: bobDid,
  message: {
    filter: {
      contextId: thread.contextId
    }
  }
});
```

### `read()`

1. Your local
```typescript
web5.dwn.records.read({
  message: {
    recordId: thread.recordId
  }
});
```

2. Your remote
```typescript
web5.dwn.records.query({
  recipient: aliceDid,
  message: {
    recordId: thread.recordId
  }
});
```

3. Someone else's remote
```typescript
web5.dwn.records.query({
  recipient: bobDid,
  message: {
    recordId: thread.recordId
  }
});
```

### `delete()`

1. Your local
```typescript
web5.dwn.records.read({
  message: {
    recordId: thread.recordId
  }
});
```

2. Your remote
```typescript
web5.dwn.records.read({
  recipient: aliceDid,
  message: {
    recordId: thread.recordId
  }
});
```

3. Someone else's remote
```typescript
web5.dwn.records.read({
  recipient: bobDid,
  message: {
    recordId: thread.recordId
  }
});
```
