From 4a1b2104798ac4a3b1e57cf02b45e39f9b36dd4d Mon Sep 17 00:00:00 2001 From: ivanauth Date: Tue, 2 Jun 2026 10:58:44 -0400 Subject: [PATCH 1/2] docs: add ReadRelationships and DeleteRelationships examples ReadRelationships is server-streaming, so the example uses the promise client which buffers the stream into an array. DeleteRelationships takes a RelationshipFilter (not a Relationship), so the example shows how to combine resource and subject filters to scope a delete to a single relationship. --- examples/v1/example.js | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/examples/v1/example.js b/examples/v1/example.js index 126506d..a9a08ab 100644 --- a/examples/v1/example.js +++ b/examples/v1/example.js @@ -105,3 +105,49 @@ const lookupResourcesRequest = v1.LookupResourcesRequest.create({ const results = await promiseClient.lookupResources(lookupResourcesRequest); console.log(results); + +// Read all relationships for a resource type, optionally filtered by relation +// and/or a specific resource ID. ReadRelationships is a server-streaming RPC; +// the promise client buffers the stream and returns all results as an array. +const readRelationshipsRequest = v1.ReadRelationshipsRequest.create({ + consistency: v1.Consistency.create({ + requirement: { + oneofKind: "fullyConsistent", + fullyConsistent: true, + }, + }), + relationshipFilter: v1.RelationshipFilter.create({ + resourceType: "test/document", + optionalResourceId: "somedocument", + optionalRelation: "viewer", + }), +}); + +const readRelationshipsResult = await promiseClient.readRelationships(readRelationshipsRequest); + +console.log(readRelationshipsResult); + +// Delete relationships matching a filter. Note that DeleteRelationships takes +// a RelationshipFilter, not a Relationship — to delete a single specific +// relationship, fill in resourceType, optionalResourceId, optionalRelation, +// and optionalSubjectFilter so the filter matches exactly one row. +const deleteRelationshipsRequest = v1.DeleteRelationshipsRequest.create({ + relationshipFilter: v1.RelationshipFilter.create({ + resourceType: "test/document", + optionalResourceId: "somedocument", + optionalRelation: "viewer", + optionalSubjectFilter: v1.SubjectFilter.create({ + subjectType: "test/user", + optionalSubjectId: "fred", + }), + }), +}); + +const deleteRelationshipsResult = await new Promise((resolve, reject) => { + client.deleteRelationships(deleteRelationshipsRequest, function (err, response) { + if (err) reject(err); + resolve(response); + }); +}); + +console.log(deleteRelationshipsResult); From af9a449aba5fa574dff34f60932955bb71465ab2 Mon Sep 17 00:00:00 2001 From: ivanauth Date: Tue, 2 Jun 2026 11:57:19 -0400 Subject: [PATCH 2/2] refactor: use promiseClient consistently in example.js All RPC examples now go through the promise-wrapped client for a uniform async/await style, instead of mixing manual Promise wrappers around the callback client with promiseClient calls. --- examples/v1/example.js | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/examples/v1/example.js b/examples/v1/example.js index a9a08ab..2e094c4 100644 --- a/examples/v1/example.js +++ b/examples/v1/example.js @@ -15,12 +15,7 @@ const writeRequest = v1.WriteSchemaRequest.create({ }); // Write a schema. -await new Promise((resolve, reject) => { - client.writeSchema(writeRequest, function (err, response) { - if (err) reject(err); - resolve(response); - }); -}); +await promiseClient.writeSchema(writeRequest); // Write a relationship. const writeRelationshipRequest = v1.WriteRelationshipsRequest.create({ @@ -44,12 +39,7 @@ const writeRelationshipRequest = v1.WriteRelationshipsRequest.create({ ], }); -await new Promise((resolve, reject) => { - client.writeRelationships(writeRelationshipRequest, function (err, response) { - if (err) reject(err); - resolve(response); - }); -}); +await promiseClient.writeRelationships(writeRelationshipRequest); // Check a permission. const checkPermissionRequest = v1.CheckPermissionRequest.create({ @@ -72,12 +62,7 @@ const checkPermissionRequest = v1.CheckPermissionRequest.create({ }), }); -const checkResult = await new Promise((resolve, reject) => { - client.checkPermission(checkPermissionRequest, function (err, response) { - if (err) reject(err); - resolve(response); - }); -}); +const checkResult = await promiseClient.checkPermission(checkPermissionRequest); console.log( checkResult.permissionship === v1.CheckPermissionResponse_Permissionship.HAS_PERMISSION, @@ -143,11 +128,8 @@ const deleteRelationshipsRequest = v1.DeleteRelationshipsRequest.create({ }), }); -const deleteRelationshipsResult = await new Promise((resolve, reject) => { - client.deleteRelationships(deleteRelationshipsRequest, function (err, response) { - if (err) reject(err); - resolve(response); - }); -}); +const deleteRelationshipsResult = await promiseClient.deleteRelationships( + deleteRelationshipsRequest, +); console.log(deleteRelationshipsResult);