blob: f9df7c27212725ef7b2099f5dfc4e6fe4752d626 [file] [log] [blame]
################################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################
from messages_pb2 import LoginEvent
from messages_pb2 import SeenCount
from statefun import StatefulFunctions
from statefun import StateSpec
from statefun import RequestReplyHandler
from statefun import kafka_egress_record
functions = StatefulFunctions()
@functions.bind(
typename="k8s-demo/greeter",
states=[StateSpec('seen_count')])
def greet(context, message: LoginEvent):
state = context.state('seen_count').unpack(SeenCount)
if not state:
state = SeenCount()
state.seen = 1
else:
state.seen += 1
context.state('seen_count').pack(state)
egress_message = kafka_egress_record(topic="seen", key=message.user_name, value=state)
context.pack_and_send_egress("k8s-demo/greets-egress", egress_message)
handler = RequestReplyHandler(functions)
#
# Serve the endpoint
#
from flask import request
from flask import make_response
from flask import Flask
app = Flask(__name__)
@app.route('/statefun', methods=['POST'])
def handle():
response_data = handler(request.data)
response = make_response(response_data)
response.headers.set('Content-Type', 'application/octet-stream')
return response
if __name__ == "__main__":
app.run()