Ich versuche, Funktionen im ami-io
npm-Paket zu überladen/zu ersetzen. Dieses Paket wurde erstellt, um mit asterisk AMI, einer Socket-Schnittstelle, zu kommunizieren.Einige Funktionen in einem öffentlichen npm-Paket ändern
Ich muss mit einem Dienst sprechen, der fast die exakt gleiche Schnittstelle hat, aber es zeigt eine andere Begrüßung bei der Anmeldung, und es erfordert ein zusätzliches Feld in der Anmeldung. Der ganze Rest ist gleich. Anstatt einfach das 600 LOC ami-io
Paket zu kopieren und zwei oder drei Zeilen zu ändern, möchte ich die Funktion außer Kraft setzen, die die Grußzeichenfolge und die Login-Funktion erkennt und weiterhin das ami-io
Paket verwendet.
Im Inneren des ami-io
Paket gibt es eine Datei index.js
, die die folgende Funktion enthält:
Client.prototype.auth = function (data) {
this.logger.debug('First message:', data);
if (data.match(/Asterisk Call Manager/)) {
this._setVersion(data);
this.socket.on('data', function (data) {
this.splitMessages(data);
}.bind(this));
this.send(new Action.Login(this.config.login, this.config.password), function (error, response) {
if (response && response.response === 'Success') this.emit('connected');
else this.emit('incorrectLogin');
}.bind(this));
} else {
this.emit('incorrectServer', data);
}
};
Jetzt möchte ich auf Asterisk Call Manager
nicht übereinstimmen, aber auf MyService
, und ich will und Action.LoginExt(this.config.login, this.config.password)
mit einem anderen verwenden definieren mit einem zusätzlichen Parameter.
Ist das möglich? Ich habe versucht, dies in meinem eigenen Modul:
var AmiIo = require('ami-io');
var amiio = AmiIo.createClient({port:5038, host:'x.x.x.x', login:'system', password:'admin'});
amiio.prototype.auth = function (data) {
this.logger.debug('First message:', data);
if (data.match(/MyService Version/)) {
this._setVersion(data);
this.socket.on('data', function (data) {
this.splitMessages(data);
}.bind(this));
this.send(new Action.LoginExt(this.config.login, this.config.password, this.config.extra), function (error, response) {
if (response && response.response === 'Success') this.emit('connected');
else this.emit('incorrectLogin');
}.bind(this));
} else {
this.emit('incorrectServer', data);
}
};
... aber es führte zu TypeError: Cannot set property 'auth' of undefined
, und jetzt ist ich ratlos. Kann ich auch ein neues Action.LoginExt
Objekt in meinem eigenen Modul definieren? Wie?
Das action.js Modul definiert die Aktion Objekte wie folgt:
function Action(name) {
Action.super_.bind(this)();
this.id = this.getId();
this.set('ActionID', this.id);
this.set('Action', name);
}
(function(){
var Message = require('./message.js');
var util = require('util');
util.inherits(Action, Message);
})();
Action.prototype.getId = (function() {
var id = 0;
return function() {
return ++id;
}
})();
function Login(username, secret) {
Login.super_.bind(this, 'Login')();
this.set('Username', username);
this.set('Secret', secret);
}
... more functions ...
(function() {
var actions = [
Login,
... more functions ...
];
var util = require('util');
for (var i = 0; i < actions.length; i++) {
util.inherits(actions[i], Action);
exports[actions[i].name] = actions[i];
}
exports.Action = Action;
})();
Was ich glaube, ich verstehe, dass Aktion von Nachricht subclassed ist. Die Login-Funktion wird wiederum von Action abgeleitet und exportiert (im letzten Codeblock). So denke ich meinen Code in ich etwas ähnliches versuchen könnte:
// extend ami-io with LoginExt function
function LoginExt(username, secret, company) {
Login.super_.bind(this, 'LoginExt')();
this.set('Username', username);
this.set('Secret', secret);
this.set('Company', company);
}
var util = require('util');
util.inherits(LoginExt, amiio.Action);
Aber util.inherits mit undefinierten ausfällt. Ich habe auch ein Problem bei ami-io eröffnet.
Danke. Es ist so einfach. Ich bin jetzt mit dem Wrestling beim Hinzufügen/Erweitern einer Action beschäftigt. Es könnte tatsächlich einfacher sein, das Modul selbst zu modifizieren, aber dann muss ich es in meine eigene Codebasis ziehen, die technische Schulden generiert. Oder ... fork es, benenne es um und lege es in den NPM-Repo. Für nur ein paar Zeilen Code ... – raarts