Skip to content

Commit ca84ed3

Browse files
committed
dev: meta driver with usages method
1 parent 20ba064 commit ca84ed3

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

src/backend/src/services/drivers/DriverService.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,44 @@ class DriverService extends BaseService {
4141
types: require('./types'),
4242
}
4343

44+
// 'IMPLEMENTS' here makes DriverService itself a driver
45+
static IMPLEMENTS = {
46+
driver: {
47+
async usage () {
48+
const actor = Context.get('actor');
49+
50+
const usages = {
51+
user: {}, // map[str(iface:method)]{date,count,max}
52+
apps: {}, // []{app,map[str(iface:method)]{date,count,max}}
53+
app_objects: {},
54+
usages: [],
55+
};
56+
57+
const event = {
58+
actor,
59+
usages: [],
60+
};
61+
const svc_event = this.services.get('event');
62+
await svc_event.emit('usages.query', event);
63+
usages.usages = event.usages;
64+
65+
66+
for ( const k in usages.apps ) {
67+
usages.apps[k] = Object.values(usages.apps[k]);
68+
}
69+
70+
return {
71+
// Usage endpoint reports these, but the driver doesn't need to
72+
// user: Object.values(usages.user),
73+
// apps: usages.apps,
74+
// app_objects: usages.app_objects,
75+
76+
// This is the main "usages" object
77+
usages: usages.usages,
78+
};
79+
}
80+
}
81+
}
4482

4583
_construct () {
4684
this.drivers = {};
@@ -126,6 +164,26 @@ class DriverService extends BaseService {
126164
{ col_drivers });
127165
}
128166

167+
// This is a bit meta: we register the "driver" driver interface.
168+
// This allows DriverService to be a driver called "driver".
169+
// The driver drivers allows checking metered usage for drivers,
170+
// and in the future may provide other driver-related functions.
171+
async ['__on_driver.register.interfaces'] () {
172+
const svc_registry = this.services.get('registry');
173+
const col_interfaces = svc_registry.get('interfaces');
174+
175+
col_interfaces.set('driver', {
176+
description: 'provides functions for managing Puter drivers',
177+
methods: {
178+
usage: {
179+
description: 'get usage information for drivers',
180+
parameters: {},
181+
result: { type: 'json' },
182+
}
183+
}
184+
});
185+
}
186+
129187
register_driver (interface_name, implementation) {
130188
this.interface_to_implementation[interface_name] = implementation;
131189
}

0 commit comments

Comments
 (0)