acp-js
v0.1.0
Published
This project provides a JavaScript/TypeScript implementation of the SourceHub Access Control Policy (ACP) interface using the `sourcehub-wallet-js` library for signing.
Readme
SourceHub ACP JavaScript/TypeScript Implementation
This project provides a JavaScript/TypeScript implementation of the SourceHub Access Control Policy (ACP) interface using the sourcehub-wallet-js library for signing.
Overview
The SourceHub ACP system allows for the management of policies, objects, and actor relationships. This implementation provides a client interface to interact with the SourceHub ACP system, enabling operations such as adding policies, registering objects, and managing actor relationships.
Features
- Policy Management: Add and query policies.
- Object Management: Register objects and query object ownership.
- Access Control: Verify access requests for actors.
- Actor Relationships: Add and delete actor relationships.
Installation
To install the project, clone the repository and install the dependencies:
git clone <repository-url>
cd <repository-directory>
yarn installConfiguration
The library uses the following environment variables for configuration:
SOURCEHUB_API_URL- API endpoint URL (default:http://localhost:1317)SOURCEHUB_RPC_URL- RPC endpoint URL (default:http://localhost:26657)SOURCEHUB_GRPC_URL- gRPC endpoint URL (default:http://localhost:9090)SOURCEHUB_CHAIN_ID- Chain ID (default:sourcehub-dev)SOURCEHUB_DENOM- Denomination (default:uopen)
Creating a Client
To create a new SourceHubACP client, use the static create method:
import { SourceHubACP } from 'sourcehub-acp-js';
async function createClient() {
const rpcUrl = 'https://rpc-endpoint';
const grpcUrl = 'https://grpc-endpoint';
const chainId = 'sourcehub-dev';
const denom = 'uopen';
const client = await SourceHubACP.create(rpcUrl, grpcUrl, chainId, denom);
return client;
}Adding a Policy
To add a new policy:
const policy = 'policy-string';
const marshalType = 1;
try {
const policyID = await client.addPolicy(policy, marshalType);
console.log(`Policy created with ID: ${policyID}`);
} catch (error) {
console.error('Error creating policy:', error);
}Registering an Object
To register an object:
const identity = { bearerToken: 'bearer-token' };
const policyID = 'policy-id';
const resourceName = 'resource-name';
const objectID = 'object-id';
try {
await client.registerObject(identity, policyID, resourceName, objectID);
console.log(`Object registered: ${objectID}`);
} catch (error) {
console.error('Error registering object:', error);
}Verifying Access
To verify an access request:
const permission = 'permission';
const actorID = 'actor-id';
const policyID = 'policy-id';
const resourceName = 'resource-name';
const objectID = 'object-id';
const isValid = await client.verifyAccessRequest(permission, actorID, policyID, resourceName, objectID);
console.log(`Access is ${isValid ? 'granted' : 'denied'}`);Managing Actor Relationships
To add an actor relationship:
const relation = 'relation';
const targetActor = 'target-actor';
try {
const success = await client.addActorRelationship(policyID, resourceName, objectID, relation, identity, targetActor);
console.log(`Actor relationship added: ${targetActor}`);
} catch (error) {
console.error('Error adding actor relationship:', error);
}To delete an actor relationship:
try {
const success = await client.deleteActorRelationship(policyID, resourceName, objectID, relation, identity, targetActor);
console.log(`Actor relationship deleted: ${targetActor}`);
} catch (error) {
console.error('Error deleting actor relationship:', error);
}Testing
To run the tests, use the following command:
yarn test