mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
/*
|
|
* Copyright IBM Corp. All Rights Reserved.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
'use strict';
|
|
const State = require('./state.js');
|
|
|
|
/**
|
|
* StateList provides a named virtual container for a set of ledger states.
|
|
* Each state has a unique key which associates it with the container, rather
|
|
* than the container containing a link to the state. This minimizes collisions
|
|
* for parallel transactions on different states.
|
|
*/
|
|
class StateList {
|
|
|
|
/**
|
|
* Store Fabric context for subsequent API access, and name of list
|
|
*/
|
|
constructor(ctx, listName) {
|
|
this.ctx = ctx;
|
|
this.name = listName;
|
|
this.supportedClasses = {};
|
|
|
|
}
|
|
|
|
/**
|
|
* Add a state to the list. Creates a new state in worldstate with
|
|
* appropriate composite key. Note that state defines its own key.
|
|
* State object is serialized before writing.
|
|
*/
|
|
async addState(state) {
|
|
let key = this.ctx.stub.createCompositeKey(this.name, state.getSplitKey());
|
|
let data = State.serialize(state);
|
|
await this.ctx.stub.putState(key, data);
|
|
}
|
|
|
|
/**
|
|
* Get a state from the list using supplied keys. Form composite
|
|
* keys to retrieve state from world state. State data is deserialized
|
|
* into JSON object before being returned.
|
|
*/
|
|
async getState(key) {
|
|
let ledgerKey = this.ctx.stub.createCompositeKey(this.name, State.splitKey(key));
|
|
let data = await this.ctx.stub.getState(ledgerKey);
|
|
if (data && data.toString('utf8')) {
|
|
let state = State.deserialize(data, this.supportedClasses);
|
|
return state;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update a state in the list. Puts the new state in world state with
|
|
* appropriate composite key. Note that state defines its own key.
|
|
* A state is serialized before writing. Logic is very similar to
|
|
* addState() but kept separate becuase it is semantically distinct.
|
|
*/
|
|
async updateState(state) {
|
|
let key = this.ctx.stub.createCompositeKey(this.name, state.getSplitKey());
|
|
let data = State.serialize(state);
|
|
await this.ctx.stub.putState(key, data);
|
|
}
|
|
|
|
/** Stores the class for future deserialization */
|
|
use(stateClass) {
|
|
this.supportedClasses[stateClass.getClass()] = stateClass;
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = StateList;
|